use crate::{attachment::{PartInShip, Parts}, config::planet::Planet, ecs::{Drill, Part, PlanetSensor, SingleStorage, ToggleDrillEvent}, prelude::*}; pub fn drill_plugin(app: &mut App) { app.add_systems(Update, (toggle_drill, drill_on_planet, do_drilling)); } fn toggle_drill( mut toggle_drill_reader: MessageReader>, 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, mut collision_end: MessageReader, 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; } } fn do_drilling( drills: Query<(&Drill, &PartInShip)>, parts_query: Query<&Parts>, mut storage_part_query: Query<&mut SingleStorage, With>, planet_query: Query<&Planet>, time: Res