Modular weapons

This commit is contained in:
Franklin 2023-11-20 11:22:56 -04:00
parent d262378352
commit be895b0021
33 changed files with 361 additions and 49 deletions

10
Cargo.lock generated
View File

@ -347,7 +347,6 @@ version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "329e344f835f5a9a4c46a6d1d57371f726aa2c482d1bd669b2b9c4eb1ee91fd7"
dependencies = [
"bevy_dylib",
"bevy_internal",
]
@ -587,15 +586,6 @@ dependencies = [
"sysinfo",
]
[[package]]
name = "bevy_dylib"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "766980812401453563a7490a351dab88e8f53e62ff37e27a5236e6893deedc5a"
dependencies = [
"bevy_internal",
]
[[package]]
name = "bevy_ecs"
version = "0.12.0"

View File

@ -15,7 +15,7 @@ opt-level = 3
opt-level = 3
[dependencies]
bevy = { version = "0.12", features = ["dynamic_linking"]}
bevy = { version = "0.12", features = []}
bevy-inspector-egui = "0.21.0"
bevy_editor_pls = "0.6"
bevy_rapier3d = { version = "0.23", features = ["debug-render-3d"] }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2,7 +2,12 @@ use std::sync::Arc;
use bevy::prelude::*;
use crate::comps::core::items::item::Item;
use crate::comps::core::{items::item::Item, weapons::firearm_state::FirearmState};
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Debug, Clone)]
pub enum ItemState {
Weapon(FirearmState),
}
/// When an item gets picked up in the game world, this event should handle all the physical properties on the game world.
/// Mainly, removing the item from the game world, triggering inventory events, changing the player's equipment, etc...
@ -12,4 +17,5 @@ pub struct PickupItemEvent {
pub entity: Entity,
pub item: Arc<dyn Item>,
pub player: Entity,
pub state: Option<ItemState>
}

View File

@ -111,6 +111,7 @@ pub fn drop_slot_in_game_world(
&assets_gltf,
&loaded_gltf_assets,
drop_impulse,
None
);
}
player_inventory.drop_item(PlayerInventorySlotType::Primary);
@ -124,6 +125,7 @@ pub fn drop_slot_in_game_world(
&assets_gltf,
&loaded_gltf_assets,
drop_impulse,
None
);
}
player_inventory.drop_item(PlayerInventorySlotType::Secondary);

View File

