use bevy::prelude::*;
use bevy_rapier2d::prelude::{Collider, ColliderDisabled};
use bevy_replicon::prelude::FromClient;
use crate::clientevent::{PartDragControlEvent, PartDragEvent};
use crate::ecs::Part;
pub fn part_dragging_plugin(app: &mut App) {
app.add_systems(Update, (handle_dragged_parts, handle_start_stop_drag));
}
// todo: attachment
#[derive(Component)]
pub struct BeingDragged;
fn handle_dragged_parts(mut transforms: Query<&mut Transform, (With<BeingDragged>)>, mut events: EventReader<FromClient<PartDragEvent>>) {
for event in events.read() {
let Ok(mut transform) = transforms.get_mut(event.0) else { continue; };
transform.translation = (event.1, 0.0).into();
}
}
fn handle_start_stop_drag(mut colliders: Query<&Collider, With<Part>>, mut events: EventReader<FromClient<PartDragControlEvent>>, mut commands: Commands) {
for event in events.read() {
let entity = match &event.event {
PartDragControlEvent::Start(e) => *e,
PartDragControlEvent::Stop(e) => *e,
};
let Ok(_) = colliders.get(entity) else { continue; };
match &event.event {
PartDragControlEvent::Start(_) => {
commands.entity(entity)
.insert(BeingDragged);
},
PartDragControlEvent::Stop(_) => {
commands.entity(entity).remove::<BeingDragged>();
}
}
}
}