From 44af5cad10ff206a7aa471b48821d764afefcba0 Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Sat, 4 Apr 2026 22:36:37 -0500 Subject: [PATCH] feat: drill does drill, and there's a resource display --- crates/unified/assets/config/planets.pc.toml | 1 + crates/unified/src/client/crafting/ui.rs | 43 ++++++++++++---- crates/unified/src/server/drill.rs | 52 +++++++++++++++++++- crates/unified/src/server/player/join.rs | 8 +-- crates/unified/src/shared_plugins.rs | 3 +- 5 files changed, 93 insertions(+), 14 deletions(-) diff --git a/crates/unified/assets/config/planets.pc.toml b/crates/unified/assets/config/planets.pc.toml index a6a2b435c19fff8182eb6d09fae2f1ef950866ee..480b54c213fa5d450eb8408f6e570a5e100291cb 100644 --- a/crates/unified/assets/config/planets.pc.toml +++ b/crates/unified/assets/config/planets.pc.toml @@ -28,6 +28,7 @@ sprite = "textures/earth.png" indicator_sprite = "textures/earth_icon.png" radius = 2000.0 # m mass = 16_900_000_000.0 # kg +planet_resource = { name = "Carbon", color = { LinearRgba = { red = 1.0, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 2.0 } default_transform = [300_000.0, 0.0, 0.0] orbit = { orbiting = "Sun", eccentricity = 0.0167 } diff --git a/crates/unified/src/client/crafting/ui.rs b/crates/unified/src/client/crafting/ui.rs index 5648e2f86fffc73ca4281a2bc93fd8341b0eaf9c..94f71fe47f0226eeb2f6fb25bf942564c3f7f8da 100644 --- a/crates/unified/src/client/crafting/ui.rs +++ b/crates/unified/src/client/crafting/ui.rs @@ -1,9 +1,9 @@ use bevy::{input_focus::{AutoFocus, InputFocus}, ui::RelativeCursorPosition}; -use crate::{attachment::PartInShip, client::colors, ecs::{CanCraft, CraftingUi, Drill, MainCamera, Me, ToggleDrillEvent}, prelude::*}; +use crate::{attachment::PartInShip, client::colors, ecs::{CanCraft, CraftingUi, Drill, MainCamera, Me, Part, SingleStorage, ToggleDrillEvent}, prelude::*}; pub fn crafting_ui_plugin(app: &mut App) { - app.add_systems(Update, (close_button, drill_button, drill_state_change)); + app.add_systems(Update, (close_button, drill_button, drill_state_change, single_storage_display)); } #[derive(Component)] @@ -12,17 +12,18 @@ struct CloseButton(Entity); // stores corresponding menu entity struct PreviousInteraction(Interaction); #[derive(Component)] struct DrillButton(Entity); // stores corresponding part +#[derive(Component)] +struct SingleStorageDisplay(Entity); // stores corresponding part pub fn open_crafting_ui( ev: On>, - crafting_parts: Query<(Entity, &Transform), (With, With)>, - hearty: Query<(Entity, &Transform), (With, With)>, + crafting_parts: Query<(Entity, &Transform, Option<&Drill>, Option<&SingleStorage>), (With, With)>, + hearty: Query<(Entity, &Transform, Option<&Drill>, Option<&SingleStorage>), (With, With)>, camera: Single<(Entity, &Camera, &GlobalTransform), (With, Without)>, commands: Commands, - drills: Query<&Drill>, ) { if matches!(ev.button, PointerButton::Secondary) { - let (entity, transform) = if let Ok(part) = crafting_parts.get(ev.entity) { + let (entity, transform, drill, single_storage) = if let Ok(part) = crafting_parts.get(ev.entity) { part } else if let Ok(part) = hearty.get(ev.entity) { part @@ -31,7 +32,7 @@ pub fn open_crafting_ui( }; // we have our crafting entity! // now make the ui - setup_ui(entity, transform, commands, camera, drills); + setup_ui(entity, transform, commands, camera, drill, single_storage); } } @@ -40,7 +41,8 @@ fn setup_ui( parent_transform: &Transform, mut commands: Commands, camera: Single<(Entity, &Camera, &GlobalTransform), (With, Without)>, - drills: Query<&Drill>, + drill: Option<&Drill>, + single_storage: Option<&SingleStorage>, ) { let parent_pos = camera.1.world_to_viewport(camera.2, parent_transform.translation).unwrap(); let entity = commands.spawn(( @@ -83,7 +85,7 @@ fn setup_ui( )); }); // only add the drill button if the part is a drill - if let Ok(drill) = drills.get(parent_part) { + if let Some(drill) = drill { parent.spawn(( Node { width: Val::Px(100.0), @@ -109,6 +111,20 @@ fn setup_ui( )); }); } + // only add storage if the part has single storage + if let Some(single_storage) = single_storage { + parent.spawn(( + Node { + ..Default::default() + }, + TextFont { + font_size: 10.0, + ..Default::default() + }, + Text::new(format!("{}: {}", single_storage.resource_name, single_storage.stored)), + SingleStorageDisplay(parent_part), + )); + } }); } @@ -187,6 +203,15 @@ fn get_drill_text(drill: &Drill) -> String { "Drill not on planet".to_string() } } +fn single_storage_display( + mut single_storage_display_query: Query<(&mut Text, &SingleStorageDisplay)>, + part_query: Query<&SingleStorage, With>, +) { + for (mut text, single_storage_display) in &mut single_storage_display_query { + let single_storage = part_query.get(single_storage_display.0).expect("In single_storage_display, the entity didn't match a storage."); + **text = format!("{}: {}", single_storage.resource_name, single_storage.stored); + } +} fn close_button( mut commands: Commands, diff --git a/crates/unified/src/server/drill.rs b/crates/unified/src/server/drill.rs index 82e7d1125d60d65a97f70d71b0c8177ac0e3b000..90b5cb4d708d91fe4b47060fc8c8d6cfdde21904 100644 --- a/crates/unified/src/server/drill.rs +++ b/crates/unified/src/server/drill.rs @@ -1,4 +1,4 @@ -use crate::{attachment::{PartInShip, Parts}, config::planet::Planet, ecs::{Drill, Part, PlanetSensor, SingleStorage, ToggleDrillEvent}, prelude::*}; +use crate::{attachment::{PartInShip, Parts}, config::planet::Planet, ecs::{Drill, Part, PlanetSensor, Player, SingleStorage, ToggleDrillEvent}, prelude::*}; pub fn drill_plugin(app: &mut App) { app.add_systems(Update, (toggle_drill, drill_on_planet, do_drilling)); @@ -47,12 +47,62 @@ fn drill_on_planet( fn do_drilling( drills: Query<(&Drill, &PartInShip)>, + hearty_drills: Query<(Entity, &Drill), With>, parts_query: Query<&Parts>, mut storage_part_query: Query<&mut SingleStorage, With>, planet_query: Query<&Planet>, time: Res