From 400713570607b91c1041d6684c337df8f6586d1b Mon Sep 17 00:00:00 2001 From: core Date: Wed, 9 Jul 2025 22:24:04 -0400 Subject: [PATCH] fix: part hot reloading --- crates/unified/src/server/part.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/crates/unified/src/server/part.rs b/crates/unified/src/server/part.rs index 86dd205c2749cc0c75bb33971fed5b6104e905b3..d07052179c0edde689ff8638613408ae4b993c56 100644 --- a/crates/unified/src/server/part.rs +++ b/crates/unified/src/server/part.rs @@ -5,7 +5,7 @@ use crate::config::part::PartConfig; use crate::ecs::{Part, PartHandle}; pub fn part_management_plugin(app: &mut App) { - app.add_systems(PreUpdate, handle_ready_parts); + app.add_systems(PreUpdate, (handle_ready_parts, handle_part_reloading)); } #[derive(Bundle)] @@ -18,7 +18,7 @@ pub struct SpawnPartBundle { pub struct SpawnPartRequest(pub Handle); // wait for parts assets to be ready, then spawn the full part -pub fn handle_ready_parts(loading_parts: Query<(Entity, &SpawnPartRequest)>, mut commands: Commands, assets: Res>) { +fn handle_ready_parts(loading_parts: Query<(Entity, &SpawnPartRequest)>, mut commands: Commands, assets: Res>) { for (entity, loading_part) in &loading_parts { if let Some(strong_config) = assets.get(&loading_part.0) { // config is strong; spawn 'er in! @@ -28,6 +28,22 @@ pub fn handle_ready_parts(loading_parts: Query<(Entity, &SpawnPartRequest)>, mut } } } +fn handle_part_reloading(existing_parts: Query<(Entity, &PartHandle)>, assets: Res>, mut asset_events: EventReader>, mut commands: Commands) { + for event in asset_events.read() { + match event { + AssetEvent::Modified { id } => { + let config = assets.get(*id).unwrap(); + for existing_part in existing_parts.iter() { + if existing_part.1.0.id() == *id { + commands.entity(existing_part.0) + .insert(calculate_bundle(config, &existing_part.1.0)); + } + } + }, + _ => {} + } + } +} fn calculate_bundle(config: &PartConfig, handle: &Handle) -> impl Bundle { let part = Part {