M crates/unified/assets/config/planets.pc.toml => crates/unified/assets/config/planets.pc.toml +1 -0
@@ 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 }
M crates/unified/src/client/crafting/ui.rs => crates/unified/src/client/crafting/ui.rs +34 -9
@@ 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<Pointer<Press>>,
- crafting_parts: Query<(Entity, &Transform), (With<PartInShip>, With<CanCraft>)>,
- hearty: Query<(Entity, &Transform), (With<Me>, With<CanCraft>)>,
+ crafting_parts: Query<(Entity, &Transform, Option<&Drill>, Option<&SingleStorage>), (With<PartInShip>, With<CanCraft>)>,
+ hearty: Query<(Entity, &Transform, Option<&Drill>, Option<&SingleStorage>), (With<Me>, With<CanCraft>)>,
camera: Single<(Entity, &Camera, &GlobalTransform), (With<MainCamera>, Without<PartInShip>)>,
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<MainCamera>, Without<PartInShip>)>,
- 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<Part>>,
+) {
+ 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,
M crates/unified/src/server/drill.rs => crates/unified/src/server/drill.rs +51 -1
@@ 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<Player>>,
parts_query: Query<&Parts>,
mut storage_part_query: Query<&mut SingleStorage, With<Part>>,
planet_query: Query<&Planet>,
time: Res<Time>,
) {
+ for (entity, drill) in hearty_drills {
+ if !drill.drilling || drill.on_planet.is_none() {
+ continue
+ }
+ let planet_name = drill.on_planet.clone().unwrap();
+ let mut planet = None;
+ for q_planet in planet_query {
+ if q_planet.name == planet_name {
+ planet = Some(q_planet);
+ break;
+ }
+ }
+ // if the planet name doesn't match a planet, we have a big problem
+ let planet = planet.expect("In do_drilling, a planet name didn't match a planet");
+ let Some(ref planet_resource) = planet.planet_resource else {
+ continue
+ };
+ 'adding_resources: {
+ if let Ok(parts_list) = parts_query.get(entity) {
+ for part_entity in parts_list.iter() {
+ let Ok(mut storage) = storage_part_query.get_mut(part_entity) else {
+ continue
+ };
+ if storage.resource_name.is_empty() {
+ storage.resource_name = planet_resource.name.clone();
+ }
+ // now that the name isn't empty, this will trigger
+ if storage.resource_name == planet_resource.name {
+ storage.stored += planet_resource.mining_speed * drill.resource_multiplier * time.delta_secs();
+ storage.stored = storage.stored.min(storage.capacity);
+ break 'adding_resources;
+ }
+ }
+ }
+ let Ok(mut storage) = storage_part_query.get_mut(entity) else {
+ break 'adding_resources;
+ };
+ if storage.resource_name.is_empty() {
+ storage.resource_name = planet_resource.name.clone();
+ }
+ // now that the name isn't empty, this will trigger
+ if storage.resource_name == planet_resource.name {
+ storage.stored += planet_resource.mining_speed * drill.resource_multiplier * time.delta_secs();
+ storage.stored = storage.stored.min(storage.capacity);
+ break 'adding_resources;
+ }
+ };
+ }
for (drill, part_in_ship) in drills {
+ debug!("drill");
if !drill.drilling || drill.on_planet.is_none() {
continue
}
M crates/unified/src/server/player/join.rs => crates/unified/src/server/player/join.rs +5 -3
@@ 1,3 1,4 @@
+use crate::attachment::PartInShip;
use crate::config::planet::Planet;
use crate::config::world::GlobalWorldConfig;
use crate::ecs::{Hi, Player, PlayerStorage};
@@ 32,9 33,10 @@ fn join_player(joined_player: Entity, mut commands: Commands, wc: &GlobalWorldCo
info!(?new_transform, ?joined_player, "set player's position!");
- commands
- .entity(joined_player)
- .insert(new_transform)
+ let mut entity = commands
+ .entity(joined_player);
+ let id = entity.id();
+ entity.insert(new_transform)
.insert(SpawnPartRequest(
asset_server.load("config/parts/hearty.part.toml"),
))
M crates/unified/src/shared_plugins.rs => crates/unified/src/shared_plugins.rs +2 -1
@@ 1,6 1,6 @@
use crate::attachment::{Joint, JointOf, PartInShip, Peer, Ship, SnapOf, SnapOfJoint};
use crate::config::planet::{Planet, PlanetConfigCollection};
-use crate::ecs::{CanCraft, DragRequestEvent, Drill, Hi, Part, Particles, Player, PlayerStorage, Temperature, ToggleDrillEvent};
+use crate::ecs::{CanCraft, DragRequestEvent, Drill, Hi, Part, Particles, Player, PlayerStorage, SingleStorage, Temperature, ToggleDrillEvent};
use bevy::app::{App, PluginGroup, PluginGroupBuilder};
use bevy_common_assets::toml::TomlAssetPlugin;
use crate::prelude::*;
@@ 56,6 56,7 @@ pub fn register_everything(app: &mut App) {
app.replicate::<CanCraft>();
app.replicate::<Temperature>();
app.replicate::<Drill>();
+ app.replicate::<SingleStorage>();
}
fn physics_setup_plugin(app: &mut App) {