diff --git a/crates/shared/src/player.rs b/crates/shared/src/player.rs index d263b5b..f4a88d6 100644 --- a/crates/shared/src/player.rs +++ b/crates/shared/src/player.rs @@ -186,12 +186,18 @@ fn setup_animations_marker_for_player( fn on_update_head_mesh( trigger: Trigger, mut commands: Commands, - body_mesh: Single>, + body_mesh: Single<(Entity, &Children), With>, + animated_characters: Query<&AnimatedCharacter>, mut player: Single<&mut ActiveHead, With>, head_db: Res, audio_assets: Res, -) { - let body_mesh = *body_mesh; +) -> Result { + let (body_mesh, mesh_children) = *body_mesh; + + let animated_char = mesh_children + .iter() + .find(|child| animated_characters.contains(*child)) + .ok_or("tried to update head mesh before AnimatedCharacter was readded")?; player.0 = trigger.0; @@ -199,11 +205,10 @@ fn on_update_head_mesh( commands.trigger(PlaySound::Head(head_str.to_string())); - commands.entity(body_mesh).despawn_related::(); - commands - .entity(body_mesh) - .with_child(AnimatedCharacter::new(trigger.0)); + .entity(animated_char) + .remove::() + .insert(AnimatedCharacter::new(trigger.0)); //TODO: make part of full character mesh later if head_db.head_stats(trigger.0).controls == HeadControls::Plane { @@ -216,4 +221,6 @@ fn on_update_head_mesh( }, )); } + + Ok(()) }