diff --git a/src/comps/core/controller.rs b/src/comps/core/controller.rs index 7ebd074..1164942 100644 --- a/src/comps/core/controller.rs +++ b/src/comps/core/controller.rs @@ -15,9 +15,11 @@ use super::markers::player::Player; /// System that captures input and fires events pub fn capture_input( + commands: Commands, keyboard_input: Res>, player_query: Query< ( + Entity, &mut Velocity, &mut ExternalImpulse, &mut PlayerLinearYState, @@ -60,6 +62,7 @@ pub fn capture_input( }; if game_ui_state.any_window() { move_player( + commands, PlayerMovementInput::default(), player_query, time, @@ -67,6 +70,7 @@ pub fn capture_input( ); } else { move_player( + commands, player_movement_input, player_query, time, diff --git a/src/logic/core/player/camera_player_sync.rs b/src/logic/core/player/camera_player_sync.rs index 51078e5..ac56994 100644 --- a/src/logic/core/player/camera_player_sync.rs +++ b/src/logic/core/player/camera_player_sync.rs @@ -27,6 +27,13 @@ impl Default for MouseMovementSettings { } } +#[derive(Component, Clone, Debug, Reflect, Default)] +#[reflect(Component)] +pub struct HandSwaying { + pub sway_pos: Vec3, + pub sway_rot: Quat, +} + /// Synchronizes camera's translation to player. pub fn update_camera_vertical_position( mut player: Query<(&mut Transform, &PlayerLinearXZState), (With, Without)>, @@ -71,12 +78,13 @@ pub struct FollowCursorWithCameraQueryParams<'w, 's> { player_query: Query<'w, 's, &'static mut Transform, (With, Without)>, camera_query: Query<'w, 's, &'static mut Transform, (With, Without)>, player_model_query: Query<'w, 's, &'static mut Transform, (With, Without, Without)>, - in_player_hands_query: Query<'w, 's, &'static mut Transform, (With, Without, Without, Without)>, + in_player_hands_query: Query<'w, 's, Entity, (With, Without, Without, Without)>, //in_player_hands_parent_query: Query<'w, 's, &'static mut Transform, (With, Without, Without, Without, Without)> } /// Handles looking around if cursor is locked pub fn follow_cursor_with_camera( + mut commands: Commands, settings: Res, mut motions: EventReader, keyboard_input: Res>, @@ -134,6 +142,11 @@ pub fn follow_cursor_with_camera( for mut camera_transform in query.camera_query.iter_mut() { for mut player_model_transform in query.player_model_query.iter_mut() { let (mut yaw, mut pitch) = (player_transform.rotation.to_euler(EulerRot::YXZ).0, camera_transform.rotation.to_euler(EulerRot::YXZ).1) ; + if motions.len() == 0 { + for in_player_hands_entity in query.in_player_hands_query.iter() { + commands.entity(in_player_hands_entity).insert(HandSwaying { sway_pos: Vec3::ZERO, sway_rot: Quat::default() }); + } + } for motion in motions.read() { let window_scale = window.height().min(window.width()); let mut weapon_sway_vec = Vec3::ZERO; @@ -175,9 +188,10 @@ pub fn follow_cursor_with_camera( weapon_sway_vec_rot.y = weapon_sway_vec_rot.y.clamp(-0.5, 0.5); } // Weapon Sway - for mut in_player_hands_transform in query.in_player_hands_query.iter_mut() { - in_player_hands_transform.translation = in_player_hands_transform.translation.lerp(weapon_sway_vec, time.delta_seconds() * 1.0); - in_player_hands_transform.rotation = in_player_hands_transform.rotation.lerp(Quat::from_euler(EulerRot::XYZ, weapon_sway_vec_rot.x, weapon_sway_vec_rot.y, weapon_sway_vec_rot.y), time.delta_seconds() * 3.0); + for in_player_hands_entity in query.in_player_hands_query.iter() { + commands.entity(in_player_hands_entity).insert(HandSwaying { sway_pos: weapon_sway_vec, sway_rot: Quat::from_euler(EulerRot::XYZ, weapon_sway_vec_rot.x, weapon_sway_vec_rot.y, weapon_sway_vec_rot.y) }); + //in_player_hands_transform.translation = in_player_hands_transform.translation.lerp(weapon_sway_vec, time.delta_seconds() * 1.0); + //in_player_hands_transform.rotation = in_player_hands_transform.rotation.lerp(Quat::from_euler(EulerRot::XYZ, weapon_sway_vec_rot.x, weapon_sway_vec_rot.y, weapon_sway_vec_rot.y), time.delta_seconds() * 3.0); } } diff --git a/src/logic/core/player/hand_bobbing.rs b/src/logic/core/player/hand_bobbing.rs index c08a9c7..23c4edf 100644 --- a/src/logic/core/player/hand_bobbing.rs +++ b/src/logic/core/player/hand_bobbing.rs @@ -3,42 +3,75 @@ use bevy_rapier3d::dynamics::Velocity; use crate::comps::core::markers::{player::Player, holdable::InPlayerHands, firearm_scene::FirearmScene}; -use super::player_movement::PlayerLinearYState; +use super::{player_movement::{PlayerLinearYState, PlayerMovementInput, PlayerLinearXZState}, camera_player_sync::HandSwaying}; #[derive(Component, Clone, Debug, Reflect, Default)] #[reflect(Component)] pub struct HandBobbing { pub speed_curve: f32, pub bob_position: Vec3, + pub bob_euler_rotation: Vec3, } /// The maximum limits of travel from move input -const TRAVEL_LIMIT: Vec3 = Vec3 { x: 0.025, y: 0.025, z: 0.025 }; +const TRAVEL_LIMIT: Vec3 = Vec3 { x: 0.01, y: 0.01, z: 0.01 }; /// The maximum limits of travel from bobbing over time const BOBBING_LIMIT: Vec3 = Vec3 { x: 0.01, y: 0.01, z: 0.01 }; +const BOBBING_ROT_MULTIPLIER: Vec3 = Vec3 { x: 2.0, y: 2.0, z: 2.0}; pub fn hand_bobbing_on_player_movement( - player_query: Query<(&Velocity, &PlayerLinearYState), With>, + player_query: Query<(&Velocity, &PlayerLinearYState, &PlayerLinearXZState, &PlayerMovementInput), With>, - in_player_hands_query: Query>, + in_player_hands_query: Query<(Entity, &HandSwaying), With>, mut firearm_scene_query: Query<(&Parent, &mut Transform, &mut HandBobbing), (With>, With)>, time: Res