use crate::{ecs::{Drill, PlanetSensor, ToggleDrillEvent}, prelude::*};
pub fn drill_plugin(app: &mut App) {
app.add_systems(Update, (toggle_drill, drill_on_planet));
}
fn toggle_drill(
mut toggle_drill_reader: MessageReader<FromClient<ToggleDrillEvent>>,
mut drills: Query<&mut Drill>,
) {
for toggle_drill_event in toggle_drill_reader.read() {
// this getting of the drill also serves to check whether or not
// the entity is a drill
let Ok(mut drill) = drills.get_mut(toggle_drill_event.drill_entity) else { return };
drill.drilling = !drill.drilling;
}
}
fn drill_on_planet(
mut collision_start: MessageReader<CollisionStart>,
mut collision_end: MessageReader<CollisionEnd>,
planet_sensors: Query<&PlanetSensor>,
mut drills: Query<&mut Drill>,
) {
for event in collision_start.read() {
let (planet_sensor, mut drill) = if let (Ok(planet_sensor), Ok(drill)) = (planet_sensors.get(event.collider1), drills.get_mut(event.collider2)) {
(planet_sensor, drill)
} else if let (Ok(drill), Ok(planet_sensor)) = (drills.get_mut(event.collider1), planet_sensors.get(event.collider2)) {
(planet_sensor, drill)
} else {
continue
};
drill.on_planet = Some(planet_sensor.0.clone());
}
for event in collision_end.read() {
let (_, mut drill) = if let (Ok(planet_sensor), Ok(drill)) = (planet_sensors.get(event.collider1), drills.get_mut(event.collider2)) {
(planet_sensor, drill)
} else if let (Ok(drill), Ok(planet_sensor)) = (drills.get_mut(event.collider1), planet_sensors.get(event.collider2)) {
(planet_sensor, drill)
} else {
continue
};
drill.drilling = false;
drill.on_planet = None;
}
}