diff --git a/Cargo.lock b/Cargo.lock index afa0e86..23dd768 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml index 81de01e..40cf3f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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"] } diff --git a/assets/attachments/aimpoint_t1.glb b/assets/attachments/aimpoint_t1.glb index ad4b553..404dbf9 100644 Binary files a/assets/attachments/aimpoint_t1.glb and b/assets/attachments/aimpoint_t1.glb differ diff --git a/assets/attachments/ak105_magazine.glb b/assets/attachments/ak105_magazine.glb index b5f9cd4..5a4d3bb 100644 Binary files a/assets/attachments/ak105_magazine.glb and b/assets/attachments/ak105_magazine.glb differ diff --git a/assets/attachments/first_compensator.glb b/assets/attachments/first_compensator.glb index 202fbe6..d33372a 100644 Binary files a/assets/attachments/first_compensator.glb and b/assets/attachments/first_compensator.glb differ diff --git a/assets/attachments/pk5_foregrip.glb b/assets/attachments/pk5_foregrip.glb index 3799666..91a69a2 100644 Binary files a/assets/attachments/pk5_foregrip.glb and b/assets/attachments/pk5_foregrip.glb differ diff --git a/assets/attachments/tan_magpull_stock.glb b/assets/attachments/tan_magpull_stock.glb index 6b4480a..6562cf7 100644 Binary files a/assets/attachments/tan_magpull_stock.glb and b/assets/attachments/tan_magpull_stock.glb differ diff --git a/assets/character/main_character.glb b/assets/character/main_character.glb index 1eb3cc7..7d5b880 100644 Binary files a/assets/character/main_character.glb and b/assets/character/main_character.glb differ diff --git a/assets/weapons/ak105_rifle.glb b/assets/weapons/ak105_rifle.glb index 6538703..3d37094 100644 Binary files a/assets/weapons/ak105_rifle.glb and b/assets/weapons/ak105_rifle.glb differ diff --git a/src/comps/core/events/pickup_item.rs b/src/comps/core/events/pickup_item.rs index 17029e4..959bd15 100644 --- a/src/comps/core/events/pickup_item.rs +++ b/src/comps/core/events/pickup_item.rs @@ -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, pub player: Entity, + pub state: Option } diff --git a/src/comps/core/inventory/player_inventory.rs b/src/comps/core/inventory/player_inventory.rs index 2b6d0d6..2ab979b 100644 --- a/src/comps/core/inventory/player_inventory.rs +++ b/src/comps/core/inventory/player_inventory.rs @@ -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); diff --git a/src/comps/core/items/guns/ak105.rs b/src/comps/core/items/guns/ak105.rs index fd2e595..3ec86c1 100644 --- a/src/comps/core/items/guns/ak105.rs +++ b/src/comps/core/items/guns/ak105.rs @@ -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, + with_impulse: Vec3, + item_state: Option, + ) { + 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]); + } + } + } } diff --git a/src/comps/core/items/guns/glock17.rs b/src/comps/core/items/guns/glock17.rs index aff643b..671fb3d 100644 --- a/src/comps/core/items/guns/glock17.rs +++ b/src/comps/core/items/guns/glock17.rs @@ -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, + with_impulse: Vec3, + item_state: Option, + ) { + 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]); + } + } + } } diff --git a/src/comps/core/items/item.rs b/src/comps/core/items/item.rs index 3e35919..7f329ca 100644 --- a/src/comps/core/items/item.rs +++ b/src/comps/core/items/item.rs @@ -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, with_impulse: Vec3, + item_state: Option, ) { match self.get_type() { ItemType::Holdable(object_type) => { diff --git a/src/comps/core/markers/proxy/plugin.rs b/src/comps/core/markers/proxy/plugin.rs index d084aea..69ada81 100644 --- a/src/comps/core/markers/proxy/plugin.rs +++ b/src/comps/core/markers/proxy/plugin.rs @@ -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::(); + app.register_type::(); app.register_type::(); app.register_type::(); app.register_type::(); @@ -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); } } \ No newline at end of file diff --git a/src/comps/core/markers/proxy/weapons/firearm.rs b/src/comps/core/markers/proxy/weapons/firearm.rs index 6912e0a..21c3025 100644 --- a/src/comps/core/markers/proxy/weapons/firearm.rs +++ b/src/comps/core/markers/proxy/weapons/firearm.rs @@ -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, Changed)>>, + 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, + loaded_gltf_assets: Res>, + 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::(); + 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, +) { + 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 => {}, + }; + } + } + } } \ No newline at end of file diff --git a/src/comps/core/spawners/item.rs b/src/comps/core/spawners/item.rs index fa19278..14a79fd 100644 --- a/src/comps/core/spawners/item.rs +++ b/src/comps/core/spawners/item.rs @@ -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); diff --git a/src/comps/core/weapons/attachment_slot.rs b/src/comps/core/weapons/attachment_slot.rs new file mode 100644 index 0000000..b4d30f9 --- /dev/null +++ b/src/comps/core/weapons/attachment_slot.rs @@ -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, + pub slot_type: WeaponSlot, +} \ No newline at end of file diff --git a/src/comps/core/weapons/attachments/compensator.rs b/src/comps/core/weapons/attachments/compensator.rs index 83f0f29..cbe7839 100644 --- a/src/comps/core/weapons/attachments/compensator.rs +++ b/src/comps/core/weapons/attachments/compensator.rs @@ -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, diff --git a/src/comps/core/weapons/attachments/foregrip.rs b/src/comps/core/weapons/attachments/foregrip.rs index 62cb3b7..4307623 100644 --- a/src/comps/core/weapons/attachments/foregrip.rs +++ b/src/comps/core/weapons/attachments/foregrip.rs @@ -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, diff --git a/src/comps/core/weapons/attachments/magazine.rs b/src/comps/core/weapons/attachments/magazine.rs index be7f861..995b899 100644 --- a/src/comps/core/weapons/attachments/magazine.rs +++ b/src/comps/core/weapons/attachments/magazine.rs @@ -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, + } + } } \ No newline at end of file diff --git a/src/comps/core/weapons/attachments/optic.rs b/src/comps/core/weapons/attachments/optic.rs index 6f83eee..7f600e8 100644 --- a/src/comps/core/weapons/attachments/optic.rs +++ b/src/comps/core/weapons/attachments/optic.rs @@ -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, diff --git a/src/comps/core/weapons/attachments/stock.rs b/src/comps/core/weapons/attachments/stock.rs index ed86c9a..2f4637d 100644 --- a/src/comps/core/weapons/attachments/stock.rs +++ b/src/comps/core/weapons/attachments/stock.rs @@ -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, diff --git a/src/comps/core/weapons/attachments/weapon_attachment.rs b/src/comps/core/weapons/attachments/weapon_attachment.rs index 5ea29ea..fabb90e 100644 --- a/src/comps/core/weapons/attachments/weapon_attachment.rs +++ b/src/comps/core/weapons/attachments/weapon_attachment.rs @@ -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), diff --git a/src/comps/core/weapons/firearm.rs b/src/comps/core/weapons/firearm.rs index ac4903b..d6af92e 100644 --- a/src/comps/core/weapons/firearm.rs +++ b/src/comps/core/weapons/firearm.rs @@ -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 { match self { //Firearm::M4A1 => Box::new(M4a1GunItem), Firearm::Glock17 => Box::new(Glock17GunItem), - Firearm::Ak105 => todo!(), + Firearm::Ak105 => Box::new(Ak105GunItem), } } } \ No newline at end of file diff --git a/src/comps/core/weapons/firearm_state.rs b/src/comps/core/weapons/firearm_state.rs new file mode 100644 index 0000000..413d6d3 --- /dev/null +++ b/src/comps/core/weapons/firearm_state.rs @@ -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, +} + +impl FirearmState { + pub fn new(attachment_slots: Vec) -> Self { + Self { attachment_slots } + } + +} \ No newline at end of file diff --git a/src/comps/core/weapons/mod.rs b/src/comps/core/weapons/mod.rs index c7c3f58..dc00eef 100644 --- a/src/comps/core/weapons/mod.rs +++ b/src/comps/core/weapons/mod.rs @@ -5,4 +5,6 @@ pub mod caliber; pub mod spray_pattern; pub mod magazine_data; pub mod slot; -pub mod parts; \ No newline at end of file +pub mod parts; +pub mod firearm_state; +pub mod attachment_slot; \ No newline at end of file diff --git a/src/comps/core/weapons/slot/mod.rs b/src/comps/core/weapons/slot/mod.rs index 1568dbc..de1a9f9 100644 --- a/src/comps/core/weapons/slot/mod.rs +++ b/src/comps/core/weapons/slot/mod.rs @@ -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; \ No newline at end of file +pub mod sight_placement_end_slot; +pub mod slot; \ No newline at end of file diff --git a/src/comps/core/weapons/slot/slot.rs b/src/comps/core/weapons/slot/slot.rs new file mode 100644 index 0000000..8309669 --- /dev/null +++ b/src/comps/core/weapons/slot/slot.rs @@ -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, +} \ No newline at end of file diff --git a/src/logic/core/player/hands.rs b/src/logic/core/player/hands.rs index ed16da6..c4c143f 100644 --- a/src/logic/core/player/hands.rs +++ b/src/logic/core/player/hands.rs @@ -336,6 +336,7 @@ pub fn interact_action( entity: interactable_entity, item: item.clone(), player: player_entity, + state: None }); } } diff --git a/src/scenes/scene1/spawn_points.rs b/src/scenes/scene1/spawn_points.rs index 5cb9499..80bf218 100644 --- a/src/scenes/scene1/spawn_points.rs +++ b/src/scenes/scene1/spawn_points.rs @@ -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); diff --git a/src/ui/editor/plugin.rs b/src/ui/editor/plugin.rs index e59cc23..d13705e 100644 --- a/src/ui/editor/plugin.rs +++ b/src/ui/editor/plugin.rs @@ -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::() .register_type::() .register_type::() + .register_type::() //.register_type::() //.register_type::() .register_type::() diff --git a/src/utils/hierarchy.rs b/src/utils/hierarchy.rs index 3ce4b76..e8bf674 100644 --- a/src/utils/hierarchy.rs +++ b/src/utils/hierarchy.rs @@ -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,