Cargo fmt

This commit is contained in:
Franklin 2023-11-12 17:24:28 -04:00
parent 865070ed90
commit aa7eb521b8
23 changed files with 194 additions and 100 deletions

View File

@ -1,5 +1,6 @@
## Game design ## Game design
### OUTDADED:
4-6 guns, with 1 magazine per gun. 4-6 guns, with 1 magazine per gun.
Optics can be left out Optics can be left out
Can only be found in the world Can only be found in the world

View File

@ -1,17 +1,28 @@
# Experimental game # Experimental game
## Things to finish:
- [ ] Perfect movement
- [ ] Equipping items (Guns and armor)
- [ ] Gun aiming and noscope is not the same position
- [ ] Controls being bindable
- [ ] Gun moving out of the way on a collision
- [ ] Gun moving when walking, when running, aimed in.
- [ ] Visual effects for camera
- [ ] Fix: Make gun have more priority in rendering. So it doesn't clip through walls - [ ] Fix: Make gun have more priority in rendering. So it doesn't clip through walls
- [ ] Feature: Give a collider to the gun and when it collides with something make it move out of the way. - [ ] Feature: Give a collider to the gun and when it collides with something make it move out of the way.
- [ ] Feature: Add bullet holes - [ ] Feature: Add bullet holes
- [ ] Fix: No Sprinting while aiming - [ ] Fix: No Sprinting while aiming
- [ ] Fix: Movement is clunky and very linear. Add some sort of Lerping for acceleration vectors. - [ ] Fix: Movement is clunky and very linear. Add some sort of Lerping for acceleration vectors.
- [ ] Feature: Muzzle flashes for shots - [x] Feature: Muzzle flashes for shots
- [ ] Feature: Bullets (raycast or projectile?) - [x] Feature: Bullets (projectile)
- [x] Feature: Add smooth camera movement to camera on crouch. Right now it's too fast and looks arcade af. - [x] Feature: Add smooth camera movement to camera on crouch. Right now it's too fast and looks arcade af.
~~- [ ] Feature: Add jump effect to camera~~ ~~- [ ] Feature: Add jump effect to camera~~
- [ ] Feature: Add Stamina (with bar?) - [ ] Feature: Add Stamina (with bar?)
- [ ] Feature: Subtle Headbob, FOV change on movement (Distinguish between sprinting and walking). - [ ] Feature: Subtle Headbob, FOV change on movement (Distinguish between sprinting and walking).
- [ ] Feature: Basic ESC UI, FPS counter, stamina bar - [x] Feature: Basic ESC UI, FPS counter
- [ ] Feature: Gun sprinting animations, high ready, low ready, etc... - [ ] Feature: Gun sprinting animations, high ready, low ready, etc...
- [x] Discussion: PvP vs PvE - [x] Discussion: PvP vs PvE
@ -32,15 +43,15 @@ Build a realistic fps sandbox with arcadey mechanics, and start to document it,
## MVP to start documenting progress: ## MVP to start documenting progress:
- [ ] Shooting bullets. - [x] Shooting bullets.
- [ ] A manequinn that registers hits in every hitbox. - [ ] A manequinn that registers hits in every hitbox.
- [ ] A shooting range/place to be in and show process - [ ] A shooting range/place to be in and show process
- [ ] Some resemblance of UI (Escape menu, stamina bar, etc...) - [x] Some resemblance of UI (Escape menu, stamina bar, etc...)
- [ ] Stamina system - [ ] Stamina system
## End goal landmarks ## End goal landmarks
- [ ] Dynamic hitboxes (heart, brain, lungs) - [ ] Dynamic hitboxes (heart, brain, lungs)
- [ ] Health system with blodloss instead of a health number - [ ] Health system with blodloss instead of a health number
- [ ] Dynamic lighting (Gunshots causing light to be spawned for a duration) - [x] Dynamic lighting (Gunshots causing light to be spawned for a duration)
- [ ] Sound system - [ ] Sound system
- [ ] Adrenaline system - [ ] Adrenaline system

