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