diff --git a/Cargo.lock b/Cargo.lock index 5aada0d..a1079ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1127,6 +1127,17 @@ dependencies = [ "uuid", ] +[[package]] +name = "bevy_polyline" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bbf333dab4a712f63456aa64b8e06268a44afdcbc9be4780e6260a0e8113072" +dependencies = [ + "bevy", + "bitflags 2.9.0", + "bytemuck", +] + [[package]] name = "bevy_ptr" version = "0.15.3" @@ -2893,6 +2904,7 @@ dependencies = [ "bevy", "bevy-inspector-egui", "bevy_asset_loader", + "bevy_polyline", "bevy_sprite3d", "bevy_trenchbroom", "nil", diff --git a/Cargo.toml b/Cargo.toml index df2cd3f..ec62fb4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,3 +26,4 @@ bevy_asset_loader = "0.22.0" bevy_sprite3d = "4.0.0" rand = "0.8.5" bevy-inspector-egui = { version = "0.30", optional = true } +bevy_polyline = "0.11.0" diff --git a/src/aim.rs b/src/aim.rs index 20de735..46e2d39 100644 --- a/src/aim.rs +++ b/src/aim.rs @@ -13,7 +13,7 @@ use std::f32::consts::PI; pub struct AimState { pub target: Option, pub range: f32, - pub angle: f32, + pub max_angle: f32, } impl Default for AimState { @@ -21,7 +21,7 @@ impl Default for AimState { Self { target: None, range: 40., - angle: PI / 10., + max_angle: PI / 8., } } } @@ -108,7 +108,7 @@ fn update( let angle = player_forward.angle_between(delta.normalize()); - if angle < state.angle && distance < target_distance { + if angle < state.max_angle && distance < target_distance { new_target = Some(e); target_distance = distance; } diff --git a/src/main.rs b/src/main.rs index 6b5b28a..fae6c7b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,6 +26,7 @@ use bevy::core_pipeline::tonemapping::Tonemapping; use bevy::prelude::*; use bevy::render::view::ColorGrading; use bevy::scene::SceneInstanceReady; +use bevy_polyline::PolylinePlugin; use bevy_trenchbroom::prelude::*; use control::controller::CharacterControllerPlugin; use physics_layers::GameLayer; @@ -63,6 +64,8 @@ fn main() { app.add_plugins(PhysicsPlugins::default()); app.add_plugins(CharacterControllerPlugin); + app.add_plugins(PolylinePlugin); + app.add_plugins(TrenchBroomPlugin(TrenchBroomConfig::new("hedz"))); #[cfg(feature = "dbg")] { @@ -102,8 +105,6 @@ fn main() { }); app.insert_resource(ClearColor(Color::BLACK)); - app.add_plugins(TrenchBroomPlugin(TrenchBroomConfig::new("hedz"))); - app.add_systems(Startup, (write_trenchbroom_config, music)); app.add_systems(PostStartup, setup_scene); app.add_systems(Update, (set_materials_unlit, set_tonemapping, set_shadows)); diff --git a/src/physics_layers.rs b/src/physics_layers.rs index 18aae86..fd9b23c 100644 --- a/src/physics_layers.rs +++ b/src/physics_layers.rs @@ -5,4 +5,6 @@ pub enum GameLayer { #[default] Level, Player, + Npc, + Projectile, } diff --git a/src/shooting.rs b/src/shooting.rs index a2c2dea..42eb52b 100644 --- a/src/shooting.rs +++ b/src/shooting.rs @@ -1,6 +1,24 @@ +use crate::{ + aim::AimState, + npc::Hit, + physics_layers::GameLayer, + player::{Player, PlayerRig}, + sounds::PlaySound, + tb_entities::EnemySpawn, +}; +use avian3d::prelude::{ + Collider, CollisionLayers, CollisionStarted, LayerMask, PhysicsLayer, Sensor, +}; use bevy::prelude::*; +use bevy_polyline::prelude::*; +use std::f32::consts::PI; -use crate::{aim::AimState, npc::Hit, sounds::PlaySound}; +#[derive(Component)] +struct Shot { + time: f32, +} + +const MAX_SHOT_AGES: f32 = 1.; #[derive(Event, Reflect)] pub enum TriggerState { @@ -9,15 +27,130 @@ pub enum TriggerState { } pub fn plugin(app: &mut App) { + app.add_systems(Update, (update, shot_collision, enemy_hit, timeout)); app.add_observer(on_trigger_state); } -fn on_trigger_state(trigger: Trigger, mut commands: Commands, aim: Res) { +fn on_trigger_state( + trigger: Trigger, + mut commands: Commands, + aim: Res, + player_rot: Query<&Transform, With>, + player_pos: Query<&Transform, With>, + target_transform: Query<&Transform, (Without, Without)>, + time: Res