~starkingdoms/starkingdoms

400713570607b91c1041d6684c337df8f6586d1b — core 5 months ago e10f9c6
fix: part hot reloading
1 files changed, 18 insertions(+), 2 deletions(-)

M crates/unified/src/server/part.rs
M crates/unified/src/server/part.rs => crates/unified/src/server/part.rs +18 -2
@@ 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<PartConfig>);

// 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<Assets<PartConfig>>) {
fn handle_ready_parts(loading_parts: Query<(Entity, &SpawnPartRequest)>, mut commands: Commands, assets: Res<Assets<PartConfig>>) {
    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<Assets<PartConfig>>, mut asset_events: EventReader<AssetEvent<PartConfig>>, 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<PartConfig>) -> impl Bundle {
    let part = Part {