View File

@ -1,6 +1,13 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::{comps::core::{items::item::{Item, ItemType}, grid::UGrid, markers::holdable::HoldableObjectType}, logic::core::guns::firearm::Firearm}; use crate::{
comps::core::{
grid::UGrid,
items::item::{Item, ItemType},
markers::holdable::HoldableObjectType,
},
logic::core::guns::firearm::Firearm,
};
#[derive(Component)] #[derive(Component)]
pub struct Glock17GunItem; pub struct Glock17GunItem;
@ -20,7 +27,10 @@ impl Item for Glock17GunItem {
} }
fn inventory_size(&self) -> UGrid { fn inventory_size(&self) -> UGrid {
UGrid { width: 2, height: 1 } UGrid {
width: 2,
height: 1,
}
} }
fn inventory_rotatable(&self) -> bool { fn inventory_rotatable(&self) -> bool {

View File

@ -1,2 +1,2 @@
pub mod m4a1;
pub mod glock17; pub mod glock17;
pub mod m4a1;

View File

@ -81,7 +81,11 @@ pub trait Item {
..Default::default() ..Default::default()
}, },
RigidBody::Dynamic, RigidBody::Dynamic,
Collider::cuboid(firearm_size.x, firearm_size.y, firearm_size.z), Collider::cuboid(
firearm_size.x,
firearm_size.y,
firearm_size.z,
),
Interactable::Item, Interactable::Item,
)) ))
.push_children(&[firearm_asset_entity]); .push_children(&[firearm_asset_entity]);

View File

