use bevy::prelude::*; use bevy_rapier2d::prelude::*; use crate::{ meters, inventory::Inventory, item::lockpick::Lockpick, player::Player, }; use super::*; #[derive(Component, Debug, PartialEq, Eq, Default, Clone, Copy, Reflect)] #[reflect(Component, Debug, PartialEq, Default, Clone)] #[require(InteractiveObject)] pub struct Padlock; pub fn on_padlock_interaction( event: On, mut commands: Commands, query: Query<(&ChildOf, Entity), With>, inventory_query: Query<(&Children, &ChildOf), With>, player_query: Query<(), With>, lockpick_query: Query<(), With>, ) { let Ok((parent, lock_id)) = query.get(event.entity) else { return; }; // find lockpick in player inventory let mut lockpick_id = None; for (items, inventory_parent) in inventory_query { if player_query.get(inventory_parent.0).is_err() { continue; } for item_id in items { if lockpick_query.get(*item_id).is_ok() { lockpick_id = Some(*item_id); break; } } }; let Some(lockpick_id) = lockpick_id else { return; }; commands.entity(parent.0).remove::(); commands.entity(lock_id).despawn(); commands.entity(lockpick_id).despawn(); } pub fn padlock_bundle(textures: &Res, facing_left: bool) -> impl Bundle { let sign = if facing_left { -1. } else { 1. }; ( Padlock, Sprite { flip_x: !facing_left, ..textures.lock.sprite("main") }, Transform::from_xyz(meters(sign * 0.125), meters(0.), 0.), InheritedVisibility::VISIBLE, Children::spawn(( Spawn(( Transform::from_xyz(meters(sign * 0.1875), 0., 0.), Collider::cuboid(meters(0.1875), meters(1.)), Sensor, )), Spawn(( Sprite { flip_x: !facing_left, ..textures.lock.sprite("highlight") }, Visibility::Hidden, )), )), ) }