~starkingdoms/starkingdoms

ref: 086b9dd63882d67e66ae92c36ac6e7b31d076743 starkingdoms/crates/unified/src/server/part_dragging.rs -rw-r--r-- 1.4 KiB
086b9dd6 — core fix: parts 5 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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>();
            }
        }
    }
}