From 11e8a560ca3014cf9edbaacaf41d2818fdaabc3d Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Tue, 7 Apr 2026 10:58:49 -0500 Subject: [PATCH] feat: crafting buttons cause parts to spawn --- .../assets/config/parts/frame.part.toml | 32 +++++++++++++++++++ .../assets/config/parts/thruster.part.toml | 9 ++---- crates/unified/assets/config/planets.pc.toml | 2 +- crates/unified/src/client/crafting/ui.rs | 8 ++++- crates/unified/src/ecs.rs | 8 +++++ crates/unified/src/server/craft.rs | 25 +++++++++++++++ crates/unified/src/server/mod.rs | 3 ++ crates/unified/src/shared_plugins.rs | 3 +- 8 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 crates/unified/assets/config/parts/frame.part.toml create mode 100644 crates/unified/src/server/craft.rs diff --git a/crates/unified/assets/config/parts/frame.part.toml b/crates/unified/assets/config/parts/frame.part.toml new file mode 100644 index 0000000000000000000000000000000000000000..dc95f0b70f7fcf2141df6699eeaae29dc61013d3 --- /dev/null +++ b/crates/unified/assets/config/parts/frame.part.toml @@ -0,0 +1,32 @@ +[part] +name = "Frame" +sprite_connected = "textures/hub_on.png" +sprite_disconnected = "textures/hub_off.png" +emissivity = 0.1 +specific_heat = 500.0 +radiation_area = 20.0 + +[physics] +width = 50 +height = 50 +mass = 10 + +[[joint]] +id = "Top" +target = { translation = [ 0.0, 55.0, 0.0 ], rotation = 0.0 } +snap = { translation = [ 0.0, 25.0, 0.0 ], rotation = 0.0 } + +[[joint]] +id = "Right" +target = { translation = [ 55.0, 0.0, 0.0 ], rotation = -90.0 } +snap = { translation = [ 25.0, 0.0, 0.0 ], rotation = 0.0 } + +[[joint]] +id = "Bottom" +target = { translation = [ 0.0, -55.0, 0.0 ], rotation = -180.0 } +snap = { translation = [ 0.0, -25.0, 0.0 ], rotation = 0.0 } + +[[joint]] +id = "Left" +target = { translation = [ -55.0, 0.0, 0.0 ], rotation = -270.0 } +snap = { translation = [ -25.0, 0.0, 0.0 ], rotation = 0.0 } diff --git a/crates/unified/assets/config/parts/thruster.part.toml b/crates/unified/assets/config/parts/thruster.part.toml index ef1b19cce46dcef40cd5e30033f64b5f6860e873..a273d5144b58a0afed534ce0538e57f5c3f62644 100644 --- a/crates/unified/assets/config/parts/thruster.part.toml +++ b/crates/unified/assets/config/parts/thruster.part.toml @@ -2,6 +2,9 @@ name = "Thruster" sprite_connected = "textures/thruster_on.png" sprite_disconnected = "textures/thruster_off.png" +emissivity = 0.1 +specific_heat = 500.0 +radiation_area = 20.0 [physics] width = 50 @@ -17,9 +20,3 @@ thrust_vector = [ 0.0, -20000.0 ] id = "Top" target = { translation = [ 0.0, 55.0, 0.0 ], rotation = 0.0 } snap = { translation = [ 0.0, 25.0, 0.0 ], rotation = 0.0 } - -[crafting] -can_craft = false - -[[crafting.recipe]] -inputs = { iron = 25 } diff --git a/crates/unified/assets/config/planets.pc.toml b/crates/unified/assets/config/planets.pc.toml index 480b54c213fa5d450eb8408f6e570a5e100291cb..b3208a3f688f66ca61974d12870954e744123a21 100644 --- a/crates/unified/assets/config/planets.pc.toml +++ b/crates/unified/assets/config/planets.pc.toml @@ -39,7 +39,7 @@ indicator_sprite = "textures/moon_icon.png" radius = 545.4 # m mass = 360_236_000.0 # kg default_transform = [312_700.0, 0.0, 0.0] -planet_resource = { name = "Silicon", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 2.0 } +planet_resource = { name = "Silicon", color = { LinearRgba = { red = 0.7, green = 0.7, blue = 0.7, alpha = 1.0 } }, mining_speed = 5.0 } orbit = { orbiting = "Earth", eccentricity = 0.0549 } [[planets]] diff --git a/crates/unified/src/client/crafting/ui.rs b/crates/unified/src/client/crafting/ui.rs index f7f447bead9242430e9808fae6c2124a199281c6..d8ce833a0bbc2eb9eafbc441e45538fe9ce4aef0 100644 --- a/crates/unified/src/client/crafting/ui.rs +++ b/crates/unified/src/client/crafting/ui.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use bevy::{input_focus::{AutoFocus, InputFocus}, ui::RelativeCursorPosition}; -use crate::{attachment::PartInShip, client::colors, config::recipe::RecipesConfig, ecs::{CanCraft, CraftingUi, Drill, MainCamera, Me, Part, SingleStorage, ToggleDrillEvent}, prelude::*}; +use crate::{attachment::PartInShip, client::colors, config::recipe::RecipesConfig, ecs::{CanCraft, CraftPartRequest, CraftingUi, Drill, MainCamera, Me, Part, SingleStorage, ToggleDrillEvent}, prelude::*}; pub fn crafting_ui_plugin(app: &mut App) { app.init_resource::(); @@ -243,6 +243,7 @@ fn create_recipe_list( fn recipe_buttons( mut interaction_query: Query<(&Interaction, &mut PreviousInteraction, &mut BackgroundColor, &RecipeElement), Changed>, + mut crafting_message_writer: MessageWriter, ) { for (interaction, mut previous_interaction, mut color, recipe) in &mut interaction_query { match *interaction { @@ -254,6 +255,11 @@ fn recipe_buttons( if previous_interaction.0 == Interaction::Pressed { // released debug!("{:?} {} {:?}", recipe.0, recipe.1, recipe.2); + crafting_message_writer.write(CraftPartRequest { + crafting_part: recipe.0, + crafted_part: recipe.1.clone(), + inputs: recipe.2.clone(), + }); } } Interaction::None => { diff --git a/crates/unified/src/ecs.rs b/crates/unified/src/ecs.rs index 5b14bb5866c94884277e22632a3d66173bf24df7..40ee0af877be6b2628e9199d7331832f15615f69 100644 --- a/crates/unified/src/ecs.rs +++ b/crates/unified/src/ecs.rs @@ -8,6 +8,7 @@ use crate::prelude::*; use bevy_replicon::prelude::Replicated; use serde::{Deserialize, Serialize}; use avian2d::prelude::*; +use std::collections::HashMap; use std::sync::LazyLock; #[derive(States, Debug, Clone, PartialEq, Eq, Hash)] @@ -117,6 +118,13 @@ pub struct Hi { pub struct CanCraft; #[derive(Component, Serialize, Deserialize, Debug)] pub struct CraftingUi; +#[derive(Message, Serialize, Deserialize, Debug, Clone, MapEntities)] +pub struct CraftPartRequest { + #[entities] + pub crafting_part: Entity, + pub crafted_part: String, + pub inputs: HashMap, +} #[derive(Component, Serialize, Deserialize, Debug)] #[require(Replicated)] diff --git a/crates/unified/src/server/craft.rs b/crates/unified/src/server/craft.rs new file mode 100644 index 0000000000000000000000000000000000000000..07e220fcd48d59eff1c6b9224d3f65e8f894d480 --- /dev/null +++ b/crates/unified/src/server/craft.rs @@ -0,0 +1,25 @@ +use crate::{ecs::{CraftPartRequest, Part}, prelude::*, server::part::{SpawnPartBundle, SpawnPartRequest}}; + +pub fn craft_plugin(app: &mut App) { + app.add_systems(Update, receive_crafting_request); +} + +fn receive_crafting_request( + mut craft_part_request: MessageReader>, + mut part_query: Query<(&Transform, &Part)>, + mut commands: Commands, + asset_server: Res, +) { + for request in craft_part_request.read() { + let Ok((transform, part)) = part_query.get(request.crafting_part) else { + warn!("When receiving a crafting request, the crafting part didn't exist."); + continue; + }; + + commands.spawn(SpawnPartBundle { + req: SpawnPartRequest(asset_server.load( + format!("config/parts/{}.part.toml", request.crafted_part.to_lowercase()))), + transform: transform.with_translation(transform.translation + vec3(50.0, 0.0, 0.0)), + }); + } +} diff --git a/crates/unified/src/server/mod.rs b/crates/unified/src/server/mod.rs index 84e990af336bea5654cead8bdf52a7de18729519..ea4fa25c38faceb507212c7cd179e62cc2d9892f 100644 --- a/crates/unified/src/server/mod.rs +++ b/crates/unified/src/server/mod.rs @@ -3,10 +3,12 @@ mod gravity; mod part; mod heat; mod drill; +mod craft; pub mod planets; pub mod player; mod system_sets; +use crate::server::craft::craft_plugin; use crate::server::drill::drill_plugin; use crate::server::earth_parts::spawn_parts_plugin; use crate::server::gravity::newtonian_gravity_plugin; @@ -58,6 +60,7 @@ impl Plugin for ServerPlugin { .add_plugins(heat_radiation_plugin) .add_plugins(heat_conduction_plugin) .add_plugins(drill_plugin) + .add_plugins(craft_plugin) .configure_sets(Update, WorldUpdateSet.before(PlayerInputSet)); //.configure_sets(Update, PlayerInputSet.before(PhysicsSet::SyncBackend)); } diff --git a/crates/unified/src/shared_plugins.rs b/crates/unified/src/shared_plugins.rs index 74f262fe9dcc8db3792ca409abbbe0e1bbdb04a1..e536a9aeb63a87d8fa9bfbbaecc037051067a697 100644 --- a/crates/unified/src/shared_plugins.rs +++ b/crates/unified/src/shared_plugins.rs @@ -1,7 +1,7 @@ use crate::attachment::{Joint, JointOf, PartInShip, Peer, Ship, SnapOf, SnapOfJoint}; use crate::config::planet::{Planet, PlanetConfigCollection}; use crate::config::recipe::RecipesConfig; -use crate::ecs::{CanCraft, DragRequestEvent, Drill, Hi, Part, Particles, Player, PlayerStorage, SingleStorage, Temperature, ToggleDrillEvent}; +use crate::ecs::{CanCraft, CraftPartRequest, 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::*; @@ -37,6 +37,7 @@ pub fn register_everything(app: &mut App) { app.add_mapped_client_message::(Channel::Ordered); app.add_mapped_client_message::(Channel::Ordered); app.add_mapped_client_message::(Channel::Ordered); + app.add_mapped_client_message::(Channel::Ordered); app.add_mapped_server_message::(Channel::Ordered); app.replicate::(); app.replicate::();