@ -1,17 +1,18 @@
use bevy::prelude::*;
use bevy::{prelude::*, gltf::Gltf};
use bevy_rapier3d::{dynamics::{RigidBody, GravityScale, ExternalImpulse}, geometry::{ColliderMassProperties, Collider}};
use crate::comps::core::{
use crate::{comps::core::{
grid::UGrid,
items::item::{Item, ItemType},
markers::holdable::HoldableObjectType, inventory::slot::PlayerInventorySlotType, weapons::firearm::Firearm,
};
markers::{holdable::HoldableObjectType, interactable::Interactable}, inventory::slot::PlayerInventorySlotType, weapons::{firearm::Firearm, firearm_data::FirearmData}, events::pickup_item::ItemState,
}, setup::assets::{GltfAssets, GltfAssetType}, utils};
#[derive(Component, Reflect)]
pub struct Ak105GunItem;
impl Item for Ak105GunItem {
fn get_type(&self) -> ItemType {
ItemType::Holdable(HoldableObjectType::Firearm(Firearm::Glock17))
ItemType::Holdable(HoldableObjectType::Firearm(Firearm::Ak105))
}
fn asset_path(&self) -> &str {
@ -45,4 +46,80 @@ impl Item for Ak105GunItem {
fn get_item_slot(&self) -> PlayerInventorySlotType {
PlayerInventorySlotType::Primary
}
fn spawn(
&self,
commands: &mut Commands,
transform: Transform,
assets_gltf: &GltfAssets,
loaded_gltf_assets: &Assets<Gltf>,
with_impulse: Vec3,
item_state: Option<ItemState>,
) {
let firearm = Firearm::Ak105;
if let Some(asset_handle) = assets_gltf.assets.iter().find(|asset| {
asset.asset_type == GltfAssetType::Firearm(firearm.clone())
}) {
if let Some(gltf) = loaded_gltf_assets.get(&asset_handle.asset) {
let firearm_data: FirearmData = firearm.firearm_data();
let mut firearm_transform = Transform::from_xyz(0.0, 0.0, 0.0);
firearm_transform.rotate_local_y(
utils::rad_deg::radians_from_degrees(
firearm.holdable_object_data().y_rot,
),
);
firearm_transform.scale =
firearm_transform.scale * firearm_data.scale_factor;
let scene = gltf.scenes[0].clone();
let firearm_asset_entity = commands
.spawn((
SceneBundle {
scene,
visibility: Visibility::Inherited,
transform: firearm_transform,
..default()
},
Name::new(format!(
"{} Item Gltf Asset",
self.inventory_title()
)),
))
.id();
match item_state {
Some(state) => { commands.entity(firearm_asset_entity).insert(state); },
None => {},
};
let firearm_size = firearm.get_size();
commands
.spawn((
firearm.holdable_object_data(),
Name::new(format!("{} Item", self.inventory_title())),
TransformBundle {
local: transform,
..Default::default()
},
VisibilityBundle {
visibility: Visibility::Visible,
..Default::default()
},
RigidBody::Dynamic,
ColliderMassProperties::Mass(5.0),
GravityScale(4.0),
Collider::cuboid(
firearm_size.x,
firearm_size.y,
firearm_size.z,
),
ExternalImpulse {
impulse: with_impulse,
..Default::default()
},
Interactable::Item(firearm.get_item_arc()),
))
.push_children(&[firearm_asset_entity]);
}
}
}
}

View File

@ -1,10 +1,11 @@
use bevy::prelude::*;
use bevy::{prelude::*, gltf::Gltf};
use bevy_rapier3d::{geometry::{ColliderMassProperties, Collider}, dynamics::{RigidBody, GravityScale, ExternalImpulse}};
use crate::comps::core::{
use crate::{comps::core::{
grid::UGrid,
items::item::{Item, ItemType},
markers::holdable::HoldableObjectType, inventory::slot::PlayerInventorySlotType, weapons::firearm::Firearm,
};
markers::{holdable::HoldableObjectType, interactable::Interactable}, inventory::slot::PlayerInventorySlotType, weapons::{firearm::Firearm, firearm_data::FirearmData}, events::pickup_item::ItemState,
}, setup::assets::{GltfAssets, GltfAssetType}, utils};
#[derive(Component, Reflect)]
pub struct Glock17GunItem;
@ -45,4 +46,80 @@ impl Item for Glock17GunItem {
fn get_item_slot(&self) -> PlayerInventorySlotType {
PlayerInventorySlotType::Secondary
}
fn spawn(
&self,
commands: &mut Commands,
transform: Transform,
assets_gltf: &GltfAssets,
loaded_gltf_assets: &Assets<Gltf>,
with_impulse: Vec3,
item_state: Option<ItemState>,
) {
let firearm = Firearm::Glock17;
if let Some(asset_handle) = assets_gltf.assets.iter().find(|asset| {
asset.asset_type == GltfAssetType::Firearm(firearm.clone())
}) {
if let Some(gltf) = loaded_gltf_assets.get(&asset_handle.asset) {
let firearm_data: FirearmData = firearm.firearm_data();
let mut firearm_transform = Transform::from_xyz(0.0, 0.0, 0.0);
firearm_transform.rotate_local_y(
utils::rad_deg::radians_from_degrees(
firearm.holdable_object_data().y_rot,
),
);
firearm_transform.scale =
firearm_transform.scale * firearm_data.scale_factor;
let scene = gltf.scenes[0].clone();
let firearm_asset_entity = commands
.spawn((
SceneBundle {
scene,
visibility: Visibility::Inherited,
transform: firearm_transform,
..default()
},
Name::new(format!(
"{} Item Gltf Asset",
self.inventory_title()
)),
))
.id();
match item_state {
Some(state) => { commands.entity(firearm_asset_entity).insert(state); },
None => {},
};
let firearm_size = firearm.get_size();
commands
.spawn((
firearm.holdable_object_data(),
Name::new(format!("{} Item", self.inventory_title())),
TransformBundle {
local: transform,
..Default::default()
},
VisibilityBundle {
visibility: Visibility::Visible,
..Default::default()
},
RigidBody::Dynamic,
ColliderMassProperties::Mass(5.0),
GravityScale(4.0),
Collider::cuboid(
firearm_size.x,
firearm_size.y,
firearm_size.z,
),
ExternalImpulse {
impulse: with_impulse,
..Default::default()
},
Interactable::Item(firearm.get_item_arc()),
))
.push_children(&[firearm_asset_entity]);
}
}
}
}

View File

@ -1,7 +1,7 @@
use crate::{
comps::core::{
grid::UGrid,
markers::{holdable::HoldableObjectType, interactable::Interactable}, inventory::slot::PlayerInventorySlotType, weapons::{firearm_data::FirearmData, firearm::Firearm},
markers::{holdable::HoldableObjectType, interactable::Interactable}, inventory::slot::PlayerInventorySlotType, weapons::{firearm_data::FirearmData, firearm::Firearm}, events::pickup_item::ItemState,
},
setup::assets::{GltfAssetType, GltfAssets},
utils,
@ -26,6 +26,8 @@ pub trait Item: Sync + Send + Reflect {
fn inventory_rotatable(&self) -> bool;
fn inventory_title(&self) -> String;
fn inventory_description(&self) -> String;
/// Spawn an item on the game world. Every item should implement this
/// The transform passed to this function should be a GlobalTransform.into()
fn spawn(
&self,
commands: &mut Commands,
@ -33,6 +35,7 @@ pub trait Item: Sync + Send + Reflect {
assets_gltf: &GltfAssets,
loaded_gltf_assets: &Assets<Gltf>,
with_impulse: Vec3,
item_state: Option<ItemState>,
) {
match self.get_type() {
ItemType::Holdable(object_type) => {

View File

@ -1,8 +1,8 @@
use bevy::app::{Plugin, Update};
use crate::{setup::load_state::update_game_load_state, comps::core::weapons::{firearm::Firearm, attachments::{weapon_attachment::WeaponAttachment, optic::Optic, stock::Stock, compensator::Compensator, magazine::Magazine, foregrip::ForeGrip}, parts::{charging_handle::ChargingHandle, fire_selector::FireSelector, firing_point::FiringPoint, trigger::Trigger}, slot::{compensator_slot::CompensatorSlot, fore_grip_slot::ForeGripSlot, magazine_slot::MagazineSlot, sight_placement_start_slot::SightPlacementStartSlot, sight_placement_end_slot::SightPlacementEndSlot, stock_slot::StockSlot, utility_slot::UtilitySlot}}};
use crate::{setup::load_state::update_game_load_state, comps::core::weapons::{firearm::Firearm, attachments::{weapon_attachment::WeaponAttachment, optic::Optic, stock::Stock, compensator::Compensator, magazine::Magazine, foregrip::ForeGrip}, parts::{charging_handle::ChargingHandle, fire_selector::FireSelector, firing_point::FiringPoint, trigger::Trigger}, slot::{compensator_slot::CompensatorSlot, fore_grip_slot::ForeGripSlot, magazine_slot::MagazineSlot, sight_placement_start_slot::SightPlacementStartSlot, sight_placement_end_slot::SightPlacementEndSlot, stock_slot::StockSlot, utility_slot::UtilitySlot, slot::WeaponSlot}}};
use super::{character::{player_hitbox::PlayerHitBox, player_character::PlayerCharacter, player_eye::{PlayerEye, insert_components_into_spawned_player}, in_player_hands_parent::{InPlayerHandsParent, insert_components_into_player_hand}, third_person_camera::ThirdPersonCameraProxy}, physics::{rapier::{AutoAABBCollider, physics_replace_proxies}, self}};
use super::{character::{player_hitbox::PlayerHitBox, player_character::PlayerCharacter, player_eye::{PlayerEye, insert_components_into_spawned_player}, in_player_hands_parent::{InPlayerHandsParent, insert_components_into_player_hand}, third_person_camera::ThirdPersonCameraProxy}, physics::{rapier::{AutoAABBCollider, physics_replace_proxies}, self}, weapons::firearm::insert_firearm_state_to_firearms};
@ -25,6 +25,7 @@ impl Plugin for ProxyComponentsPlugin {
// Attachments
app.register_type::<WeaponAttachment>();
app.register_type::<WeaponSlot>();
app.register_type::<Optic>();
app.register_type::<Stock>();
app.register_type::<Compensator>();
@ -54,5 +55,6 @@ impl Plugin for ProxyComponentsPlugin {
app.add_systems(Update, (physics_replace_proxies, update_game_load_state));
app.add_systems(Update, insert_components_into_spawned_player);
app.add_systems(Update, insert_components_into_player_hand);
app.add_systems(Update, insert_firearm_state_to_firearms);
}
}

View File

@ -1,8 +1,109 @@
use bevy::prelude::*;
use bevy::{prelude::*, gltf::Gltf, ecs::system::SystemParam};
use crate::{comps::core::{weapons::{firearm::Firearm, firearm_state::FirearmState, slot::slot::WeaponSlot, attachment_slot::AttachmentSlot, attachments::weapon_attachment::WeaponAttachment}, events::pickup_item::ItemState}, setup::assets::{GltfAssets, GltfAssetType}};
#[derive(Component, Reflect, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum Firearm {
Ak105,
Glock17
#[derive(SystemParam)]
pub struct InsertFirearmStateIntoFirearmsParams<'w, 's> {
firearm_scene_bundle: Query<'w, 's, (Entity, Option<&'static ItemState>, &'static Children)>,
firearm_query: Query<'w, 's, (Entity, &'static Firearm, &'static Parent, Option<&'static FirearmState>), Or<(Without<FirearmState>, Changed<FirearmState>)>>,
slots_query: Query<'w, 's, (Entity, &'static WeaponSlot, &'static Parent)>,
attachments_query: Query<'w, 's, (Entity, &'static WeaponAttachment, &'static Parent)>,
}
/// This query inserts FirearmState into firearms, updates firearm assets that already have a FirearmState,
/// And Re-inserts FirearmState into spawned Firearms that have a passed in ItemState at the root of the SceneBundle
pub fn insert_firearm_state_to_firearms(
// needed for tri meshes
queries: InsertFirearmStateIntoFirearmsParams,
assets_gltf: Res<GltfAssets>,
loaded_gltf_assets: Res<Assets<Gltf>>,
mut commands: Commands,
) {
for (firearm_scene_entity, item_state_opt, scene_bundle_children) in queries.firearm_scene_bundle.iter() {
for scene_bundle_child in scene_bundle_children.iter() {
for (firearm_entity, _, firearm_parent, firearm_state_opt) in queries.firearm_query.iter() {
if &firearm_parent.get() == scene_bundle_child {
if let Some(item_state) = item_state_opt {
// Firearm State is already created and item is being spawned again into world
#[allow(irrefutable_let_patterns)]
if let ItemState::Weapon(firearm_state) = item_state {
commands.entity(firearm_scene_entity).remove::<ItemState>();
commands
.entity(firearm_entity)
.insert(firearm_state.clone());
//TODO: spawn in attachments
println!("Reused firearm_state");
return;
}
}
match firearm_state_opt {
Some(firearm_state) => {
// Change the Slots
spawn_attachments_in_firearm(&mut commands, firearm_entity, firearm_state, &queries.slots_query, &assets_gltf, &loaded_gltf_assets)
},
None => {
// Create the firearm_state
let mut firearm_slots = Vec::new();
for (slot_entity, slot, parent_entity) in queries.slots_query.iter() {
if firearm_entity == parent_entity.get() {
let mut attachment = None;
for (_, weapon_attachment, attachment_parent) in queries.attachments_query.iter() {
if slot_entity == attachment_parent.get() {
attachment = Some(weapon_attachment.clone())
}
}
firearm_slots.push(AttachmentSlot {
attachment,
slot_type: slot.clone(),
});
}
}
commands
.entity(firearm_entity)
.insert(FirearmState::new(firearm_slots));
},
};
}
}
}
}
}
fn spawn_attachments_in_firearm(
commands: &mut Commands,
firearm_entity: Entity,
firearm_state: &FirearmState,
slots_query: &Query<(Entity, &WeaponSlot, &Parent)>,
assets_gltf: &GltfAssets,
loaded_gltf_assets: &Assets<Gltf>,
) {
for (slot_entity, weapon_slot, slot_parent) in slots_query.iter() {
if slot_parent.get() != firearm_entity {
continue;
}
for attachment_slot in firearm_state.attachment_slots.iter() {
if &attachment_slot.slot_type == weapon_slot {
commands.entity(slot_entity).despawn_descendants();
match &attachment_slot.attachment {
Some(attachment) =>
if let Some(asset_handle) = assets_gltf.assets.iter().find(|asset| {
asset.asset_type == GltfAssetType::Attachment(attachment.clone())
}) {
if let Some(gltf) = loaded_gltf_assets.get(&asset_handle.asset) {
let scene_bundle = commands.spawn(
SceneBundle {
scene: gltf.scenes[0].clone(),
..Default::default()
}
).id();
commands.entity(slot_entity).add_child(
scene_bundle
);
}},
None => {},
};
}
}
}
}

View File

@ -31,6 +31,7 @@ pub fn item_spawner(
&assets_gltf,
&loaded_gltf_assets,
Vec3::ZERO,
None
)
}
//m4.spawn(&mut commands, item_sp.at, &assets_gltf, &loaded_gltf_assets);

View File

@ -0,0 +1,9 @@
use bevy::prelude::*;
use super::{attachments::weapon_attachment::WeaponAttachment, slot::slot::WeaponSlot};
#[derive(Reflect, PartialEq, Eq, PartialOrd, Ord, Debug, Clone, Default)]
pub struct AttachmentSlot {
pub attachment: Option<WeaponAttachment>,
pub slot_type: WeaponSlot,
}

View File

@ -1,8 +1,8 @@
use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}};
use bevy::{reflect::{Reflect, std_traits::ReflectDefault}, ecs::{component::Component, reflect::ReflectComponent}};
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)]
#[reflect(Component)]
#[reflect(Component, Default)]
pub enum Compensator {
#[default]
FirstCompensator,

View File

@ -1,8 +1,8 @@
use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}};
use bevy::{reflect::{Reflect, std_traits::ReflectDefault}, ecs::{component::Component, reflect::ReflectComponent}};
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)]
#[reflect(Component)]
#[reflect(Component, Default)]
pub enum ForeGrip {
#[default]
Pk5,

View File

@ -1,9 +1,17 @@
use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}};
use bevy::{reflect::{Reflect, std_traits::ReflectDefault}, ecs::{component::Component, reflect::ReflectComponent}};
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)]
#[reflect(Component)]
#[reflect(Component, Default)]
pub enum Magazine {
#[default]
Ak105,
}
impl Magazine {
pub fn capacity(&self) -> u32 {
match self {
Magazine::Ak105 => 30,
}
}
}

