generated from 2ndbeam/bevy-template
77 lines
2.1 KiB
Rust
77 lines
2.1 KiB
Rust
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<InteractionEvent>,
|
|
mut commands: Commands,
|
|
query: Query<(&ChildOf, Entity), With<Padlock>>,
|
|
inventory_query: Query<(&Children, &ChildOf), With<Inventory>>,
|
|
player_query: Query<(), With<Player>>,
|
|
lockpick_query: Query<(), With<Lockpick>>,
|
|
) {
|
|
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::<Locked>();
|
|
commands.entity(lock_id).despawn();
|
|
commands.entity(lockpick_id).despawn();
|
|
}
|
|
|
|
pub fn padlock_bundle(textures: &Res<LayoutTextures>, 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,
|
|
)),
|
|
)),
|
|
)
|
|
}
|