bevy-expedition-demo/src/layout/lock.rs
2ndbeam c1f9c29fe7 feat: Implemented layout assets resource
- Layout sprites are now looking as before
2026-04-01 11:50:56 +03:00

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,
)),
)),
)
}