View File

@ -1,8 +1,8 @@
use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}};
use bevy::{reflect::{Reflect, std_traits::ReflectDefault}, ecs::{component::Component, reflect::ReflectComponent}};
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)]
#[reflect(Component)]
#[reflect(Component, Default)]
pub enum Optic {
#[default]
AimpointT1,

View File

@ -1,8 +1,8 @@
use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}};
use bevy::{reflect::{Reflect, std_traits::ReflectDefault}, ecs::{component::Component, reflect::ReflectComponent}};
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)]
#[reflect(Component)]
#[reflect(Component, Default)]
pub enum Stock {
#[default]
MagpullTan,

View File

@ -3,7 +3,7 @@ use bevy::prelude::*;
use super::{compensator::Compensator, magazine::Magazine, stock::Stock, foregrip::ForeGrip, optic::Optic};
#[derive(Component, PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Debug)]
#[reflect(Component)]
#[reflect(Component, Default)]
pub enum WeaponAttachment {
Compensator(Compensator),
Magazine(Magazine),

View File

@ -2,7 +2,7 @@ use std::sync::Arc;
use bevy::prelude::*;
use crate::comps::core::{markers::holdable::HoldableObjectData, items::{item::Item, guns::glock17::Glock17GunItem}};
use crate::comps::core::{markers::holdable::HoldableObjectData, items::{item::Item, guns::{glock17::Glock17GunItem, ak105::Ak105GunItem}}};
use super::{firearm_data::{FirearmData, FirearmType}, caliber::Caliber, spray_pattern::FirearmSprayPattern};
@ -157,14 +157,14 @@ impl Firearm {
match self {
//Firearm::M4A1 => Arc::new(M4a1GunItem),
Firearm::Glock17 => Arc::new(Glock17GunItem),
Firearm::Ak105 => todo!(),
Firearm::Ak105 => Arc::new(Ak105GunItem),
}
}
pub fn get_item_box(&self) -> Box<dyn Item> {
match self {
//Firearm::M4A1 => Box::new(M4a1GunItem),
Firearm::Glock17 => Box::new(Glock17GunItem),
Firearm::Ak105 => todo!(),
Firearm::Ak105 => Box::new(Ak105GunItem),
}
}
}

View File

@ -0,0 +1,15 @@
use bevy::prelude::*;
use super::{attachment_slot::AttachmentSlot, slot::slot::WeaponSlot};
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Debug, Clone)]
pub struct FirearmState {
pub attachment_slots: Vec<AttachmentSlot>,
}
impl FirearmState {
pub fn new(attachment_slots: Vec<AttachmentSlot>) -> Self {
Self { attachment_slots }
}
}

