From 235ca218954aa0c887cf9c55f4f70481704fb273 Mon Sep 17 00:00:00 2001 From: Franklin Date: Sat, 25 Nov 2023 18:04:35 -0400 Subject: [PATCH] Added collision groups. AND Gun colliding with bullet, making it lower on every shot fired. - [x] Optics --- Cargo.lock | 35 ++++++++++--------- Cargo.toml | 1 + Design.md | 2 ++ src/comps/core/markers/collider_flags.rs | 17 +++++++++ src/comps/core/markers/mod.rs | 3 +- .../markers/proxy/weapons/gun_colliders.rs | 6 ++-- src/logic/core/collisions.rs | 3 +- src/logic/core/guns/despawn_shots.rs | 1 + src/logic/core/guns/shoot.rs | 4 ++- 9 files changed, 48 insertions(+), 24 deletions(-) create mode 100644 src/comps/core/markers/collider_flags.rs diff --git a/Cargo.lock b/Cargo.lock index 00a96b4..8c4c5a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -555,7 +555,7 @@ dependencies = [ "bevy_render", "bevy_transform", "bevy_utils", - "bitflags 2.4.0", + "bitflags 2.4.1", "radsort", "serde", ] @@ -768,7 +768,7 @@ checksum = "dca4b0a04e401d05dc74bc829f2e41bd62afdbacc095165fadb4e93caf0ba546" dependencies = [ "anyhow", "bevy", - "bitflags 2.4.0", + "bitflags 2.4.1", "bytemuck", "copyless", "rand", @@ -927,7 +927,7 @@ dependencies = [ "bevy_transform", "bevy_utils", "bevy_window", - "bitflags 2.4.0", + "bitflags 2.4.1", "bytemuck", "fixedbitset", "naga_oil", @@ -949,7 +949,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f0a2641af76c9eb17da0dcb0fb20cd9d615b93b67be0b85f1867487e956b5a" dependencies = [ "bevy", - "bitflags 2.4.0", + "bitflags 2.4.1", "log", "nalgebra", "rapier3d", @@ -1011,7 +1011,7 @@ dependencies = [ "bevy_transform", "bevy_utils", "bevy_window", - "bitflags 2.4.0", + "bitflags 2.4.1", "bytemuck", "codespan-reporting", "downcast-rs", @@ -1083,7 +1083,7 @@ dependencies = [ "bevy_render", "bevy_transform", "bevy_utils", - "bitflags 2.4.0", + "bitflags 2.4.1", "bytemuck", "fixedbitset", "guillotiere", @@ -1299,9 +1299,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" dependencies = [ "serde", ] @@ -1725,7 +1725,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16e44ab292b1dddfdaf7be62cfd8877df52f2f3fde5858d95bab606be259f20" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "libloading 0.8.0", "winapi", ] @@ -1918,6 +1918,7 @@ dependencies = [ "bevy_gltf_components", "bevy_hanabi", "bevy_rapier3d", + "bitflags 2.4.1", "uuid", ] @@ -2187,7 +2188,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "gpu-alloc-types", ] @@ -2197,7 +2198,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", ] [[package]] @@ -2642,7 +2643,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "623b5e6cefd76e58f774bd3cc0c6f5c7615c58c03a97815245a25c3c9bdee318" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -2686,7 +2687,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1ceaaa4eedaece7e4ec08c55c640ba03dbb73fb812a6570a59bcf1930d0f70e" dependencies = [ "bit-set", - "bitflags 2.4.0", + "bitflags 2.4.1", "codespan-reporting", "hexf-parse", "indexmap 1.9.3", @@ -3466,7 +3467,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.4", - "bitflags 2.4.0", + "bitflags 2.4.1", "serde", "serde_derive", ] @@ -4182,7 +4183,7 @@ checksum = "0f8a44dd301a30ceeed3c27d8c0090433d3da04d7b2a4042738095a424d12ae7" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.4.0", + "bitflags 2.4.1", "codespan-reporting", "log", "naga", @@ -4207,7 +4208,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.4.0", + "bitflags 2.4.1", "block", "core-graphics-types", "d3d12", @@ -4244,7 +4245,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee64d7398d0c2f9ca48922c902ef69c42d000c759f3db41e355f4a570b052b67" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "js-sys", "web-sys", ] diff --git a/Cargo.toml b/Cargo.toml index 0b43e9e..af6a254 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,7 @@ bevy_hanabi = { version = "0.8", default-features = false, features = [ "3d" ] } bevy-trait-query = "0.4.0" bevy_gltf_components = "0.2.0" +bitflags = "2.4.1" uuid = { version = "1.6.1", features = [ "v4", # Lets you generate random UUIDs diff --git a/Design.md b/Design.md index d5a87e7..a4cfc99 100644 --- a/Design.md +++ b/Design.md @@ -34,9 +34,11 @@ Multiplayer - [x] EventCollision system that takes into account more than one type of collider. - [x] Auto Low ready when gun collider hits object OR when player starts sprinting - [ ] (Not a priority) Collision with wall and attempting to Aim can look very twitchy, maybe add a cooldown of 0.1-0.4s on each change from low ready to high ready + - [x] Gun colliding with bullet, making it lower on every shot fired. - [x] Optics - [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 +- [ ] Weapon Clipping () - [ ] Bobbing - [ ] Gun Bob on run - [ ] Gun Bob on walk diff --git a/src/comps/core/markers/collider_flags.rs b/src/comps/core/markers/collider_flags.rs new file mode 100644 index 0000000..3a15ef5 --- /dev/null +++ b/src/comps/core/markers/collider_flags.rs @@ -0,0 +1,17 @@ +use bitflags::bitflags; + +#[derive(Default, Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)] +pub struct ColliderFlags(u32); +bitflags! { + impl ColliderFlags: u32 { + /// The value `A`, at bit position `0`. + const BULLETS = 0b00000001; + /// The value `B`, at bit position `1`. + const GUNS = 0b00000010; + /// The value `C`, at bit position `2`. + const SOLIDS = 0b00000100; + + const ALL = u32::MAX; + const NONE = 0; + } +} diff --git a/src/comps/core/markers/mod.rs b/src/comps/core/markers/mod.rs index 827459c..882e8ba 100644 --- a/src/comps/core/markers/mod.rs +++ b/src/comps/core/markers/mod.rs @@ -7,4 +7,5 @@ pub mod muzzle_flash; pub mod player; pub mod settings_screen; pub mod proxy; -pub mod inspect_screen; \ No newline at end of file +pub mod inspect_screen; +pub mod collider_flags; \ No newline at end of file diff --git a/src/comps/core/markers/proxy/weapons/gun_colliders.rs b/src/comps/core/markers/proxy/weapons/gun_colliders.rs index c022a28..05f87ad 100644 --- a/src/comps/core/markers/proxy/weapons/gun_colliders.rs +++ b/src/comps/core/markers/proxy/weapons/gun_colliders.rs @@ -1,7 +1,7 @@ use bevy::prelude::*; -use bevy_rapier3d::geometry::{Sensor, ActiveEvents}; +use bevy_rapier3d::geometry::{Sensor, ActiveEvents, Group, CollisionGroups}; -use crate::{comps::core::markers::holdable::InPlayerHands, utils::hierarchy::find_child_in_parent_children}; +use crate::{comps::core::markers::{holdable::InPlayerHands, collider_flags::ColliderFlags}, utils::hierarchy::find_child_in_parent_children}; /// This marker is to find the gun's collider that should be a sensor when equipped and a non-sensor when on the ground @@ -19,7 +19,7 @@ pub fn update_gun_collider( let mut found = false; for in_player_hands_entity in in_player_hands_query.iter() { if find_child_in_parent_children(&mut commands, in_player_hands_entity, gun_firearm_collider_entity, &children) { - commands.entity(gun_firearm_collider_entity).insert(Sensor).insert(ActiveEvents::COLLISION_EVENTS); + commands.entity(gun_firearm_collider_entity).insert(Sensor).insert(ActiveEvents::COLLISION_EVENTS).insert(CollisionGroups::new(Group::from_bits_retain(ColliderFlags::GUNS.bits()), Group::from_bits_retain(ColliderFlags::SOLIDS.bits())),); found = true; } } diff --git a/src/logic/core/collisions.rs b/src/logic/core/collisions.rs index bdbaea4..85659a4 100644 --- a/src/logic/core/collisions.rs +++ b/src/logic/core/collisions.rs @@ -41,12 +41,11 @@ pub fn collision_handler( if entity_a == entity_b { continue; } // Avoid inner collisions if flags.contains(CollisionEventFlags::SENSOR) { // Sensor collision event handling - println!("Sensor collision"); // ###### // Equipped Firearm Collisions // ###### for gun_collider in queries.firearms.iter() { - println!("Gun collider entity detected"); + if &gun_collider == entity_a { events.equipped_gun_collision_events.send(EquippedGunCollisionEvent { gun: gun_collider, diff --git a/src/logic/core/guns/despawn_shots.rs b/src/logic/core/guns/despawn_shots.rs index 492c636..715bdd8 100644 --- a/src/logic/core/guns/despawn_shots.rs +++ b/src/logic/core/guns/despawn_shots.rs @@ -41,6 +41,7 @@ pub fn despawn_stray_bullets( CollisionEventType::End => { for (bullet, bullet_entity, _) in query.iter() { if bullet_entity != event.bullet { continue; } + println!("Happened"); commands .entity(event.bullet) .insert(Collider::ball(bullet.caliber.size())); diff --git a/src/logic/core/guns/shoot.rs b/src/logic/core/guns/shoot.rs index 8ffe621..b2a7dd8 100644 --- a/src/logic/core/guns/shoot.rs +++ b/src/logic/core/guns/shoot.rs @@ -3,7 +3,7 @@ use std::time::Duration; use bevy::{prelude::*, render::render_resource::PrimitiveTopology}; use bevy_rapier3d::prelude::*; -use crate::{comps::core::{markers::{bullet::BulletMarker, muzzle_flash::MuzzleFlashMarker}, weapons::caliber::Caliber}, logic::core::player::player_settings::PlayerSettings}; +use crate::{comps::core::{markers::{bullet::BulletMarker, muzzle_flash::MuzzleFlashMarker, collider_flags::ColliderFlags}, weapons::caliber::Caliber}, logic::core::player::player_settings::PlayerSettings}; pub fn shoot_bullet( @@ -127,6 +127,8 @@ pub fn spawn_bullet( torque_impulse: Vec3::ZERO, }, ActiveEvents::COLLISION_EVENTS, + CollisionGroups::new(Group::from_bits_retain(ColliderFlags::BULLETS.bits()), Group::from_bits_retain(ColliderFlags::SOLIDS.bits())), Ccd::enabled(), + )); }