~starkingdoms/starkingdoms

ref: a2ff8f1ebb1deb91542e24cb73a025ef85253390 starkingdoms/crates/unified/src/server/part_dragging.rs -rw-r--r-- 1.5 KiB
a2ff8f1e — core feat: drag 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
40
41
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)
                    .insert(ColliderDisabled);
            },
            PartDragControlEvent::Stop(_) => {
                commands.entity(entity).remove::<BeingDragged>()
                    .remove::<ColliderDisabled>();
            }
        }
    }
}