generated from 2ndbeam/bevy-template
refactor!: Split everything into submodules
- Bump version to 0.2.0 - Split every module to systems, observers, plugins, etc - Renamed Crate to Container - Removed Wall component - Removed try_insert_item system - Removed inventory::ui module
This commit is contained in:
parent
3094a8af13
commit
7c386d4128
20 changed files with 830 additions and 772 deletions
|
|
@ -0,0 +1,80 @@
|
|||
use bevy::{
|
||||
ecs::query::QueryFilter,
|
||||
prelude::*,
|
||||
};
|
||||
use bevy_rapier2d::prelude::*;
|
||||
|
||||
use crate::{
|
||||
inventory::item::Item,
|
||||
player::Player,
|
||||
};
|
||||
|
||||
use super::*;
|
||||
|
||||
fn get_interactive_id<F: QueryFilter>(
|
||||
tested_id: Entity,
|
||||
interactive_query: Query<(), F>,
|
||||
parent_query: Query<&ChildOf, With<Collider>>,
|
||||
) -> Option<Entity> {
|
||||
if interactive_query.get(tested_id).is_ok() {
|
||||
return Some(tested_id);
|
||||
}
|
||||
let Ok(parent_id) = parent_query.get(tested_id) else {
|
||||
return None;
|
||||
};
|
||||
match interactive_query.get(parent_id.0) {
|
||||
Ok(_) => Some(parent_id.0),
|
||||
Err(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn detect_interact_collisions(
|
||||
mut commands: Commands,
|
||||
mut collision_events: MessageReader<CollisionEvent>,
|
||||
player_query: Query<(), With<Player>>,
|
||||
interactive_query1: Query<(), (With<InteractiveObject>, Without<MayInteract>)>,
|
||||
interactive_query2: Query<(), (With<InteractiveObject>, With<MayInteract>)>,
|
||||
parent_query: Query<&ChildOf, With<Collider>>,
|
||||
) {
|
||||
for collision_event in collision_events.read() {
|
||||
match collision_event {
|
||||
CollisionEvent::Started(first, second, _) => {
|
||||
let Some(interactive_id) = get_interactive_id(*first, interactive_query1, parent_query) else {
|
||||
continue;
|
||||
};
|
||||
if player_query.get(*second).is_err() {
|
||||
continue;
|
||||
}
|
||||
commands.entity(interactive_id).insert(MayInteract);
|
||||
},
|
||||
CollisionEvent::Stopped(first, second, _) => {
|
||||
let Some(interactive_id) = get_interactive_id(*first, interactive_query2, parent_query) else {
|
||||
continue;
|
||||
};
|
||||
if player_query.get(*second).is_err() {
|
||||
continue;
|
||||
}
|
||||
commands.entity(interactive_id).remove::<MayInteract>();
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn setup_world(
|
||||
mut commands: Commands,
|
||||
asset_server: Res<AssetServer>,
|
||||
) {
|
||||
let items = vec![
|
||||
Item::new_positioned(uvec2(1, 1), uvec2(0, 0)),
|
||||
Item::new_positioned(uvec2(2, 1), uvec2(1, 0)),
|
||||
Item::new_positioned(uvec2(3, 1), uvec2(3, 0)),
|
||||
Item::new_positioned(uvec2(2, 2), uvec2(6, 0)),
|
||||
Item::new_positioned(uvec2(6, 2), uvec2(0, 1)),
|
||||
Item::new_positioned(uvec2(2, 3), uvec2(6, 2)),
|
||||
Item::new_positioned(uvec2(4, 4), uvec2(0, 4)),
|
||||
];
|
||||
commands.spawn(door::door_bundle(&asset_server, vec2(16., 0.), true));
|
||||
commands.spawn(door::door_bundle(&asset_server, vec2(48., 0.), false));
|
||||
commands.spawn(door::door_bundle(&asset_server, vec2(80., 0.), false)).insert(Locked);
|
||||
commands.spawn(container::container_bundle(&asset_server, vec2(-32., 0.), uvec2(8, 8), items));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue