Compiles. All weapons, and attachments setup correctly
This commit is contained in:
parent
1b83befaad
commit
d262378352
@ -24,5 +24,16 @@ Limit mods to attachments, for now, I don't want to change barrel lengths or for
|
|||||||
Only do silencers/compensators, sights, Foregrips.
|
Only do silencers/compensators, sights, Foregrips.
|
||||||
|
|
||||||
### Blender:
|
### Blender:
|
||||||
|
Use a single file for attachments and a single file for weapons, then export them one by one as a new gltf asset
|
||||||
|
|
||||||
|
|
||||||
- Mark every weapon parent with a FirearmEnum custom property
|
- Mark every weapon parent with a FirearmEnum custom property
|
||||||
- Mark Firing point
|
- Mark Firing point without attachments (FiringPoint)
|
||||||
|
- Mark Sight placement start and end
|
||||||
|
- Mark Attachment slots (CompensatorSlot, ForeGripSlot, MagazineSlot, StockSlot, SightPlacementStart, SightPlacementEnd, UtilitySlot)
|
||||||
|
- Attempt to center all the slots
|
||||||
|
- Mark Gun part slots (ChargingHandle, Trigger)
|
||||||
|
|
||||||
|
- Set all attachments origin to where they will be placed on the gun
|
||||||
|
- Mark them with the specific WeaponAttachment variant
|
||||||
|
- Set all attachments transform to 0 and the same scale as the gun
|
||||||
|
BIN
assets/attachments/aimpoint_t1.glb
Normal file
BIN
assets/attachments/aimpoint_t1.glb
Normal file
Binary file not shown.
BIN
assets/attachments/ak105_magazine.glb
Normal file
BIN
assets/attachments/ak105_magazine.glb
Normal file
Binary file not shown.
BIN
assets/attachments/first_compensator.glb
Normal file
BIN
assets/attachments/first_compensator.glb
Normal file
Binary file not shown.
BIN
assets/attachments/pk5_foregrip.glb
Normal file
BIN
assets/attachments/pk5_foregrip.glb
Normal file
Binary file not shown.
BIN
assets/attachments/tan_magpull_stock.glb
Normal file
BIN
assets/attachments/tan_magpull_stock.glb
Normal file
Binary file not shown.
Binary file not shown.
BIN
assets/weapons/ak105_rifle.glb
Normal file
BIN
assets/weapons/ak105_rifle.glb
Normal file
Binary file not shown.
@ -1,6 +1,6 @@
|
|||||||
use bevy::{prelude::*, gltf::Gltf};
|
use bevy::{prelude::*, gltf::Gltf};
|
||||||
|
|
||||||
use crate::{comps::core::{items::item::Item, events::inventory_changed::PlayerInventoryChangedEvent, markers::firearm::FirearmType}, setup::assets::GltfAssets};
|
use crate::{comps::core::{items::item::Item, events::inventory_changed::PlayerInventoryChangedEvent, weapons::firearm_data::FirearmType}, setup::assets::GltfAssets};
|
||||||
|
|
||||||
use super::{item_inventory::ItemInventory, slot::PlayerInventorySlotType};
|
use super::{item_inventory::ItemInventory, slot::PlayerInventorySlotType};
|
||||||
|
|
||||||
|
48
src/comps/core/items/guns/ak105.rs
Normal file
48
src/comps/core/items/guns/ak105.rs
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
use crate::comps::core::{
|
||||||
|
grid::UGrid,
|
||||||
|
items::item::{Item, ItemType},
|
||||||
|
markers::holdable::HoldableObjectType, inventory::slot::PlayerInventorySlotType, weapons::firearm::Firearm,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect)]
|
||||||
|
pub struct Ak105GunItem;
|
||||||
|
|
||||||
|
impl Item for Ak105GunItem {
|
||||||
|
fn get_type(&self) -> ItemType {
|
||||||
|
ItemType::Holdable(HoldableObjectType::Firearm(Firearm::Glock17))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn asset_path(&self) -> &str {
|
||||||
|
"weapons/ak105_rifle.glb"
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc = " Optional Stackable. If value is Some(x) x is the max quantity per stack"]
|
||||||
|
fn stackable(&self) -> Option<u32> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
fn inventory_size(&self) -> UGrid {
|
||||||
|
UGrid {
|
||||||
|
width: 4,
|
||||||
|
height: 2,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn inventory_rotatable(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn inventory_title(&self) -> String {
|
||||||
|
String::from("AK105")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn inventory_description(&self) -> String {
|
||||||
|
String::from("Rifle chambered in 5.45x39mm.")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_item_slot(&self) -> PlayerInventorySlotType {
|
||||||
|
PlayerInventorySlotType::Primary
|
||||||
|
}
|
||||||
|
}
|
@ -1,12 +1,9 @@
|
|||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
use crate::{
|
use crate::comps::core::{
|
||||||
comps::core::{
|
|
||||||
grid::UGrid,
|
grid::UGrid,
|
||||||
items::item::{Item, ItemType},
|
items::item::{Item, ItemType},
|
||||||
markers::holdable::HoldableObjectType, inventory::slot::PlayerInventorySlotType,
|
markers::holdable::HoldableObjectType, inventory::slot::PlayerInventorySlotType, weapons::firearm::Firearm,
|
||||||
},
|
|
||||||
logic::core::guns::firearm::Firearm,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Component, Reflect)]
|
#[derive(Component, Reflect)]
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
use bevy::prelude::*;
|
/*use bevy::prelude::*;
|
||||||
|
|
||||||
use crate::{
|
use crate::comps::core::{
|
||||||
comps::core::{
|
|
||||||
grid::UGrid,
|
grid::UGrid,
|
||||||
items::item::{Item, ItemType},
|
items::item::{Item, ItemType},
|
||||||
markers::holdable::HoldableObjectType, inventory::slot::PlayerInventorySlotType,
|
markers::holdable::HoldableObjectType, inventory::slot::PlayerInventorySlotType, weapons::firearm::Firearm,
|
||||||
},
|
|
||||||
logic::core::guns::firearm::Firearm,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Component, Reflect)]
|
#[derive(Component, Reflect)]
|
||||||
@ -48,3 +45,4 @@ impl Item for M4a1GunItem {
|
|||||||
PlayerInventorySlotType::Primary
|
PlayerInventorySlotType::Primary
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
@ -1,2 +1,3 @@
|
|||||||
pub mod glock17;
|
pub mod glock17;
|
||||||
pub mod m4a1;
|
pub mod m4a1;
|
||||||
|
pub mod ak105;
|
@ -1,9 +1,8 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
comps::core::{
|
comps::core::{
|
||||||
grid::UGrid,
|
grid::UGrid,
|
||||||
markers::{firearm::FirearmData, holdable::HoldableObjectType, interactable::Interactable}, inventory::slot::PlayerInventorySlotType,
|
markers::{holdable::HoldableObjectType, interactable::Interactable}, inventory::slot::PlayerInventorySlotType, weapons::{firearm_data::FirearmData, firearm::Firearm},
|
||||||
},
|
},
|
||||||
logic::core::guns::firearm::Firearm,
|
|
||||||
setup::assets::{GltfAssetType, GltfAssets},
|
setup::assets::{GltfAssetType, GltfAssets},
|
||||||
utils,
|
utils,
|
||||||
};
|
};
|
||||||
|
@ -4,7 +4,7 @@ use bevy::{
|
|||||||
time::Timer,
|
time::Timer,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::logic::core::guns::caliber::Caliber;
|
use crate::comps::core::weapons::caliber::Caliber;
|
||||||
|
|
||||||
#[derive(Component, Reflect)]
|
#[derive(Component, Reflect)]
|
||||||
pub struct BulletMarker {
|
pub struct BulletMarker {
|
||||||
|
@ -1,60 +0,0 @@
|
|||||||
use bevy::{
|
|
||||||
prelude::{Component, Quat, Vec3},
|
|
||||||
reflect::Reflect,
|
|
||||||
};
|
|
||||||
|
|
||||||
use crate::logic::core::guns::{caliber::Caliber, spray_pattern::FirearmSprayPattern};
|
|
||||||
|
|
||||||
#[derive(Default, Debug, Clone, Reflect)]
|
|
||||||
pub struct FiringPoint {
|
|
||||||
pub forward: f32,
|
|
||||||
pub up: f32,
|
|
||||||
pub right: f32,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Reflect, Clone)]
|
|
||||||
pub enum FirearmType {
|
|
||||||
Primary,
|
|
||||||
Secondary,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Component, Clone, Reflect)]
|
|
||||||
pub struct FirearmData {
|
|
||||||
/// Where the bullets will come out of, and muzzle flash will be spawned out of.
|
|
||||||
/// Also, this transform's .forward() should be pointing the same Vec3 as the barrel is
|
|
||||||
/// Global transform
|
|
||||||
pub firing_point: FiringPoint,
|
|
||||||
pub caliber: Caliber,
|
|
||||||
/// Placeholder until mags get implemented
|
|
||||||
pub max_capacity: usize,
|
|
||||||
/// Rounds per minute
|
|
||||||
pub fire_rate: f32,
|
|
||||||
/// Amount of seconds it takes for gun to come down from shooting
|
|
||||||
/// Also is the time it takes for the gun to aim in or aim out.
|
|
||||||
pub rebound_time_seconds: f32,
|
|
||||||
|
|
||||||
pub asset_path: String,
|
|
||||||
|
|
||||||
pub vertical_recoil_modifier: f32,
|
|
||||||
pub horizontal_recoil_modifier: f32,
|
|
||||||
pub recoil_pattern: FirearmSprayPattern,
|
|
||||||
|
|
||||||
/// Final rotation of hands when aimed in
|
|
||||||
pub final_aimed_rotation: Quat,
|
|
||||||
/// Final rotation of hands when not aimed in
|
|
||||||
pub final_rotation: Quat,
|
|
||||||
/// Final position of hands when aimed in
|
|
||||||
pub final_aimed_position: Vec3,
|
|
||||||
/// Final position of hands when not aimed in
|
|
||||||
pub final_position: Vec3,
|
|
||||||
|
|
||||||
pub scale_factor: f32,
|
|
||||||
|
|
||||||
pub firearm_type: FirearmType,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Component, Reflect)]
|
|
||||||
pub struct MagazineData {
|
|
||||||
pub rounds_shot: usize,
|
|
||||||
pub max_capacity: usize,
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
use crate::logic::core::guns::firearm::Firearm;
|
use crate::comps::core::weapons::firearm::Firearm;
|
||||||
|
|
||||||
/// Anything that can go in the player's hands.
|
/// Anything that can go in the player's hands.
|
||||||
#[derive(Component, Default, Debug, Reflect)]
|
#[derive(Component, Default, Debug, Reflect)]
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
pub mod bullet;
|
pub mod bullet;
|
||||||
pub mod camera;
|
pub mod camera;
|
||||||
pub mod firearm;
|
|
||||||
pub mod holdable;
|
pub mod holdable;
|
||||||
pub mod interactable;
|
pub mod interactable;
|
||||||
pub mod inventory_screen;
|
pub mod inventory_screen;
|
||||||
|
@ -2,3 +2,4 @@ pub mod character;
|
|||||||
pub mod plugin;
|
pub mod plugin;
|
||||||
pub mod physics;
|
pub mod physics;
|
||||||
pub mod bevy;
|
pub mod bevy;
|
||||||
|
pub mod weapons;
|
@ -1,6 +1,6 @@
|
|||||||
use bevy::app::{Plugin, Update};
|
use bevy::app::{Plugin, Update};
|
||||||
|
|
||||||
use crate::setup::load_state::update_game_load_state;
|
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 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}};
|
||||||
|
|
||||||
@ -20,6 +20,32 @@ impl Plugin for ProxyComponentsPlugin {
|
|||||||
app.register_type::<InPlayerHandsParent>();
|
app.register_type::<InPlayerHandsParent>();
|
||||||
app.register_type::<ThirdPersonCameraProxy>();
|
app.register_type::<ThirdPersonCameraProxy>();
|
||||||
|
|
||||||
|
// Firearms
|
||||||
|
app.register_type::<Firearm>();
|
||||||
|
|
||||||
|
// Attachments
|
||||||
|
app.register_type::<WeaponAttachment>();
|
||||||
|
app.register_type::<Optic>();
|
||||||
|
app.register_type::<Stock>();
|
||||||
|
app.register_type::<Compensator>();
|
||||||
|
app.register_type::<Magazine>();
|
||||||
|
app.register_type::<ForeGrip>();
|
||||||
|
|
||||||
|
// Parts
|
||||||
|
app.register_type::<ChargingHandle>();
|
||||||
|
app.register_type::<FireSelector>();
|
||||||
|
app.register_type::<FiringPoint>();
|
||||||
|
app.register_type::<Trigger>();
|
||||||
|
|
||||||
|
// Slots
|
||||||
|
app.register_type::<CompensatorSlot>();
|
||||||
|
app.register_type::<ForeGripSlot>();
|
||||||
|
app.register_type::<MagazineSlot>();
|
||||||
|
app.register_type::<SightPlacementStartSlot>();
|
||||||
|
app.register_type::<SightPlacementEndSlot>();
|
||||||
|
app.register_type::<StockSlot>();
|
||||||
|
app.register_type::<UtilitySlot>();
|
||||||
|
|
||||||
// Physics
|
// Physics
|
||||||
app.register_type::<AutoAABBCollider>();
|
app.register_type::<AutoAABBCollider>();
|
||||||
app.register_type::<physics::rapier::Collider>();
|
app.register_type::<physics::rapier::Collider>();
|
||||||
|
8
src/comps/core/markers/proxy/weapons/firearm.rs
Normal file
8
src/comps/core/markers/proxy/weapons/firearm.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub enum Firearm {
|
||||||
|
Ak105,
|
||||||
|
Glock17
|
||||||
|
}
|
1
src/comps/core/markers/proxy/weapons/mod.rs
Normal file
1
src/comps/core/markers/proxy/weapons/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod firearm;
|
@ -5,3 +5,5 @@ pub mod inventory;
|
|||||||
pub mod items;
|
pub mod items;
|
||||||
pub mod markers;
|
pub mod markers;
|
||||||
pub mod spawners;
|
pub mod spawners;
|
||||||
|
#[allow(unused)]
|
||||||
|
pub mod weapons;
|
21
src/comps/core/spawners/guns/ak105_spawner.rs
Normal file
21
src/comps/core/spawners/guns/ak105_spawner.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
use crate::comps::core::{
|
||||||
|
items::{guns::ak105::Ak105GunItem, item::Item},
|
||||||
|
spawners::item::ItemSpawnPoint,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Component)]
|
||||||
|
pub struct Ak105SpawnPoint {
|
||||||
|
pub transform: Transform,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ItemSpawnPoint for Ak105SpawnPoint {
|
||||||
|
fn get_transform(&self) -> Transform {
|
||||||
|
self.transform
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_item(&self) -> Box<dyn Item> {
|
||||||
|
Box::new(Ak105GunItem)
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
use bevy::prelude::*;
|
/*use bevy::prelude::*;
|
||||||
|
|
||||||
use crate::comps::core::{
|
use crate::comps::core::{
|
||||||
items::{guns::m4a1::M4a1GunItem, item::Item},
|
items::{guns::m4a1::M4a1GunItem, item::Item},
|
||||||
@ -18,4 +18,4 @@ impl ItemSpawnPoint for M4a1SpawnPoint {
|
|||||||
fn get_item(&self) -> Box<dyn Item> {
|
fn get_item(&self) -> Box<dyn Item> {
|
||||||
Box::new(M4a1GunItem)
|
Box::new(M4a1GunItem)
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
pub mod glock17_spawner;
|
pub mod glock17_spawner;
|
||||||
pub mod m4a1_spawner;
|
pub mod m4a1_spawner;
|
||||||
|
pub mod ak105_spawner;
|
@ -3,7 +3,7 @@ use bevy::{gltf::Gltf, prelude::*};
|
|||||||
use crate::{
|
use crate::{
|
||||||
comps::core::{
|
comps::core::{
|
||||||
items::item::Item,
|
items::item::Item,
|
||||||
spawners::guns::{glock17_spawner::Glock17SpawnPoint, m4a1_spawner::M4a1SpawnPoint},
|
spawners::guns::{glock17_spawner::Glock17SpawnPoint, ak105_spawner::Ak105SpawnPoint},
|
||||||
},
|
},
|
||||||
setup::{assets::GltfAssets, load_state::GameLoadState},
|
setup::{assets::GltfAssets, load_state::GameLoadState},
|
||||||
};
|
};
|
||||||
@ -43,7 +43,8 @@ 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.register_component_as::<dyn ItemSpawnPoint, M4a1SpawnPoint>()
|
app
|
||||||
|
.register_component_as::<dyn ItemSpawnPoint, Ak105SpawnPoint>()//.register_component_as::<dyn ItemSpawnPoint, M4a1SpawnPoint>()
|
||||||
.register_component_as::<dyn ItemSpawnPoint, Glock17SpawnPoint>();
|
.register_component_as::<dyn ItemSpawnPoint, Glock17SpawnPoint>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
9
src/comps/core/weapons/attachments/compensator.rs
Normal file
9
src/comps/core/weapons/attachments/compensator.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}};
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub enum Compensator {
|
||||||
|
#[default]
|
||||||
|
FirstCompensator,
|
||||||
|
}
|
9
src/comps/core/weapons/attachments/foregrip.rs
Normal file
9
src/comps/core/weapons/attachments/foregrip.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}};
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub enum ForeGrip {
|
||||||
|
#[default]
|
||||||
|
Pk5,
|
||||||
|
}
|
9
src/comps/core/weapons/attachments/magazine.rs
Normal file
9
src/comps/core/weapons/attachments/magazine.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}};
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub enum Magazine {
|
||||||
|
#[default]
|
||||||
|
Ak105,
|
||||||
|
}
|
6
src/comps/core/weapons/attachments/mod.rs
Normal file
6
src/comps/core/weapons/attachments/mod.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
pub mod weapon_attachment;
|
||||||
|
pub mod optic;
|
||||||
|
pub mod magazine;
|
||||||
|
pub mod compensator;
|
||||||
|
pub mod stock;
|
||||||
|
pub mod foregrip;
|
9
src/comps/core/weapons/attachments/optic.rs
Normal file
9
src/comps/core/weapons/attachments/optic.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}};
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub enum Optic {
|
||||||
|
#[default]
|
||||||
|
AimpointT1,
|
||||||
|
}
|
9
src/comps/core/weapons/attachments/stock.rs
Normal file
9
src/comps/core/weapons/attachments/stock.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
use bevy::{reflect::Reflect, ecs::{component::Component, reflect::ReflectComponent}};
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Reflect, Component, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub enum Stock {
|
||||||
|
#[default]
|
||||||
|
MagpullTan,
|
||||||
|
}
|
59
src/comps/core/weapons/attachments/weapon_attachment.rs
Normal file
59
src/comps/core/weapons/attachments/weapon_attachment.rs
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
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)]
|
||||||
|
pub enum WeaponAttachment {
|
||||||
|
Compensator(Compensator),
|
||||||
|
Magazine(Magazine),
|
||||||
|
Stock(Stock),
|
||||||
|
ForeGrip(ForeGrip),
|
||||||
|
Optic(Optic)
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for WeaponAttachment {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::Optic(Optic::default())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WeaponAttachment {
|
||||||
|
pub fn vertical_recoil_modifier(&self) -> f32 {
|
||||||
|
match self {
|
||||||
|
WeaponAttachment::Compensator(_) => 0.0,
|
||||||
|
WeaponAttachment::Magazine(_) => 0.0,
|
||||||
|
WeaponAttachment::Stock(_) => 0.0,
|
||||||
|
WeaponAttachment::ForeGrip(_) => 0.0,
|
||||||
|
WeaponAttachment::Optic(_) => 0.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn horizontal_recoil_modifier(&self) -> f32 {
|
||||||
|
match self {
|
||||||
|
WeaponAttachment::Compensator(_) => 0.0,
|
||||||
|
WeaponAttachment::Magazine(_) => 0.0,
|
||||||
|
WeaponAttachment::Stock(_) => 0.0,
|
||||||
|
WeaponAttachment::ForeGrip(_) => 0.0,
|
||||||
|
WeaponAttachment::Optic(_) => 0.0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn asset_path<'a>(&self) -> &'a str {
|
||||||
|
match self {
|
||||||
|
WeaponAttachment::Compensator(compensator) => match compensator {
|
||||||
|
Compensator::FirstCompensator => "attachments/first_compensator.glb",
|
||||||
|
},
|
||||||
|
WeaponAttachment::Magazine(magazine) => match magazine {
|
||||||
|
Magazine::Ak105 => "attachments/ak105_magazine.glb",
|
||||||
|
},
|
||||||
|
WeaponAttachment::Stock(stock) => match stock {
|
||||||
|
Stock::MagpullTan => "attachments/tan_magpull_stock.glb",
|
||||||
|
},
|
||||||
|
WeaponAttachment::ForeGrip(foregrip) => match foregrip {
|
||||||
|
ForeGrip::Pk5 => "attachments/pk5_foregrip.glb",
|
||||||
|
},
|
||||||
|
WeaponAttachment::Optic(optic) => match optic {
|
||||||
|
Optic::AimpointT1 => "attachments/aimpoint_t1.glb",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3,50 +3,61 @@ use bevy::reflect::Reflect;
|
|||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
#[derive(Clone, Reflect)]
|
#[derive(Clone, Reflect)]
|
||||||
pub enum Caliber {
|
pub enum Caliber {
|
||||||
|
/// 5.56x45mm
|
||||||
NATO556,
|
NATO556,
|
||||||
|
/// 9x19mm
|
||||||
Parabellum9mm,
|
Parabellum9mm,
|
||||||
|
/// 5.45x39mm
|
||||||
|
RU545
|
||||||
}
|
}
|
||||||
impl Caliber {
|
impl Caliber {
|
||||||
pub fn range(&self) -> f32 {
|
pub fn range(&self) -> f32 {
|
||||||
match self {
|
match self {
|
||||||
Caliber::NATO556 => 7500.0,
|
Caliber::NATO556 => 7500.0,
|
||||||
Caliber::Parabellum9mm => 2500.0,
|
Caliber::Parabellum9mm => 2500.0,
|
||||||
|
Caliber::RU545 => 4500.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn max_airtime_secs(&self) -> f32 {
|
pub fn max_airtime_secs(&self) -> f32 {
|
||||||
match self {
|
match self {
|
||||||
Caliber::NATO556 => 3.0,
|
Caliber::NATO556 => 3.0,
|
||||||
Caliber::Parabellum9mm => 3.0,
|
Caliber::Parabellum9mm => 3.0,
|
||||||
|
Caliber::RU545 => 3.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn impulse(&self) -> f32 {
|
pub fn impulse(&self) -> f32 {
|
||||||
match self {
|
match self {
|
||||||
Caliber::NATO556 => 100.0,
|
Caliber::NATO556 => 100.0,
|
||||||
Caliber::Parabellum9mm => 50.0,
|
Caliber::Parabellum9mm => 50.0,
|
||||||
|
Caliber::RU545 => 75.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn mass(&self) -> f32 {
|
pub fn mass(&self) -> f32 {
|
||||||
match self {
|
match self {
|
||||||
Caliber::NATO556 => 0.1,
|
Caliber::NATO556 => 0.1,
|
||||||
Caliber::Parabellum9mm => 0.05,
|
Caliber::Parabellum9mm => 0.05,
|
||||||
|
Caliber::RU545 => 0.07,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn linear_damping(&self) -> f32 {
|
pub fn linear_damping(&self) -> f32 {
|
||||||
match self {
|
match self {
|
||||||
Caliber::NATO556 => 1.0,
|
Caliber::NATO556 => 1.0,
|
||||||
Caliber::Parabellum9mm => 2.0,
|
Caliber::Parabellum9mm => 2.0,
|
||||||
|
Caliber::RU545 => 1.5,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn angular_damping(&self) -> f32 {
|
pub fn angular_damping(&self) -> f32 {
|
||||||
match self {
|
match self {
|
||||||
Caliber::NATO556 => 1.0,
|
Caliber::NATO556 => 1.0,
|
||||||
Caliber::Parabellum9mm => 1.0,
|
Caliber::Parabellum9mm => 1.0,
|
||||||
|
Caliber::RU545 => 1.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn size(&self) -> f32 {
|
pub fn size(&self) -> f32 {
|
||||||
match self {
|
match self {
|
||||||
Caliber::NATO556 => 0.07,
|
Caliber::NATO556 => 0.07,
|
||||||
Caliber::Parabellum9mm => 0.05,
|
Caliber::Parabellum9mm => 0.05,
|
||||||
|
Caliber::RU545 => 0.06
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,29 +1,23 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use crate::comps::core::{
|
|
||||||
items::{
|
|
||||||
guns::{glock17::Glock17GunItem, m4a1::M4a1GunItem},
|
|
||||||
item::Item,
|
|
||||||
},
|
|
||||||
markers::{
|
|
||||||
firearm::{FirearmData, FirearmType, FiringPoint},
|
|
||||||
holdable::HoldableObjectData,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
use super::{caliber::Caliber, spray_pattern::FirearmSprayPattern};
|
use crate::comps::core::{markers::holdable::HoldableObjectData, items::{item::Item, guns::glock17::Glock17GunItem}};
|
||||||
|
|
||||||
#[derive(Component, PartialEq, Eq, PartialOrd, Ord, Clone, Reflect)]
|
use super::{firearm_data::{FirearmData, FirearmType}, caliber::Caliber, spray_pattern::FirearmSprayPattern};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
pub enum Firearm {
|
pub enum Firearm {
|
||||||
M4A1,
|
Ak105,
|
||||||
Glock17,
|
#[default]
|
||||||
|
Glock17
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Firearm {
|
impl Firearm {
|
||||||
pub fn firearm_data(&self) -> FirearmData {
|
pub fn firearm_data(&self) -> FirearmData {
|
||||||
match self {
|
match self {
|
||||||
Firearm::M4A1 => {
|
/*Firearm::M4A1 => {
|
||||||
FirearmData {
|
FirearmData {
|
||||||
firing_point: FiringPoint {
|
firing_point: FiringPoint {
|
||||||
forward: 2.5,
|
forward: 2.5,
|
||||||
@ -64,20 +58,12 @@ impl Firearm {
|
|||||||
asset_path: String::from("weapons/m4a1_rifle.glb"),
|
asset_path: String::from("weapons/m4a1_rifle.glb"),
|
||||||
firearm_type: FirearmType::Primary,
|
firearm_type: FirearmType::Primary,
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
Firearm::Glock17 => {
|
Firearm::Glock17 => {
|
||||||
FirearmData {
|
FirearmData {
|
||||||
firing_point: FiringPoint {
|
|
||||||
forward: 1.2,
|
|
||||||
up: 0.445,
|
|
||||||
right: 0.0,
|
|
||||||
},
|
|
||||||
caliber: Caliber::Parabellum9mm,
|
caliber: Caliber::Parabellum9mm,
|
||||||
max_capacity: 17,
|
|
||||||
fire_rate: 600.0,
|
fire_rate: 600.0,
|
||||||
rebound_time_seconds: 0.1,
|
rebound_time_seconds: 0.1,
|
||||||
vertical_recoil_modifier: 5.0,
|
|
||||||
horizontal_recoil_modifier: 1.0,
|
|
||||||
recoil_pattern: FirearmSprayPattern {
|
recoil_pattern: FirearmSprayPattern {
|
||||||
vertical: Vec::from([
|
vertical: Vec::from([
|
||||||
1.0, 1.2, 1.3, 1.6, 1.5, 1.7, 1.5, 1.5, 1.5, 2.0, // 10 for now
|
1.0, 1.2, 1.3, 1.6, 1.5, 1.7, 1.5, 1.5, 1.5, 2.0, // 10 for now
|
||||||
@ -107,44 +93,78 @@ impl Firearm {
|
|||||||
firearm_type: FirearmType::Secondary,
|
firearm_type: FirearmType::Secondary,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Firearm::Ak105 => FirearmData {
|
||||||
|
caliber: Caliber::RU545,
|
||||||
|
fire_rate: 600.0,
|
||||||
|
rebound_time_seconds: 0.2,
|
||||||
|
asset_path: String::from("weapons/ak105_rifle.glb"),
|
||||||
|
recoil_pattern: FirearmSprayPattern {
|
||||||
|
vertical: Vec::from([
|
||||||
|
1.0, 1.2, 1.3, 1.6, 1.5, 1.7, 1.5, 1.5, 1.5, 2.0, // 10 for now
|
||||||
|
]),
|
||||||
|
horizontal: Vec::from([
|
||||||
|
1.0, 1.2, 1.3, -1.6, 1.5, -1.7, -1.5, 1.5, -1.5, 2.0, // 10 for now
|
||||||
|
]),
|
||||||
|
},
|
||||||
|
final_aimed_rotation: Quat::default(),
|
||||||
|
final_rotation: Quat::default(),
|
||||||
|
final_aimed_position: Vec3::ZERO,
|
||||||
|
final_position: Vec3::ZERO,
|
||||||
|
scale_factor: 0.3,
|
||||||
|
firearm_type: FirearmType::Primary,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn holdable_object_data(&self) -> HoldableObjectData {
|
pub fn holdable_object_data(&self) -> HoldableObjectData {
|
||||||
match self {
|
match self {
|
||||||
|
/*
|
||||||
Firearm::M4A1 => HoldableObjectData {
|
Firearm::M4A1 => HoldableObjectData {
|
||||||
held_at: Vec3::ZERO,
|
held_at: Vec3::ZERO,
|
||||||
y_rot: -90.0,
|
y_rot: -90.0,
|
||||||
},
|
},*/
|
||||||
Firearm::Glock17 => HoldableObjectData {
|
Firearm::Glock17 => HoldableObjectData {
|
||||||
held_at: Vec3::ZERO,
|
held_at: Vec3::ZERO,
|
||||||
y_rot: 0.0,
|
y_rot: 0.0,
|
||||||
},
|
},
|
||||||
|
Firearm::Ak105 => HoldableObjectData {
|
||||||
|
held_at: Vec3::ZERO,
|
||||||
|
y_rot: 0.0
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn get_size(&self) -> Vec3 {
|
pub fn get_size(&self) -> Vec3 {
|
||||||
match self {
|
match self {
|
||||||
Firearm::M4A1 => Vec3 {
|
/*Firearm::M4A1 => Vec3 {
|
||||||
x: 0.3,
|
x: 0.3,
|
||||||
y: 0.7,
|
y: 0.7,
|
||||||
z: 2.5,
|
z: 2.5,
|
||||||
},
|
},*/
|
||||||
Firearm::Glock17 => Vec3 {
|
Firearm::Glock17 => Vec3 {
|
||||||
x: 0.3,
|
x: 0.3,
|
||||||
y: 0.4,
|
y: 0.4,
|
||||||
z: 1.0,
|
z: 1.0,
|
||||||
},
|
},
|
||||||
|
Firearm::Ak105 => Vec3 {
|
||||||
|
x: 0.3,
|
||||||
|
y: 0.7,
|
||||||
|
z: 2.5,
|
||||||
|
},
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_item_arc(&self) -> Arc<dyn Item> {
|
pub fn get_item_arc(&self) -> Arc<dyn Item> {
|
||||||
match self {
|
match self {
|
||||||
Firearm::M4A1 => Arc::new(M4a1GunItem),
|
//Firearm::M4A1 => Arc::new(M4a1GunItem),
|
||||||
Firearm::Glock17 => Arc::new(Glock17GunItem),
|
Firearm::Glock17 => Arc::new(Glock17GunItem),
|
||||||
|
Firearm::Ak105 => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn get_item_box(&self) -> Box<dyn Item> {
|
pub fn get_item_box(&self) -> Box<dyn Item> {
|
||||||
match self {
|
match self {
|
||||||
Firearm::M4A1 => Box::new(M4a1GunItem),
|
//Firearm::M4A1 => Box::new(M4a1GunItem),
|
||||||
Firearm::Glock17 => Box::new(Glock17GunItem),
|
Firearm::Glock17 => Box::new(Glock17GunItem),
|
||||||
|
Firearm::Ak105 => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
34
src/comps/core/weapons/firearm_data.rs
Normal file
34
src/comps/core/weapons/firearm_data.rs
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
use super::{spray_pattern::FirearmSprayPattern, caliber::Caliber};
|
||||||
|
|
||||||
|
|
||||||
|
/// Static data retrieved from a trait impl (Firearm)
|
||||||
|
#[derive(Clone, Reflect)]
|
||||||
|
pub struct FirearmData {
|
||||||
|
pub caliber: Caliber,
|
||||||
|
/// Rounds per minute
|
||||||
|
pub fire_rate: f32,
|
||||||
|
/// Amount of seconds it takes for gun to come down from shooting
|
||||||
|
/// Also is the time it takes for the gun to aim in or aim out.
|
||||||
|
pub rebound_time_seconds: f32,
|
||||||
|
pub asset_path: String,
|
||||||
|
pub recoil_pattern: FirearmSprayPattern,
|
||||||
|
/// Final rotation of hands when aimed in
|
||||||
|
pub final_aimed_rotation: Quat,
|
||||||
|
/// Final rotation of hands when not aimed in
|
||||||
|
pub final_rotation: Quat,
|
||||||
|
/// Final position of hands when aimed in
|
||||||
|
pub final_aimed_position: Vec3,
|
||||||
|
/// Final position of hands when not aimed in
|
||||||
|
pub final_position: Vec3,
|
||||||
|
pub scale_factor: f32,
|
||||||
|
pub firearm_type: FirearmType,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Reflect, Clone)]
|
||||||
|
pub enum FirearmType {
|
||||||
|
Primary,
|
||||||
|
Secondary,
|
||||||
|
}
|
||||||
|
|
8
src/comps/core/weapons/magazine_data.rs
Normal file
8
src/comps/core/weapons/magazine_data.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub struct MagazineData {
|
||||||
|
pub rounds_shot: usize,
|
||||||
|
pub max_capacity: usize,
|
||||||
|
}
|
8
src/comps/core/weapons/mod.rs
Normal file
8
src/comps/core/weapons/mod.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
pub mod attachments;
|
||||||
|
pub mod firearm;
|
||||||
|
pub mod firearm_data;
|
||||||
|
pub mod caliber;
|
||||||
|
pub mod spray_pattern;
|
||||||
|
pub mod magazine_data;
|
||||||
|
pub mod slot;
|
||||||
|
pub mod parts;
|
5
src/comps/core/weapons/parts/charging_handle.rs
Normal file
5
src/comps/core/weapons/parts/charging_handle.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct ChargingHandle;
|
5
src/comps/core/weapons/parts/fire_selector.rs
Normal file
5
src/comps/core/weapons/parts/fire_selector.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct FireSelector;
|
5
src/comps/core/weapons/parts/firing_point.rs
Normal file
5
src/comps/core/weapons/parts/firing_point.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct FiringPoint;
|
4
src/comps/core/weapons/parts/mod.rs
Normal file
4
src/comps/core/weapons/parts/mod.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
pub mod fire_selector;
|
||||||
|
pub mod charging_handle;
|
||||||
|
pub mod trigger;
|
||||||
|
pub mod firing_point;
|
5
src/comps/core/weapons/parts/trigger.rs
Normal file
5
src/comps/core/weapons/parts/trigger.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct Trigger;
|
5
src/comps/core/weapons/slot/compensator_slot.rs
Normal file
5
src/comps/core/weapons/slot/compensator_slot.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct CompensatorSlot;
|
5
src/comps/core/weapons/slot/fore_grip_slot.rs
Normal file
5
src/comps/core/weapons/slot/fore_grip_slot.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct ForeGripSlot;
|
5
src/comps/core/weapons/slot/magazine_slot.rs
Normal file
5
src/comps/core/weapons/slot/magazine_slot.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct MagazineSlot;
|
7
src/comps/core/weapons/slot/mod.rs
Normal file
7
src/comps/core/weapons/slot/mod.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
pub mod compensator_slot;
|
||||||
|
pub mod magazine_slot;
|
||||||
|
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;
|
5
src/comps/core/weapons/slot/sight_placement_end_slot.rs
Normal file
5
src/comps/core/weapons/slot/sight_placement_end_slot.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct SightPlacementEndSlot;
|
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct SightPlacementStartSlot;
|
5
src/comps/core/weapons/slot/stock_slot.rs
Normal file
5
src/comps/core/weapons/slot/stock_slot.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct StockSlot;
|
5
src/comps/core/weapons/slot/utility_slot.rs
Normal file
5
src/comps/core/weapons/slot/utility_slot.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
use bevy::{ecs::{component::Component, reflect::ReflectComponent}, reflect::Reflect};
|
||||||
|
|
||||||
|
#[derive(Component, Reflect, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Default)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct UtilitySlot;
|
@ -1,6 +1,3 @@
|
|||||||
pub mod caliber;
|
|
||||||
pub mod despawn_shots;
|
pub mod despawn_shots;
|
||||||
pub mod firearm;
|
|
||||||
pub mod player_firing;
|
pub mod player_firing;
|
||||||
pub mod shoot;
|
pub mod shoot;
|
||||||
pub mod spray_pattern;
|
|
||||||
|
@ -3,9 +3,7 @@ use std::time::Duration;
|
|||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy_rapier3d::prelude::*;
|
use bevy_rapier3d::prelude::*;
|
||||||
|
|
||||||
use crate::comps::core::markers::{bullet::BulletMarker, muzzle_flash::MuzzleFlashMarker};
|
use crate::comps::core::{markers::{bullet::BulletMarker, muzzle_flash::MuzzleFlashMarker}, weapons::caliber::Caliber};
|
||||||
|
|
||||||
use super::caliber::Caliber;
|
|
||||||
|
|
||||||
pub fn shoot_bullet(
|
pub fn shoot_bullet(
|
||||||
commands: &mut Commands,
|
commands: &mut Commands,
|
||||||
|
@ -7,7 +7,6 @@ use crate::{
|
|||||||
inventory::{player_inventory::{PlayerInventory, self}, slot::PlayerInventorySlotType},
|
inventory::{player_inventory::{PlayerInventory, self}, slot::PlayerInventorySlotType},
|
||||||
markers::{
|
markers::{
|
||||||
camera::MainCamera,
|
camera::MainCamera,
|
||||||
firearm::{FirearmData, MagazineData},
|
|
||||||
holdable::InPlayerHands,
|
holdable::InPlayerHands,
|
||||||
interactable::Interactable,
|
interactable::Interactable,
|
||||||
player::Player, proxy::{character::in_player_hands_parent::InPlayerHandsParent, physics::rapier::LinkToPlayer},
|
player::Player, proxy::{character::in_player_hands_parent::InPlayerHandsParent, physics::rapier::LinkToPlayer},
|
||||||
@ -47,8 +46,6 @@ pub fn capture_hand_usage(
|
|||||||
(
|
(
|
||||||
Entity,
|
Entity,
|
||||||
&GlobalTransform,
|
&GlobalTransform,
|
||||||
&'static FirearmData,
|
|
||||||
&mut MagazineData,
|
|
||||||
),
|
),
|
||||||
(With<InPlayerHands>, Without<InPlayerHandsParent>),
|
(With<InPlayerHands>, Without<InPlayerHandsParent>),
|
||||||
>,
|
>,
|
||||||
@ -120,7 +117,7 @@ pub fn capture_hand_usage(
|
|||||||
.full_auto_timer
|
.full_auto_timer
|
||||||
.tick(resources.time.delta());
|
.tick(resources.time.delta());
|
||||||
|
|
||||||
for (_f, firearm_transform, firearm_data, mut magazine_data) in
|
for (_f, firearm_transform) in
|
||||||
firearm_query.iter_mut()
|
firearm_query.iter_mut()
|
||||||
{
|
{
|
||||||
for mut hand_transform in hand_query.iter_mut() {
|
for mut hand_transform in hand_query.iter_mut() {
|
||||||
@ -157,7 +154,7 @@ pub fn capture_hand_usage(
|
|||||||
// Player is not in a reload animation
|
// Player is not in a reload animation
|
||||||
if resources.keyboard_input.just_pressed(KeyCode::R)
|
if resources.keyboard_input.just_pressed(KeyCode::R)
|
||||||
&& !resources.game_ui_state.any_window()
|
&& !resources.game_ui_state.any_window()
|
||||||
{
|
{}
|
||||||
/*
|
/*
|
||||||
// Start reload animation
|
// Start reload animation
|
||||||
for (animation_player_entity, mut animation_player) in
|
for (animation_player_entity, mut animation_player) in
|
||||||
@ -186,6 +183,7 @@ pub fn capture_hand_usage(
|
|||||||
// At the end of reload animation, set magazine data to capacity = 0
|
// At the end of reload animation, set magazine data to capacity = 0
|
||||||
}
|
}
|
||||||
// AIMING IN/OUT
|
// AIMING IN/OUT
|
||||||
|
/*
|
||||||
if resources.mouse_buttons.pressed(MouseButton::Right)
|
if resources.mouse_buttons.pressed(MouseButton::Right)
|
||||||
&& !resources.game_ui_state.any_window()
|
&& !resources.game_ui_state.any_window()
|
||||||
{
|
{
|
||||||
@ -281,7 +279,7 @@ pub fn capture_hand_usage(
|
|||||||
player_firing_info.current_round_index = 0;
|
player_firing_info.current_round_index = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ use crate::{
|
|||||||
comps::core::{
|
comps::core::{
|
||||||
markers::player::{Player, PlayerData},
|
markers::player::{Player, PlayerData},
|
||||||
spawners::{
|
spawners::{
|
||||||
guns::{glock17_spawner::Glock17SpawnPoint, m4a1_spawner::M4a1SpawnPoint},
|
guns::glock17_spawner::Glock17SpawnPoint,
|
||||||
player::PlayerSpawnPoint,
|
player::PlayerSpawnPoint,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -16,13 +16,13 @@ pub fn set_spawn_points(mut commands: Commands) {
|
|||||||
transform: Transform::from_xyz(3.0, 5.0, 2.0),
|
transform: Transform::from_xyz(3.0, 5.0, 2.0),
|
||||||
player: Player(PlayerData::default()),
|
player: Player(PlayerData::default()),
|
||||||
});
|
});
|
||||||
commands.spawn(M4a1SpawnPoint {
|
/*commands.spawn(M4a1SpawnPoint {
|
||||||
transform: {
|
transform: {
|
||||||
let mut transform = Transform::from_xyz(18.0, 10.0, 10.0);
|
let mut transform = Transform::from_xyz(18.0, 10.0, 10.0);
|
||||||
transform.rotate_z(utils::rad_deg::radians_from_degrees(-90.0));
|
transform.rotate_z(utils::rad_deg::radians_from_degrees(-90.0));
|
||||||
transform
|
transform
|
||||||
},
|
},
|
||||||
});
|
});*/
|
||||||
commands.spawn(Glock17SpawnPoint {
|
commands.spawn(Glock17SpawnPoint {
|
||||||
transform: {
|
transform: {
|
||||||
let mut transform = Transform::from_xyz(20.0, 10.0, 10.0);
|
let mut transform = Transform::from_xyz(20.0, 10.0, 10.0);
|
||||||
@ -30,13 +30,13 @@ pub fn set_spawn_points(mut commands: Commands) {
|
|||||||
transform
|
transform
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
commands.spawn(M4a1SpawnPoint {
|
/*commands.spawn(M4a1SpawnPoint {
|
||||||
transform: {
|
transform: {
|
||||||
let mut transform = Transform::from_xyz(18.0, 10.0, 18.0);
|
let mut transform = Transform::from_xyz(18.0, 10.0, 18.0);
|
||||||
transform.rotate_z(utils::rad_deg::radians_from_degrees(-90.0));
|
transform.rotate_z(utils::rad_deg::radians_from_degrees(-90.0));
|
||||||
transform
|
transform
|
||||||
},
|
},
|
||||||
});
|
});*/
|
||||||
commands.spawn(Glock17SpawnPoint {
|
commands.spawn(Glock17SpawnPoint {
|
||||||
transform: {
|
transform: {
|
||||||
let mut transform = Transform::from_xyz(20.0, 10.0, 20.0);
|
let mut transform = Transform::from_xyz(20.0, 10.0, 20.0);
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
use bevy::{gltf::Gltf, prelude::*};
|
use bevy::{gltf::Gltf, prelude::*};
|
||||||
|
|
||||||
use crate::{
|
use crate::{scenes::scene1::skybox::{Cubemap, CUBEMAPS}, comps::core::weapons::{firearm::Firearm, attachments::{weapon_attachment::WeaponAttachment, optic::Optic, magazine::Magazine, compensator::Compensator, foregrip::ForeGrip, stock::Stock}}};
|
||||||
logic::core::guns::firearm::Firearm,
|
|
||||||
scenes::scene1::skybox::{Cubemap, CUBEMAPS},
|
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, PartialOrd, Ord, Reflect)]
|
#[derive(PartialEq, Eq, PartialOrd, Ord, Reflect)]
|
||||||
pub enum GltfAssetType {
|
pub enum GltfAssetType {
|
||||||
Firearm(Firearm),
|
Firearm(Firearm),
|
||||||
|
Attachment(WeaponAttachment),
|
||||||
Character,
|
Character,
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
Enemy,
|
Enemy,
|
||||||
@ -35,20 +33,67 @@ pub fn load_all_assets(
|
|||||||
is_loaded: false,
|
is_loaded: false,
|
||||||
image_handle: skybox_handle,
|
image_handle: skybox_handle,
|
||||||
});
|
});
|
||||||
let m4a1_gltf_asset = GltfAsset {
|
/*let m4a1_gltf_asset = GltfAsset {
|
||||||
asset_type: GltfAssetType::Firearm(Firearm::M4A1),
|
asset_type: GltfAssetType::Firearm(Firearm::M4A1),
|
||||||
asset: asset_server.load(Firearm::M4A1.firearm_data().asset_path),
|
asset: asset_server.load(Firearm::M4A1.firearm_data().asset_path),
|
||||||
|
};*/
|
||||||
|
// Weapons
|
||||||
|
let ak105_gltf_asset = GltfAsset {
|
||||||
|
asset_type: GltfAssetType::Firearm(Firearm::Ak105),
|
||||||
|
asset: asset_server.load(Firearm::Ak105.firearm_data().asset_path),
|
||||||
};
|
};
|
||||||
let glock17_gltf_asset = GltfAsset {
|
let glock17_gltf_asset = GltfAsset {
|
||||||
asset_type: GltfAssetType::Firearm(Firearm::Glock17),
|
asset_type: GltfAssetType::Firearm(Firearm::Glock17),
|
||||||
asset: asset_server.load(Firearm::Glock17.firearm_data().asset_path),
|
asset: asset_server.load(Firearm::Glock17.firearm_data().asset_path),
|
||||||
};
|
};
|
||||||
|
// Attachments
|
||||||
|
let aimpoint_t1_gltf_asset = {
|
||||||
|
let attachment = WeaponAttachment::Optic(Optic::AimpointT1);
|
||||||
|
GltfAsset {
|
||||||
|
asset: asset_server.load(attachment.asset_path()),
|
||||||
|
asset_type: GltfAssetType::Attachment(attachment),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let ak105_magazine_gltf_asset = {
|
||||||
|
let attachment = WeaponAttachment::Magazine(Magazine::Ak105);
|
||||||
|
GltfAsset {
|
||||||
|
asset: asset_server.load(attachment.asset_path()),
|
||||||
|
asset_type: GltfAssetType::Attachment(attachment),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let first_compensator_gltf_asset = {
|
||||||
|
let attachment = WeaponAttachment::Compensator(Compensator::FirstCompensator);
|
||||||
|
GltfAsset {
|
||||||
|
asset: asset_server.load(attachment.asset_path()),
|
||||||
|
asset_type: GltfAssetType::Attachment(attachment),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let pk5_foregrip_gltf_asset = {
|
||||||
|
let attachment = WeaponAttachment::ForeGrip(ForeGrip::Pk5);
|
||||||
|
GltfAsset {
|
||||||
|
asset: asset_server.load(attachment.asset_path()),
|
||||||
|
asset_type: GltfAssetType::Attachment(attachment),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let tan_magpull_stock_gltf_asset = {
|
||||||
|
let attachment = WeaponAttachment::Stock(Stock::MagpullTan);
|
||||||
|
GltfAsset {
|
||||||
|
asset: asset_server.load(attachment.asset_path()),
|
||||||
|
asset_type: GltfAssetType::Attachment(attachment),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// Characters
|
||||||
let main_character_asset = GltfAsset {
|
let main_character_asset = GltfAsset {
|
||||||
asset_type: GltfAssetType::Character,
|
asset_type: GltfAssetType::Character,
|
||||||
asset: asset_server.load("character/main_character.glb"),
|
asset: asset_server.load("character/main_character.glb"),
|
||||||
};
|
};
|
||||||
|
|
||||||
commands.insert_resource(GltfAssets {
|
commands.insert_resource(GltfAssets {
|
||||||
assets: Vec::from([m4a1_gltf_asset, glock17_gltf_asset, main_character_asset]),
|
assets: Vec::from([/*m4a1_gltf_asset, */
|
||||||
|
ak105_gltf_asset, glock17_gltf_asset, // Firearms
|
||||||
|
main_character_asset, // Characters
|
||||||
|
aimpoint_t1_gltf_asset, pk5_foregrip_gltf_asset, ak105_magazine_gltf_asset, first_compensator_gltf_asset, tan_magpull_stock_gltf_asset // Attachments
|
||||||
|
]),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,12 +3,11 @@ use std::time::Duration;
|
|||||||
use bevy::{gltf::Gltf, prelude::*};
|
use bevy::{gltf::Gltf, prelude::*};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
comps::core::markers::{
|
comps::core::{markers::{
|
||||||
firearm::{FirearmData, MagazineData},
|
|
||||||
holdable::InPlayerHands,
|
holdable::InPlayerHands,
|
||||||
player::Player, proxy::character::in_player_hands_parent::InPlayerHandsParent,
|
player::Player, proxy::character::in_player_hands_parent::InPlayerHandsParent,
|
||||||
},
|
}, weapons::{firearm::Firearm, firearm_data::FirearmData}},
|
||||||
logic::core::guns::{firearm::Firearm, player_firing::PlayerFiringInfo},
|
logic::core::guns::player_firing::PlayerFiringInfo,
|
||||||
utils,
|
utils,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -96,12 +95,7 @@ fn spawn_firearm_on_player_hands(
|
|||||||
.id();
|
.id();
|
||||||
let firearm_entity = commands
|
let firearm_entity = commands
|
||||||
.spawn((
|
.spawn((
|
||||||
firearm_data.clone(),
|
|
||||||
firearm.holdable_object_data(),
|
firearm.holdable_object_data(),
|
||||||
MagazineData {
|
|
||||||
rounds_shot: 0,
|
|
||||||
max_capacity: firearm_data.max_capacity,
|
|
||||||
},
|
|
||||||
InPlayerHands,
|
InPlayerHands,
|
||||||
Name::new("Firearm"),
|
Name::new("Firearm"),
|
||||||
TransformBundle {
|
TransformBundle {
|
||||||
|
@ -13,7 +13,7 @@ pub struct GameLoadState {
|
|||||||
|
|
||||||
impl GameLoadState {
|
impl GameLoadState {
|
||||||
pub fn is_everything_except_player_loaded(&self) -> bool {
|
pub fn is_everything_except_player_loaded(&self) -> bool {
|
||||||
self.assets_loaded && self.animations_loaded
|
self.assets_loaded// && self.animations_loaded
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,16 +3,12 @@ use bevy_editor_pls::EditorPlugin;
|
|||||||
use bevy_inspector_egui::bevy_egui::EguiPlugin;
|
use bevy_inspector_egui::bevy_egui::EguiPlugin;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
comps::core::markers::{
|
comps::core::{markers::{
|
||||||
firearm::{FirearmData, MagazineData},
|
|
||||||
holdable::{HoldableObjectData, InPlayerHands},
|
holdable::{HoldableObjectData, InPlayerHands},
|
||||||
player::{Player, PlayerData, PlayerHand},
|
player::{Player, PlayerData, PlayerHand},
|
||||||
},
|
}, weapons::{firearm_data::FirearmData, magazine_data::MagazineData, caliber::Caliber, firearm::Firearm, spray_pattern::FirearmSprayPattern}},
|
||||||
logic::core::{
|
logic::core::{
|
||||||
guns::{
|
guns::player_firing::PlayerFiringInfo,
|
||||||
caliber::Caliber, firearm::Firearm, player_firing::PlayerFiringInfo,
|
|
||||||
spray_pattern::FirearmSprayPattern,
|
|
||||||
},
|
|
||||||
player::{
|
player::{
|
||||||
camera_player_sync::MouseMovementSettings,
|
camera_player_sync::MouseMovementSettings,
|
||||||
player_movement::{PlayerLinearXZState, PlayerLinearYState, PlayerMovementInput},
|
player_movement::{PlayerLinearXZState, PlayerLinearYState, PlayerMovementInput},
|
||||||
|
Loading…
Reference in New Issue
Block a user