Fixed terrible bug respawning all attachments on every shot of the gun
This commit is contained in:
parent
dde59da879
commit
4337b9af15
|
@ -38,8 +38,11 @@ Multiplayer
|
||||||
- [x] Optics
|
- [x] Optics
|
||||||
- [x] All optics implementing a fn/trait that gives a specific gun offset to use the optic correctly
|
- [x] All optics implementing a fn/trait that gives a specific gun offset to use the optic correctly
|
||||||
- [ ] TODO: Find some way to implement a shader for the optics (AFTER IMPLEMENTING NEW BULLET SYSTEM)
|
- [ ] TODO: Find some way to implement a shader for the optics (AFTER IMPLEMENTING NEW BULLET SYSTEM)
|
||||||
|
- [ ] Optic glass material
|
||||||
|
- [ ] Reticle render
|
||||||
|
- [ ] Parallax effect on reticle
|
||||||
- [ ] Weapon Clipping
|
- [ ] Weapon Clipping
|
||||||
- [ ] Make the player's collider bigger towards the front
|
- [x] Make the player's collider bigger towards the front
|
||||||
- [ ] Make the weapon's collider cover the firing point
|
- [ ] Make the weapon's collider cover the firing point
|
||||||
- [ ] If possible, create a new gun pose, like pushed back
|
- [ ] If possible, create a new gun pose, like pushed back
|
||||||
- [ ] Bobbing
|
- [ ] Bobbing
|
||||||
|
@ -53,6 +56,7 @@ Multiplayer
|
||||||
- [x] Gun dropping does not apply impulse for some reason...
|
- [x] Gun dropping does not apply impulse for some reason...
|
||||||
- [x] Gun colliding with ground and going into low ready
|
- [x] Gun colliding with ground and going into low ready
|
||||||
- [x] With introduction of floor collision groups now bullets go through floors
|
- [x] With introduction of floor collision groups now bullets go through floors
|
||||||
|
- [x] TODO: Huge bug all attachments get despawned and spawned when gun shoots
|
||||||
|
|
||||||
# Design
|
# Design
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -2,7 +2,7 @@ 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, stock_slot::StockSlot, utility_slot::UtilitySlot, slot::WeaponSlot}}};
|
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, 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}, weapons::{firearm::insert_firearm_state_to_firearms, gun_colliders::{GunFirearmCollider, update_gun_collider}, sight_placement::{SightPlacementStart, SightPlacementEnd}}};
|
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, gun_colliders::{GunFirearmCollider, update_gun_collider}, sight_placement::{SightPlacementStart, SightPlacementEnd}, optic_sight_glass::{OpticSightGlass, replace_optic_sight_material}}};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,6 +36,8 @@ impl Plugin for ProxyComponentsPlugin {
|
||||||
app.register_type::<Magazine>();
|
app.register_type::<Magazine>();
|
||||||
app.register_type::<ForeGrip>();
|
app.register_type::<ForeGrip>();
|
||||||
|
|
||||||
|
app.register_type::<OpticSightGlass>();
|
||||||
|
|
||||||
// Parts
|
// Parts
|
||||||
app.register_type::<ChargingHandle>();
|
app.register_type::<ChargingHandle>();
|
||||||
app.register_type::<FireSelector>();
|
app.register_type::<FireSelector>();
|
||||||
|
@ -54,10 +56,12 @@ impl Plugin for ProxyComponentsPlugin {
|
||||||
app.register_type::<physics::rapier::Collider>();
|
app.register_type::<physics::rapier::Collider>();
|
||||||
app.register_type::<physics::rapier::RigidBodyBlender>();
|
app.register_type::<physics::rapier::RigidBodyBlender>();
|
||||||
app.register_type::<physics::rapier::LinkToPlayer>();
|
app.register_type::<physics::rapier::LinkToPlayer>();
|
||||||
|
|
||||||
app.add_systems(Update, (physics_replace_proxies, update_game_load_state));
|
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_spawned_player);
|
||||||
app.add_systems(Update, insert_components_into_player_hand);
|
app.add_systems(Update, insert_components_into_player_hand);
|
||||||
app.add_systems(Update, insert_firearm_state_to_firearms);
|
app.add_systems(Update, insert_firearm_state_to_firearms);
|
||||||
app.add_systems(Update, update_gun_collider);
|
app.add_systems(Update, update_gun_collider);
|
||||||
|
app.add_systems(Update, replace_optic_sight_material);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -11,7 +11,8 @@ pub struct InsertFirearmStateIntoFirearmsParams<'w, 's> {
|
||||||
firearm_scene_bundle: Query<'w, 's, (Entity, Option<&'static ItemState>, Option<&'static InitialAttachments>, &'static Children), With<SceneInstance>>,
|
firearm_scene_bundle: Query<'w, 's, (Entity, Option<&'static ItemState>, Option<&'static InitialAttachments>, &'static Children), With<SceneInstance>>,
|
||||||
firearm_query: Query<'w, 's, (Entity, &'static Firearm, &'static Parent, Option<&'static mut FirearmState>), Or<(Without<FirearmState>, Changed<FirearmState>)>>,
|
firearm_query: Query<'w, 's, (Entity, &'static Firearm, &'static Parent, Option<&'static mut FirearmState>), Or<(Without<FirearmState>, Changed<FirearmState>)>>,
|
||||||
slots_query: Query<'w, 's, (Entity, &'static WeaponSlot, &'static Parent, &'static mut Transform)>,
|
slots_query: Query<'w, 's, (Entity, &'static WeaponSlot, &'static Parent, &'static mut Transform)>,
|
||||||
attachments_query: Query<'w, 's, (Entity, &'static WeaponAttachment, &'static Parent)>,
|
attachments_query: Query<'w, 's, (&'static WeaponAttachment, &'static Parent)>,
|
||||||
|
scenes_query: Query<'w, 's, (&'static Children, &'static Parent), With<Handle<Scene>>>,
|
||||||
//sight_placement_start_query: Query<'w, 's, (&'static Parent, &'static Transform), (With<SightPlacementStart>, Without<SightPlacementEnd>)>,
|
//sight_placement_start_query: Query<'w, 's, (&'static Parent, &'static Transform), (With<SightPlacementStart>, Without<SightPlacementEnd>)>,
|
||||||
//sight_placement_end_query: Query<'w, 's, (&'static Parent, &'static Transform), (With<SightPlacementEnd>, Without<SightPlacementStart>)>,
|
//sight_placement_end_query: Query<'w, 's, (&'static Parent, &'static Transform), (With<SightPlacementEnd>, Without<SightPlacementStart>)>,
|
||||||
in_player_hands_query: Query<'w, 's, &'static ItemId, With<InPlayerHands>>,
|
in_player_hands_query: Query<'w, 's, &'static ItemId, With<InPlayerHands>>,
|
||||||
|
@ -36,7 +37,7 @@ pub fn insert_firearm_state_to_firearms(
|
||||||
#[allow(irrefutable_let_patterns)]
|
#[allow(irrefutable_let_patterns)]
|
||||||
if let ItemState::Weapon(mut firearm_state) = item_state.clone() {
|
if let ItemState::Weapon(mut firearm_state) = item_state.clone() {
|
||||||
commands.entity(firearm_scene_entity).remove::<ItemState>();
|
commands.entity(firearm_scene_entity).remove::<ItemState>();
|
||||||
spawn_attachments_in_firearm(&mut commands, firearm_entity, &mut firearm_state, &queries.slots_query, &assets_gltf, &loaded_gltf_assets);
|
spawn_attachments_in_firearm(&mut commands, firearm_entity, &mut firearm_state, &queries.slots_query, &queries.attachments_query, &queries.scenes_query, &assets_gltf, &loaded_gltf_assets);
|
||||||
adjust_sight_slot_position(&mut queries.slots_query, firearm_state.optic_pos);
|
adjust_sight_slot_position(&mut queries.slots_query, firearm_state.optic_pos);
|
||||||
commands
|
commands
|
||||||
.entity(firearm_entity)
|
.entity(firearm_entity)
|
||||||
|
@ -48,7 +49,7 @@ pub fn insert_firearm_state_to_firearms(
|
||||||
match firearm_state_opt {
|
match firearm_state_opt {
|
||||||
Some(mut firearm_state) => {
|
Some(mut firearm_state) => {
|
||||||
// Change the Slots
|
// Change the Slots
|
||||||
spawn_attachments_in_firearm(&mut commands, firearm_entity, &mut firearm_state, &queries.slots_query, &assets_gltf, &loaded_gltf_assets);
|
spawn_attachments_in_firearm(&mut commands, firearm_entity, &mut firearm_state, &queries.slots_query, &queries.attachments_query, &queries.scenes_query, &assets_gltf, &loaded_gltf_assets);
|
||||||
adjust_sight_slot_position(&mut queries.slots_query, firearm_state.optic_pos);
|
adjust_sight_slot_position(&mut queries.slots_query, firearm_state.optic_pos);
|
||||||
for in_player_hands_item_id in queries.in_player_hands_query.iter() {
|
for in_player_hands_item_id in queries.in_player_hands_query.iter() {
|
||||||
for player_inventory in queries.player_inventories_query.iter() {
|
for player_inventory in queries.player_inventories_query.iter() {
|
||||||
|
@ -67,7 +68,7 @@ pub fn insert_firearm_state_to_firearms(
|
||||||
for (slot_entity, slot, parent_entity, _) in queries.slots_query.iter() {
|
for (slot_entity, slot, parent_entity, _) in queries.slots_query.iter() {
|
||||||
if firearm_entity == parent_entity.get() {
|
if firearm_entity == parent_entity.get() {
|
||||||
let mut attachment = None;
|
let mut attachment = None;
|
||||||
for (_, weapon_attachment, attachment_parent) in queries.attachments_query.iter() {
|
for (weapon_attachment, attachment_parent) in queries.attachments_query.iter() {
|
||||||
if slot_entity == attachment_parent.get() {
|
if slot_entity == attachment_parent.get() {
|
||||||
attachment = Some(weapon_attachment.clone())
|
attachment = Some(weapon_attachment.clone())
|
||||||
}
|
}
|
||||||
|
@ -102,6 +103,8 @@ fn spawn_attachments_in_firearm(
|
||||||
firearm_entity: Entity,
|
firearm_entity: Entity,
|
||||||
firearm_state: &mut FirearmState,
|
firearm_state: &mut FirearmState,
|
||||||
slots_query: &Query<(Entity, &WeaponSlot, &Parent, &mut Transform)>,
|
slots_query: &Query<(Entity, &WeaponSlot, &Parent, &mut Transform)>,
|
||||||
|
attachments_query: &Query<(&'static WeaponAttachment, &'static Parent)>,
|
||||||
|
scenes_query: &Query<(&'static Children, &'static Parent), With<Handle<Scene>>>,
|
||||||
assets_gltf: &GltfAssets,
|
assets_gltf: &GltfAssets,
|
||||||
loaded_gltf_assets: &Assets<Gltf>,
|
loaded_gltf_assets: &Assets<Gltf>,
|
||||||
) {
|
) {
|
||||||
|
@ -111,9 +114,24 @@ fn spawn_attachments_in_firearm(
|
||||||
}
|
}
|
||||||
for attachment_slot in firearm_state.attachment_slots.iter() {
|
for attachment_slot in firearm_state.attachment_slots.iter() {
|
||||||
if discriminant(&attachment_slot.slot_type) == discriminant(weapon_slot) {
|
if discriminant(&attachment_slot.slot_type) == discriminant(weapon_slot) {
|
||||||
commands.entity(slot_entity).despawn_descendants();
|
|
||||||
match &attachment_slot.attachment {
|
match &attachment_slot.attachment {
|
||||||
Some(attachment) =>
|
Some(attachment) =>
|
||||||
|
{
|
||||||
|
// Check for existing attachment in slot, if it matches then don't despawn it.
|
||||||
|
let mut skip = false;
|
||||||
|
for (scene_children, scene_parent) in scenes_query.iter() {
|
||||||
|
for (weapon_attachment, attachment_parent) in attachments_query.iter() {
|
||||||
|
if scene_parent.get() == slot_entity {
|
||||||
|
for scene_child in scene_children {
|
||||||
|
if scene_child == &attachment_parent.get() && weapon_attachment == attachment{
|
||||||
|
skip = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if skip { continue; }
|
||||||
|
commands.entity(slot_entity).despawn_descendants();
|
||||||
if let Some(asset_handle) = assets_gltf.assets.iter().find(|asset| {
|
if let Some(asset_handle) = assets_gltf.assets.iter().find(|asset| {
|
||||||
asset.asset_type == GltfAssetType::Attachment(attachment.clone())
|
asset.asset_type == GltfAssetType::Attachment(attachment.clone())
|
||||||
}) {
|
}) {
|
||||||
|
@ -132,8 +150,11 @@ fn spawn_attachments_in_firearm(
|
||||||
firearm_state.magazine_data = Some(magazine.magazine_data());
|
firearm_state.magazine_data = Some(magazine.magazine_data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}},
|
}}
|
||||||
None => {},
|
},
|
||||||
|
None => {
|
||||||
|
commands.entity(slot_entity).despawn_descendants();
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,3 +2,4 @@ pub mod firearm;
|
||||||
pub mod initial_attachments;
|
pub mod initial_attachments;
|
||||||
pub mod gun_colliders;
|
pub mod gun_colliders;
|
||||||
pub mod sight_placement;
|
pub mod sight_placement;
|
||||||
|
pub mod optic_sight_glass;
|
|
@ -0,0 +1,23 @@
|
||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Default, Component, Reflect, Debug)]
|
||||||
|
#[reflect(Component)]
|
||||||
|
pub struct OpticSightGlass;
|
||||||
|
|
||||||
|
pub fn replace_optic_sight_material(
|
||||||
|
//mut commands: Commands,
|
||||||
|
marker_query: Query<Entity, Added<OpticSightGlass>>,
|
||||||
|
materials_query: Query<(&Parent, &Handle<StandardMaterial>), With<Handle<Mesh>>>,
|
||||||
|
mut materials: ResMut<Assets<StandardMaterial>>,
|
||||||
|
) {
|
||||||
|
for marker in marker_query.iter() {
|
||||||
|
println!("One marker once");
|
||||||
|
for (material_parent, material_handle) in materials_query.iter() {
|
||||||
|
if marker == material_parent.get() {
|
||||||
|
if let Some(mut material) = materials.get_mut(material_handle) {
|
||||||
|
println!("Changed material");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -28,7 +28,9 @@ fn main() {
|
||||||
|
|
||||||
fn setup_plugins(application: &mut App) {
|
fn setup_plugins(application: &mut App) {
|
||||||
application
|
application
|
||||||
.add_plugins(DefaultPlugins.set(AssetPlugin::default()))
|
.add_plugins(DefaultPlugins.set(AssetPlugin {
|
||||||
|
..Default::default()
|
||||||
|
}))
|
||||||
//.add_plugins(DefaultInspectorConfigPlugin)
|
//.add_plugins(DefaultInspectorConfigPlugin)
|
||||||
.add_plugins(RapierPhysicsPlugin::<NoUserData>::default())
|
.add_plugins(RapierPhysicsPlugin::<NoUserData>::default())
|
||||||
//.add_plugins(RapierDebugRenderPlugin::default())
|
//.add_plugins(RapierDebugRenderPlugin::default())
|
||||||
|
|
Loading…
Reference in New Issue