@ -12,6 +12,12 @@ pub struct FiringPoint {
pub right: f32, pub right: f32,
} }
#[derive(Reflect, Clone)]
pub enum FirearmType {
Primary,
Secondary,
}
#[derive(Component, Clone, Reflect)] #[derive(Component, Clone, Reflect)]
pub struct FirearmData { pub struct FirearmData {
/// Where the bullets will come out of, and muzzle flash will be spawned out of. /// Where the bullets will come out of, and muzzle flash will be spawned out of.
@ -43,6 +49,8 @@ pub struct FirearmData {
pub final_position: Vec3, pub final_position: Vec3,
pub scale_factor: f32, pub scale_factor: f32,
pub firearm_type: FirearmType,
} }
#[derive(Component, Reflect)] #[derive(Component, Reflect)]

View File

@ -1,6 +1,9 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::comps::core::{items::{guns::glock17::Glock17GunItem, item::Item}, spawners::item::ItemSpawnPoint}; use crate::comps::core::{
items::{guns::glock17::Glock17GunItem, item::Item},
spawners::item::ItemSpawnPoint,
};
#[derive(Component)] #[derive(Component)]
pub struct Glock17SpawnPoint { pub struct Glock17SpawnPoint {

View File

@ -1,6 +1,9 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::comps::core::{items::{guns::m4a1::M4a1GunItem, item::Item}, spawners::item::ItemSpawnPoint}; use crate::comps::core::{
items::{guns::m4a1::M4a1GunItem, item::Item},
spawners::item::ItemSpawnPoint,
};
#[derive(Component)] #[derive(Component)]
pub struct M4a1SpawnPoint { pub struct M4a1SpawnPoint {

View File

@ -1,2 +1,2 @@
pub mod m4a1_spawner;
pub mod glock17_spawner; pub mod glock17_spawner;
pub mod m4a1_spawner;

View File

@ -1,6 +1,12 @@
use bevy::{prelude::*, gltf::Gltf}; use bevy::{gltf::Gltf, prelude::*};
use crate::{setup::{load_state::GameLoadState, assets::GltfAssets}, comps::core::{items::item::Item, spawners::guns::{m4a1_spawner::M4a1SpawnPoint, glock17_spawner::Glock17SpawnPoint}}}; use crate::{
comps::core::{
items::item::Item,
spawners::guns::{glock17_spawner::Glock17SpawnPoint, m4a1_spawner::M4a1SpawnPoint},
},
setup::{assets::GltfAssets, load_state::GameLoadState},
};
#[bevy_trait_query::queryable] #[bevy_trait_query::queryable]
pub trait ItemSpawnPoint { pub trait ItemSpawnPoint {
@ -19,7 +25,12 @@ pub fn item_spawner(
for (entity, item_sp_entity) in item_sp_query.iter() { for (entity, item_sp_entity) in item_sp_query.iter() {
for component_sp in item_sp_entity { for component_sp in item_sp_entity {
println!("Spawning item"); println!("Spawning item");
component_sp.get_item().spawn(&mut commands, component_sp.get_transform(), &assets_gltf, &loaded_gltf_assets) component_sp.get_item().spawn(
&mut commands,
component_sp.get_transform(),
&assets_gltf,
&loaded_gltf_assets,
)
} }
//m4.spawn(&mut commands, item_sp.at, &assets_gltf, &loaded_gltf_assets); //m4.spawn(&mut commands, item_sp.at, &assets_gltf, &loaded_gltf_assets);
commands.entity(entity).despawn(); commands.entity(entity).despawn();
@ -31,8 +42,7 @@ pub struct ItemSpawnPointPlugin;
impl Plugin for ItemSpawnPointPlugin { impl Plugin for ItemSpawnPointPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
use bevy_trait_query::RegisterExt; use bevy_trait_query::RegisterExt;
app app.register_component_as::<dyn ItemSpawnPoint, M4a1SpawnPoint>()
.register_component_as::<dyn ItemSpawnPoint, M4a1SpawnPoint>()
.register_component_as::<dyn ItemSpawnPoint, Glock17SpawnPoint>(); .register_component_as::<dyn ItemSpawnPoint, Glock17SpawnPoint>();
} }
} }

View File

@ -1,5 +1,5 @@
pub mod guns;
pub mod item; pub mod item;
pub mod player; pub mod player;
pub mod spawn_point;
pub mod guns;
pub mod spawn; pub mod spawn;
pub mod spawn_point;

View File

@ -118,7 +118,7 @@ pub fn player_spawner(
game_load_state.player_loaded = true; game_load_state.player_loaded = true;
equipment_change_event_writer.send(EquipmentChangeEvent( equipment_change_event_writer.send(EquipmentChangeEvent(
player_spawn_point.player.0.equipment.clone() player_spawn_point.player.0.equipment.clone(),
)); ));
commands.entity(player_spawn_point_entity).despawn(); commands.entity(player_spawn_point_entity).despawn();
} }

View File

@ -1,15 +1,15 @@
use bevy::prelude::*; use bevy::prelude::*;
use super::{player::player_spawner, item::{item_spawner, ItemSpawnPointPlugin}, spawn_point::SpawnPointPlugin}; use super::{
item::{item_spawner, ItemSpawnPointPlugin},
player::player_spawner,
spawn_point::SpawnPointPlugin,
};
pub struct SpawnerPlugin; pub struct SpawnerPlugin;
impl Plugin for SpawnerPlugin { impl Plugin for SpawnerPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_plugins((SpawnPointPlugin, ItemSpawnPointPlugin)); app.add_plugins((SpawnPointPlugin, ItemSpawnPointPlugin));
app.add_systems( app.add_systems(Update, (player_spawner, item_spawner));
Update,
(player_spawner, item_spawner),
);
} }
} }

View File

@ -2,7 +2,6 @@ use bevy::prelude::*;
use crate::comps::core::spawners::player::PlayerSpawnPoint; use crate::comps::core::spawners::player::PlayerSpawnPoint;
#[bevy_trait_query::queryable] #[bevy_trait_query::queryable]
pub trait SpawnPoint { pub trait SpawnPoint {
fn get_transform(&self) -> Transform; fn get_transform(&self) -> Transform;
@ -12,7 +11,6 @@ pub struct SpawnPointPlugin;
impl Plugin for SpawnPointPlugin { impl Plugin for SpawnPointPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
use bevy_trait_query::RegisterExt; use bevy_trait_query::RegisterExt;
app. app.register_component_as::<dyn SpawnPoint, PlayerSpawnPoint>();
register_component_as::<dyn SpawnPoint, PlayerSpawnPoint>();
} }
} }

View File

@ -1,5 +1,5 @@
use crate::comps::core::markers::{ use crate::comps::core::markers::{
firearm::{FirearmData, FiringPoint}, firearm::{FirearmData, FirearmType, FiringPoint},
holdable::HoldableObjectData, holdable::HoldableObjectData,
}; };
use bevy::prelude::*; use bevy::prelude::*;
@ -54,6 +54,7 @@ impl Firearm {
}, },
scale_factor: 1.0, scale_factor: 1.0,
asset_path: String::from("weapons/m4a1_rifle.glb"), asset_path: String::from("weapons/m4a1_rifle.glb"),
firearm_type: FirearmType::Primary,
} }
} }
Firearm::Glock17 => { Firearm::Glock17 => {
@ -95,6 +96,7 @@ impl Firearm {
}, },
scale_factor: 0.25, scale_factor: 0.25,
asset_path: String::from("weapons/glock_17_pistol.glb"), asset_path: String::from("weapons/glock_17_pistol.glb"),
firearm_type: FirearmType::Secondary,
} }
} }
} }
@ -113,7 +115,11 @@ impl Firearm {
} }
pub fn get_size(&self) -> Vec3 { pub fn get_size(&self) -> Vec3 {
match self { match self {
Firearm::M4A1 => Vec3 { x: 0.3, y: 0.7, z: 2.5 }, Firearm::M4A1 => Vec3 {
x: 0.3,
y: 0.7,
z: 2.5,
},
Firearm::Glock17 => Vec3::ZERO, Firearm::Glock17 => Vec3::ZERO,
} }
} }