View File

@ -5,4 +5,6 @@ pub mod caliber;
pub mod spray_pattern;
pub mod magazine_data;
pub mod slot;
pub mod parts;
pub mod parts;
pub mod firearm_state;
pub mod attachment_slot;

View File

@ -4,4 +4,5 @@ pub mod stock_slot;
pub mod fore_grip_slot;
pub mod utility_slot;
pub mod sight_placement_start_slot;
pub mod sight_placement_end_slot;
pub mod sight_placement_end_slot;
pub mod slot;

View File

@ -0,0 +1,14 @@
use bevy::{reflect::Reflect, ecs::{reflect::ReflectComponent, component::Component}};
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Reflect, Default, Component)]
#[reflect(Component)]
pub enum WeaponSlot {
ForeGripSlot,
MagazineSlot,
CompensatorSlot,
SightPlacementEndSlot,
SightPlacementStartSlot,
#[default]
StockSlot,
UtilitySlot,
}

View File

@ -336,6 +336,7 @@ pub fn interact_action(
entity: interactable_entity,
item: item.clone(),
player: player_entity,
state: None
});
}
}

View File

@ -4,7 +4,7 @@ use crate::{
comps::core::{
markers::player::{Player, PlayerData},
spawners::{
guns::glock17_spawner::Glock17SpawnPoint,
guns::{glock17_spawner::Glock17SpawnPoint, ak105_spawner::Ak105SpawnPoint},
player::PlayerSpawnPoint,
},
},
@ -30,13 +30,13 @@ pub fn set_spawn_points(mut commands: Commands) {
transform
},
});
/*commands.spawn(M4a1SpawnPoint {
commands.spawn(Ak105SpawnPoint {
transform: {
let mut transform = Transform::from_xyz(18.0, 10.0, 18.0);
transform.rotate_z(utils::rad_deg::radians_from_degrees(-90.0));
transform
},
});*/
});
commands.spawn(Glock17SpawnPoint {
transform: {
let mut transform = Transform::from_xyz(20.0, 10.0, 20.0);

View File

@ -6,7 +6,7 @@ use crate::{
comps::core::{markers::{
holdable::{HoldableObjectData, InPlayerHands},
player::{Player, PlayerData, PlayerHand},
}, weapons::{firearm_data::FirearmData, magazine_data::MagazineData, caliber::Caliber, firearm::Firearm, spray_pattern::FirearmSprayPattern}},
}, weapons::{firearm_data::FirearmData, magazine_data::MagazineData, caliber::Caliber, firearm::Firearm, spray_pattern::FirearmSprayPattern, firearm_state::FirearmState}},
logic::core::{
guns::player_firing::PlayerFiringInfo,
player::{
@ -51,6 +51,7 @@ impl Plugin for MainEditorUiPlugin {
.register_type::<PlayerLinearXZState>()
.register_type::<PlayerMovementInput>()
.register_type::<Cubemap>()
.register_type::<FirearmState>()
//.register_type::<AllAnimations>()
//.register_type::<FirearmAnimations>()
.register_type::<GltfAssetType>()

View File

@ -1,5 +1,6 @@
use bevy::prelude::*;
#[allow(unused)]
pub fn find_child_in_parent_children(
commands: &mut Commands,
parent_entity: Entity,
@ -10,6 +11,7 @@ pub fn find_child_in_parent_children(
all_children.contains(&descendant_entity)
}
#[allow(unused)]
fn flatten_if_possible_inf_levels(
commands: &mut Commands,
parent_entity: Entity,