View File

@ -1,17 +1,14 @@
use bevy::{prelude::*, ecs::system::SystemParam}; use bevy::{ecs::system::SystemParam, prelude::*};
use bevy_rapier3d::prelude::*; use bevy_rapier3d::prelude::*;
use crate::{ use crate::{
comps::core::{ comps::core::markers::{
//events::loot_container::LootContainerEvent,
markers::{
camera::MainCamera, camera::MainCamera,
firearm::{FirearmData, MagazineData}, firearm::{FirearmData, MagazineData},
holdable::InPlayerHands, holdable::InPlayerHands,
interactable::Interactable, interactable::Interactable,
player::{Player, PlayerHand}, player::{Player, PlayerHand},
}, },
},
logic::core::guns::{firearm::Firearm, player_firing::PlayerFiringInfo, shoot::shoot_bullet}, logic::core::guns::{firearm::Firearm, player_firing::PlayerFiringInfo, shoot::shoot_bullet},
setup::{ setup::{
animations::AllFirearmAnimations, animations::AllFirearmAnimations,
@ -19,7 +16,7 @@ use crate::{
load_state::GameLoadState, load_state::GameLoadState,
}, },
ui::game::{hud::hud::HudState, settings::SettingsScreenUIConfiguration}, ui::game::{hud::hud::HudState, settings::SettingsScreenUIConfiguration},
utils::{rad_deg::radians_from_degrees, self}, utils::{self, rad_deg::radians_from_degrees},
}; };
#[derive(SystemParam)] #[derive(SystemParam)]
@ -41,7 +38,12 @@ pub fn capture_hand_usage(
mut hand_query: Query<&mut Transform, With<PlayerHand>>, mut hand_query: Query<&mut Transform, With<PlayerHand>>,
mut firearm_query: Query< mut firearm_query: Query<
(Entity, &GlobalTransform, &'static FirearmData, &mut MagazineData), (
Entity,
&GlobalTransform,
&'static FirearmData,
&mut MagazineData,
),
(With<InPlayerHands>, Without<PlayerHand>), (With<InPlayerHands>, Without<PlayerHand>),
>, >,
player_query: Query<&Player>, player_query: Query<&Player>,
@ -77,22 +79,33 @@ pub fn capture_hand_usage(
// Firearm stuff // Firearm stuff
if let Equipment::Firearm(player_firearm) = player_query.single().0.equipment.clone() { if let Equipment::Firearm(player_firearm) = player_query.single().0.equipment.clone() {
for mut player_firing_info in player_firing_info_query.iter_mut() { for mut player_firing_info in player_firing_info_query.iter_mut() {
player_firing_info.full_auto_timer.tick(resources.time.delta()); player_firing_info
.full_auto_timer
.tick(resources.time.delta());
for (firearm_entity, firearm_transform, firearm_data, mut magazine_data) in firearm_query.iter_mut() { for (firearm_entity, firearm_transform, firearm_data, mut magazine_data) in
firearm_query.iter_mut()
{
for mut hand_transform in hand_query.iter_mut() { for mut hand_transform in hand_query.iter_mut() {
if player_firing_info.is_reloading { if player_firing_info.is_reloading {
for (animation_player_entity, animation_player) in &mut animation_players { for (animation_player_entity, animation_player) in &mut animation_players {
//children.get_component(entity) //children.get_component(entity)
// Only reload if this animation_player_entity is a child of the firearm_entity // Only reload if this animation_player_entity is a child of the firearm_entity
if utils::hierarchy::find_child_in_parent_children(&mut commands, firearm_entity, animation_player_entity, &children) { if utils::hierarchy::find_child_in_parent_children(
if let Some(firearm_animations) = resources.all_firearm_animations &mut commands,
firearm_entity,
animation_player_entity,
&children,
) {
if let Some(firearm_animations) = resources
.all_firearm_animations
.animations .animations
.iter() .iter()
.find(|animation| &animation.firearm == &player_firearm) .find(|animation| &animation.firearm == &player_firearm)
{ {
if let Some(animation_clip) = if let Some(animation_clip) = resources
resources.animation_clips.get(&firearm_animations.reload_magazine) .animation_clips
.get(&firearm_animations.reload_magazine)
{ {
if animation_player.elapsed() >= animation_clip.duration() { if animation_player.elapsed() >= animation_clip.duration() {
magazine_data.rounds_shot = 0; magazine_data.rounds_shot = 0;
@ -101,8 +114,6 @@ pub fn capture_hand_usage(
} }
} }
} }
} }
} else { } else {
// Player is not in a reload animation // Player is not in a reload animation
@ -110,10 +121,18 @@ pub fn capture_hand_usage(
&& !resources.settings_screen_config.settings_menu_shown && !resources.settings_screen_config.settings_menu_shown
{ {
// Start reload animation // Start reload animation
for (animation_player_entity, mut animation_player) in &mut animation_players { for (animation_player_entity, mut animation_player) in
&mut animation_players
{
// Only reload if this animation_player_entity is a child of the firearm_entity // Only reload if this animation_player_entity is a child of the firearm_entity
if utils::hierarchy::find_child_in_parent_children(&mut commands, firearm_entity, animation_player_entity, &children) { if utils::hierarchy::find_child_in_parent_children(
if let Some(firearm_animations) = resources.all_firearm_animations &mut commands,
firearm_entity,
animation_player_entity,
&children,
) {
if let Some(firearm_animations) = resources
.all_firearm_animations
.animations .animations
.iter() .iter()
.find(|animation| &animation.firearm == &player_firearm) .find(|animation| &animation.firearm == &player_firearm)
@ -133,12 +152,14 @@ pub fn capture_hand_usage(
{ {
let rotation_lerp_quat = hand_transform.rotation.lerp( let rotation_lerp_quat = hand_transform.rotation.lerp(
firearm_data.final_aimed_rotation, firearm_data.final_aimed_rotation,
(resources.time.delta_seconds() / firearm_data.rebound_time_seconds) (resources.time.delta_seconds()
/ firearm_data.rebound_time_seconds)
.clamp(0.0, 1.0), .clamp(0.0, 1.0),
); );
let position_lerp_vec3 = hand_transform.translation.lerp( let position_lerp_vec3 = hand_transform.translation.lerp(
firearm_data.final_aimed_position, firearm_data.final_aimed_position,
(resources.time.delta_seconds() / firearm_data.rebound_time_seconds) (resources.time.delta_seconds()
/ firearm_data.rebound_time_seconds)
.clamp(0.0, 1.0), .clamp(0.0, 1.0),
); );
hand_transform.rotation = rotation_lerp_quat; hand_transform.rotation = rotation_lerp_quat;
@ -146,12 +167,14 @@ pub fn capture_hand_usage(
} else { } else {
hand_transform.rotation = hand_transform.rotation.lerp( hand_transform.rotation = hand_transform.rotation.lerp(
firearm_data.final_rotation, firearm_data.final_rotation,
(resources.time.delta_seconds() / firearm_data.rebound_time_seconds) (resources.time.delta_seconds()
/ firearm_data.rebound_time_seconds)
.clamp(0.0, 1.0), .clamp(0.0, 1.0),
); );
hand_transform.translation = hand_transform.translation.lerp( hand_transform.translation = hand_transform.translation.lerp(
firearm_data.final_position, firearm_data.final_position,
(resources.time.delta_seconds() / firearm_data.rebound_time_seconds) (resources.time.delta_seconds()
/ firearm_data.rebound_time_seconds)
.clamp(0.0, 1.0), .clamp(0.0, 1.0),
); );
} }
@ -175,13 +198,8 @@ pub fn capture_hand_usage(
*firearm_data.recoil_pattern.horizontal.last().expect("FOUND A FIREARM_DATA WITHOUT ANY FIREARM_RECOIL_PATTERN.") *firearm_data.recoil_pattern.horizontal.last().expect("FOUND A FIREARM_DATA WITHOUT ANY FIREARM_RECOIL_PATTERN.")
}, },
}; };
// TODO: Spawn Bullet & Muzzle flash
/*let firing_point_global = firearm_transform.translation().clone();
let firint_point_final = firing_point_global + (firearm_transform.forward() * 1.5) + (firearm_transform.up() / 2.5);
shoot_bullet(&mut commands, &mut meshes, &mut materials, Transform::from_translation(firint_point_final), firearm_transform.forward() * 10.0, firearm_data.caliber.clone());*/
let firearm_transform = firearm_transform.clone(); let firearm_transform = firearm_transform.clone();
// TODO: M4 holdableobject data has a Y ROT of -90. Apply that rotation here if it exists.
let firing_point = firearm_transform.translation() let firing_point = firearm_transform.translation()
+ (firearm_transform.forward() + (firearm_transform.forward()
* firearm_data.firing_point.forward) * firearm_data.firing_point.forward)
@ -201,7 +219,8 @@ pub fn capture_hand_usage(
); );
// Increment indexes and timers // Increment indexes and timers
player_firing_info.current_round_index += 1; player_firing_info.current_round_index += 1;
player_firing_info.last_shot_timestamp = resources.time.elapsed_seconds(); player_firing_info.last_shot_timestamp =
resources.time.elapsed_seconds();
player_firing_info.full_auto_timer.reset(); player_firing_info.full_auto_timer.reset();
magazine_data.rounds_shot += 1; magazine_data.rounds_shot += 1;
@ -276,7 +295,7 @@ pub fn interact_action(
Interactable::Item => { Interactable::Item => {
//loot_container_event_writer //loot_container_event_writer
// .send() // .send()
}, }
} }
} }
return; return;

View File

@ -39,7 +39,7 @@ impl Default for PlayerValuesState {
max_linear_player_velocity: 20.0, max_linear_player_velocity: 20.0,
player_acceleration: 20.0, player_acceleration: 20.0,
player_jump_force: 1000.0, player_jump_force: 1000.0,
player_jump_cooldown_s: 0.075, player_jump_cooldown_s: 0.045,
player_sprint_speed_multiplier: 3.5, player_sprint_speed_multiplier: 3.5,
player_crouch_speed_multiplier: 0.25, player_crouch_speed_multiplier: 0.25,
player_initial_weight: 75.0, player_initial_weight: 75.0,

View File

@ -1,7 +1,10 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::{ use crate::{
comps::core::{controller::capture_input, spawners::{player::player_spawner, spawn::SpawnerPlugin}}, comps::core::{
controller::capture_input,
spawners::{player::player_spawner, spawn::SpawnerPlugin},
},
logic::core::{ logic::core::{
guns::despawn_shots::{despawn_muzzle_flashes, despawn_stray_bullets}, guns::despawn_shots::{despawn_muzzle_flashes, despawn_stray_bullets},
player::{ player::{

View File

@ -1,6 +1,15 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::{comps::core::{markers::player::{Player, PlayerData}, spawners::{player::PlayerSpawnPoint, guns::{m4a1_spawner::M4a1SpawnPoint, glock17_spawner::Glock17SpawnPoint}}}, utils}; use crate::{
comps::core::{
markers::player::{Player, PlayerData},
spawners::{
guns::{glock17_spawner::Glock17SpawnPoint, m4a1_spawner::M4a1SpawnPoint},
player::PlayerSpawnPoint,
},
},
utils,
};
pub fn set_spawn_points(mut commands: Commands) { pub fn set_spawn_points(mut commands: Commands) {
commands.spawn(PlayerSpawnPoint { commands.spawn(PlayerSpawnPoint {

View File

@ -10,5 +10,4 @@ pub fn update_inventory_screen(
mut _commands: Commands, mut _commands: Commands,
//mut event_reader: EventReader<LootContainerEvent>, //mut event_reader: EventReader<LootContainerEvent>,
) { ) {
} }

View File

@ -1,17 +1,27 @@
use bevy::prelude::*; use bevy::prelude::*;
pub fn find_child_in_parent_children(
pub fn find_child_in_parent_children(commands: &mut Commands, parent_entity: Entity, descendant_entity: Entity, children: &Query<&Children>) -> bool { commands: &mut Commands,
parent_entity: Entity,
descendant_entity: Entity,
children: &Query<&Children>,
) -> bool {
let all_children = flatten_if_possible_inf_levels(commands, parent_entity, children); let all_children = flatten_if_possible_inf_levels(commands, parent_entity, children);
all_children.contains(&descendant_entity) all_children.contains(&descendant_entity)
} }
fn flatten_if_possible_inf_levels(commands: &mut Commands, parent_entity: Entity, children: &Query<&Children>) -> Vec<Entity> { fn flatten_if_possible_inf_levels(
commands: &mut Commands,
parent_entity: Entity,
children: &Query<&Children>,
) -> Vec<Entity> {
let mut all_descendant_entities: Vec<Entity> = Vec::new(); let mut all_descendant_entities: Vec<Entity> = Vec::new();
let descendants = children.iter_descendants(parent_entity); let descendants = children.iter_descendants(parent_entity);
for descendant in descendants { for descendant in descendants {
all_descendant_entities.push(descendant); all_descendant_entities.push(descendant);
all_descendant_entities.append(&mut flatten_if_possible_inf_levels(commands, descendant, children)); all_descendant_entities.append(&mut flatten_if_possible_inf_levels(
commands, descendant, children,
));
} }
all_descendant_entities all_descendant_entities
} }

View File

@ -1,2 +1,2 @@
pub mod rad_deg;
pub mod hierarchy; pub mod hierarchy;
pub mod rad_deg;