Using PlayerValuesState instead of constants that hold playervalues

This commit is contained in:
Franklin 2023-11-07 21:08:15 -04:00
parent 20c37e1439
commit 437e512fd5
12 changed files with 130 additions and 96 deletions

View File

@ -1,9 +1,9 @@
use bevy::prelude::*; use bevy::prelude::*;
use bevy_rapier3d::prelude::*; use bevy_rapier3d::prelude::*;
use crate::{logic::core::player::player_movement::{ use crate::{logic::core::player::{player_movement::{
move_player, PlayerLinearXZState, PlayerLinearYState, PlayerMovementInput, move_player, PlayerLinearXZState, PlayerLinearYState, PlayerMovementInput,
}, ui::game::settings::SettingsScreenUIConfiguration}; }, player_values_state::PlayerValuesState}, ui::game::settings::SettingsScreenUIConfiguration};
use super::markers::player::Player; use super::markers::player::Player;
@ -23,6 +23,7 @@ pub fn capture_input(
>, >,
time: Res<Time>, time: Res<Time>,
settings_screen_config: Res<SettingsScreenUIConfiguration>, settings_screen_config: Res<SettingsScreenUIConfiguration>,
player_values_state: Res<PlayerValuesState>
) { ) {
// Don't allocate on each frame. Instead Check if any of the inputs are being pressed and then allocate. // Don't allocate on each frame. Instead Check if any of the inputs are being pressed and then allocate.
if keyboard_input.any_pressed([ if keyboard_input.any_pressed([
@ -50,9 +51,9 @@ pub fn capture_input(
sprint: keyboard_input.pressed(KeyCode::ShiftLeft), sprint: keyboard_input.pressed(KeyCode::ShiftLeft),
}; };
if settings_screen_config.settings_menu_shown { if settings_screen_config.settings_menu_shown {
move_player(PlayerMovementInput::default(), player_query, time); move_player(PlayerMovementInput::default(), player_query, time, player_values_state);
} else { } else {
move_player(player_movement_input, player_query, time); move_player(player_movement_input, player_query, time, player_values_state);
} }
} }
} }

View File

@ -1 +0,0 @@
pub mod player_values;

View File

@ -1,25 +0,0 @@
pub const MAX_LINEAR_PLAYER_VELOCITY: f32 = 20.0;
pub const PLAYER_ACCELERATION: f32 = 20.0;
pub const PLAYER_JUMP_FORCE: f32 = 900.0;
/// Time in ms that player must be grounded in order to jump again
pub const PLAYER_JUMP_COOLDOWN_MS: u128 = 75;
pub const PLAYER_SPRINT_SPEED_MULTIPLIER: f32 = 3.5;
pub const PLAYER_CROUCH_SPEED_MULTIPLIER: f32 = 0.25;
pub const PLAYER_INITIAL_WEIGHT: f32 = 75.0;
pub const PLAYER_GRAVITY_SCALE: f32 = 4.0;
pub const PLAYER_HEIGHT: f32 = 2.5;
pub const PLAYER_CAMERA_HEIGHT: f32 = 1.25;
pub const PLAYER_CROUCH_HEIGHT: f32 = 0.0;
pub const PLAYER_CROUCH_TIME_S: f32 = 1.25;
pub const PLAYER_LINEAR_DAMPING: f32 = 3.5;
pub const PLAYER_LINEAR_DAMPING_WHILE_JUMPING: f32 = 0.25;
pub const PLAYER_LEAN_TIME: f32 = 0.3;
pub const PLAYER_LEAN_ANGLE: f32 = 30.0;
pub const PLAYER_LATERAL_ACCELERATION_WHILE_SPRINTING_MULTIPLIER: f32 = 0.2;
pub const PLAYER_LATERAL_ACCELERATION_MULTIPLIER: f32 = 1.0;
pub const PLAYER_LINEAR_DAMPING_TIME_OFFSET_AFTER_JUMP_IN_MS: u128 = 20;

View File

@ -3,11 +3,10 @@ use bevy::{input::mouse::MouseMotion, prelude::*, window::CursorGrabMode};
use crate::{ use crate::{
comps::core::markers::{camera::MainCamera, player::Player}, comps::core::markers::{camera::MainCamera, player::Player},
constants::player_values::{PLAYER_CAMERA_HEIGHT, PLAYER_CROUCH_HEIGHT, PLAYER_CROUCH_TIME_S, PLAYER_LEAN_TIME, PLAYER_LEAN_ANGLE},
utils::rad_deg::radians_from_degrees, ui::game::settings::SettingsScreenUIConfiguration, utils::rad_deg::radians_from_degrees, ui::game::settings::SettingsScreenUIConfiguration,
}; };
use super::player_movement::PlayerLinearXZState; use super::{player_movement::PlayerLinearXZState, player_values_state::PlayerValuesState};
/// Mouse sensitivity and movement speed /// Mouse sensitivity and movement speed
#[derive(Resource)] #[derive(Resource)]
@ -32,6 +31,7 @@ pub fn update_camera_vertical_position(
mut player: Query<(&mut Transform, &PlayerLinearXZState), (With<Player>, Without<MainCamera>)>, mut player: Query<(&mut Transform, &PlayerLinearXZState), (With<Player>, Without<MainCamera>)>,
mut camera: Query<&mut Transform, (With<MainCamera>, Without<Player>)>, mut camera: Query<&mut Transform, (With<MainCamera>, Without<Player>)>,
time: Res<Time>, time: Res<Time>,
player_values_state: Res<PlayerValuesState>,
) { ) {
let Ok((_, player_linear_xz_state)) = player.get_single_mut() else { let Ok((_, player_linear_xz_state)) = player.get_single_mut() else {
return; return;
@ -46,17 +46,17 @@ pub fn update_camera_vertical_position(
camera_transform.translation = camera_transform.translation.lerp( camera_transform.translation = camera_transform.translation.lerp(
Vec3 { Vec3 {
x: camera_transform.translation.x, x: camera_transform.translation.x,
y: PLAYER_CROUCH_HEIGHT, y: player_values_state.player_crouch_height,
z: camera_transform.translation.z, z: camera_transform.translation.z,
}, },
(delta / PLAYER_CROUCH_TIME_S).clamp(0.0, 1.0), (delta / player_values_state.player_crouch_time_s).clamp(0.0, 1.0),
); );
} else { } else {
// TODO: Add elapsed time to standup so that crouch time and standup time is the same. // TODO: Add elapsed time to standup so that crouch time and standup time is the same.
camera_transform.translation = camera_transform.translation.lerp( camera_transform.translation = camera_transform.translation.lerp(
Vec3 { Vec3 {
x: camera_transform.translation.x, x: camera_transform.translation.x,
y: PLAYER_CAMERA_HEIGHT, y: player_values_state.player_camera_height,
z: camera_transform.translation.z, z: camera_transform.translation.z,
}, },
time.delta_seconds().clamp(0.0, 1.0), time.delta_seconds().clamp(0.0, 1.0),
@ -75,6 +75,7 @@ pub fn follow_cursor_with_camera(
btn: Res<Input<MouseButton>>, btn: Res<Input<MouseButton>>,
time: Res<Time>, time: Res<Time>,
mut settings_screen_config: ResMut<SettingsScreenUIConfiguration>, mut settings_screen_config: ResMut<SettingsScreenUIConfiguration>,
player_values_state: Res<PlayerValuesState>,
) { ) {
if let Ok(mut window) = primary_window.get_single_mut() { if let Ok(mut window) = primary_window.get_single_mut() {
if keyboard_input.just_pressed(KeyCode::Escape) { if keyboard_input.just_pressed(KeyCode::Escape) {
@ -130,28 +131,28 @@ pub fn follow_cursor_with_camera(
let right = Vec3::new(local_z.z, camera_transform.translation.y, -local_z.x); let right = Vec3::new(local_z.z, camera_transform.translation.y, -local_z.x);
player_transform.rotation = desired_rotation_quat; player_transform.rotation = desired_rotation_quat;
if keyboard_input.pressed(KeyCode::Q) { if keyboard_input.pressed(KeyCode::Q) {
let final_quat = Quat::from_axis_angle(Vec3::Z, radians_from_degrees(PLAYER_LEAN_ANGLE)); let final_quat = Quat::from_axis_angle(Vec3::Z, radians_from_degrees(player_values_state.player_lean_angle));
camera_transform.rotation = camera_transform camera_transform.rotation = camera_transform
.rotation .rotation
.lerp(final_quat, time.delta_seconds() / PLAYER_LEAN_TIME); .lerp(final_quat, time.delta_seconds() / player_values_state.player_lean_time);
camera_transform.translation = camera_transform.translation.lerp(Vec3 { x: -right.x, y: camera_transform.translation.y, z: -right.z }, time.delta_seconds() / PLAYER_LEAN_TIME); camera_transform.translation = camera_transform.translation.lerp(Vec3 { x: -right.x, y: camera_transform.translation.y, z: -right.z }, time.delta_seconds() / player_values_state.player_lean_time);
} else if keyboard_input.pressed(KeyCode::E) { } else if keyboard_input.pressed(KeyCode::E) {
let final_quat = let final_quat =
Quat::from_axis_angle(Vec3::Z, radians_from_degrees(-PLAYER_LEAN_ANGLE)); Quat::from_axis_angle(Vec3::Z, radians_from_degrees(-player_values_state.player_lean_angle));
camera_transform.rotation = camera_transform camera_transform.rotation = camera_transform
.rotation .rotation
.lerp(final_quat, time.delta_seconds() / PLAYER_LEAN_TIME); .lerp(final_quat, time.delta_seconds() / player_values_state.player_lean_time);
camera_transform.translation = camera_transform.translation.lerp(Vec3 { x: right.x, y: camera_transform.translation.y, z: right.z }, time.delta_seconds() / PLAYER_LEAN_TIME); camera_transform.translation = camera_transform.translation.lerp(Vec3 { x: right.x, y: camera_transform.translation.y, z: right.z }, time.delta_seconds() / player_values_state.player_lean_time);
} else { } else {
camera_transform.rotation = camera_transform camera_transform.rotation = camera_transform
.rotation .rotation
.lerp(Quat::default(), time.delta_seconds() / PLAYER_LEAN_TIME); .lerp(Quat::default(), time.delta_seconds() / player_values_state.player_lean_time);
camera_transform.translation = camera_transform.translation.lerp(Vec3 { camera_transform.translation = camera_transform.translation.lerp(Vec3 {
x: 0.0, x: 0.0,
y: camera_transform.translation.y, y: camera_transform.translation.y,
z: 0.0, z: 0.0,
}, time.delta_seconds() / PLAYER_LEAN_TIME); }, time.delta_seconds() / player_values_state.player_lean_time);
} }
} }
} }

View File

@ -3,3 +3,4 @@ pub mod camera_player_sync;
pub mod hands; pub mod hands;
pub mod player_movement; pub mod player_movement;
pub mod player_vertical_sync; pub mod player_vertical_sync;
pub mod player_values_state;

View File

@ -3,24 +3,20 @@ use bevy_rapier3d::prelude::*;
use crate::{ use crate::{
comps::core::markers::player::Player, comps::core::markers::player::Player,
constants::player_values::{
MAX_LINEAR_PLAYER_VELOCITY, PLAYER_ACCELERATION, PLAYER_CROUCH_SPEED_MULTIPLIER,
PLAYER_JUMP_COOLDOWN_MS, PLAYER_JUMP_FORCE, PLAYER_LATERAL_ACCELERATION_MULTIPLIER,
PLAYER_LATERAL_ACCELERATION_WHILE_SPRINTING_MULTIPLIER,
PLAYER_LINEAR_DAMPING_WHILE_JUMPING, PLAYER_SPRINT_SPEED_MULTIPLIER,
},
}; };
use super::player_values_state::PlayerValuesState;
#[derive(Component, Debug)] #[derive(Component, Debug)]
pub enum PlayerLinearYState { pub enum PlayerLinearYState {
Grounded(u128), Grounded(f64),
Jumping, Jumping,
Falling, Falling,
} }
#[allow(unused)] #[allow(unused)]
impl PlayerLinearYState { impl PlayerLinearYState {
pub fn is_grounded(&self, longer_than: &u128) -> bool { pub fn is_grounded(&self, longer_than: &f64) -> bool {
match self { match self {
Self::Grounded(time_grounded) => time_grounded > longer_than, Self::Grounded(time_grounded) => time_grounded > longer_than,
_ => false, _ => false,
@ -71,7 +67,7 @@ impl PlayerLinearXZState {
} }
/*/// If already sprinting, adds time to sprint /*/// If already sprinting, adds time to sprint
/// If not sprinting sets sprint. /// If not sprinting sets sprint.
pub fn sprint(&mut self, time: u128) { pub fn sprint(&mut self, time: u64) {
match self { match self {
PlayerLinearXZState::Sprinting(since) => {}, PlayerLinearXZState::Sprinting(since) => {},
_ => *self = PlayerLinearXZState::Sprinting(time) _ => *self = PlayerLinearXZState::Sprinting(time)
@ -115,6 +111,7 @@ pub fn move_player(
With<Player>, With<Player>,
>, >,
time: Res<Time>, time: Res<Time>,
player_values_state: Res<PlayerValuesState>
) { ) {
for ( for (
mut player_velocity, mut player_velocity,
@ -129,13 +126,13 @@ pub fn move_player(
player_linear_xz_state.toggle_crouch(time.elapsed().as_secs_f32()); player_linear_xz_state.toggle_crouch(time.elapsed().as_secs_f32());
} }
let crouch_multiplier = if player_linear_xz_state.is_crouched() { let crouch_multiplier = if player_linear_xz_state.is_crouched() {
PLAYER_CROUCH_SPEED_MULTIPLIER player_values_state.player_crouch_speed_multiplier
} else { } else {
1.0 1.0
}; };
let sprint_multiplier = let sprint_multiplier =
if player_movement_input.sprint && !player_linear_xz_state.is_crouched() { if player_movement_input.sprint && !player_linear_xz_state.is_crouched() {
PLAYER_SPRINT_SPEED_MULTIPLIER player_values_state.player_sprint_speed_multiplier
} else { } else {
1.0 1.0
}; };
@ -145,9 +142,9 @@ pub fn move_player(
if !player_linear_y_state.is_jumping() && !player_linear_y_state.is_falling() { if !player_linear_y_state.is_jumping() && !player_linear_y_state.is_falling() {
// Only let player move when grounded // Only let player move when grounded
if player_movement_input.front { if player_movement_input.front {
if sprint_multiplier == PLAYER_SPRINT_SPEED_MULTIPLIER { if sprint_multiplier == player_values_state.player_sprint_speed_multiplier {
*player_linear_xz_state = PlayerLinearXZState::Sprinting; *player_linear_xz_state = PlayerLinearXZState::Sprinting;
} else if crouch_multiplier == PLAYER_CROUCH_SPEED_MULTIPLIER { } else if crouch_multiplier == player_values_state.player_crouch_speed_multiplier {
} else { } else {
*player_linear_xz_state = PlayerLinearXZState::Walking; *player_linear_xz_state = PlayerLinearXZState::Walking;
} }
@ -156,10 +153,11 @@ pub fn move_player(
player_velocity.linvel, player_velocity.linvel,
time.delta_seconds(), time.delta_seconds(),
sprint_multiplier * crouch_multiplier, sprint_multiplier * crouch_multiplier,
player_values_state.player_acceleration
); );
} }
if player_movement_input.back { if player_movement_input.back {
if crouch_multiplier == PLAYER_CROUCH_SPEED_MULTIPLIER { if crouch_multiplier == player_values_state.player_crouch_speed_multiplier {
} else { } else {
*player_linear_xz_state = PlayerLinearXZState::Walking; *player_linear_xz_state = PlayerLinearXZState::Walking;
} }
@ -168,10 +166,11 @@ pub fn move_player(
player_velocity.linvel, player_velocity.linvel,
time.delta_seconds(), time.delta_seconds(),
crouch_multiplier, crouch_multiplier,
player_values_state.player_acceleration
); );
} }
if player_movement_input.right { if player_movement_input.right {
if crouch_multiplier == PLAYER_CROUCH_SPEED_MULTIPLIER { if crouch_multiplier == player_values_state.player_crouch_speed_multiplier {
} else { } else {
*player_linear_xz_state = PlayerLinearXZState::Walking; *player_linear_xz_state = PlayerLinearXZState::Walking;
} }
@ -180,14 +179,15 @@ pub fn move_player(
player_velocity.linvel, player_velocity.linvel,
time.delta_seconds(), time.delta_seconds(),
if player_linear_xz_state.is_sprinting() { if player_linear_xz_state.is_sprinting() {
PLAYER_LATERAL_ACCELERATION_WHILE_SPRINTING_MULTIPLIER * crouch_multiplier player_values_state.player_lateral_acceleration_while_sprinting_multiplier * crouch_multiplier
} else { } else {
PLAYER_LATERAL_ACCELERATION_MULTIPLIER * crouch_multiplier player_values_state.player_lateral_acceleration_multiplier * crouch_multiplier
}, },
player_values_state.player_acceleration
); );
} }
if player_movement_input.left { if player_movement_input.left {
if crouch_multiplier == PLAYER_CROUCH_SPEED_MULTIPLIER { if crouch_multiplier == player_values_state.player_crouch_speed_multiplier {
} else { } else {
*player_linear_xz_state = PlayerLinearXZState::Walking; *player_linear_xz_state = PlayerLinearXZState::Walking;
} }
@ -196,42 +196,43 @@ pub fn move_player(
player_velocity.linvel, player_velocity.linvel,
time.delta_seconds(), time.delta_seconds(),
if player_linear_xz_state.is_sprinting() { if player_linear_xz_state.is_sprinting() {
PLAYER_LATERAL_ACCELERATION_WHILE_SPRINTING_MULTIPLIER * crouch_multiplier player_values_state.player_lateral_acceleration_while_sprinting_multiplier * crouch_multiplier
} else { } else {
PLAYER_LATERAL_ACCELERATION_MULTIPLIER * crouch_multiplier player_values_state.player_lateral_acceleration_multiplier * crouch_multiplier
}, },
player_values_state.player_acceleration
); );
} }
} }
if player_movement_input.up && player_linear_y_state.is_grounded(&PLAYER_JUMP_COOLDOWN_MS) { if player_movement_input.up && player_linear_y_state.is_grounded(&player_values_state.player_jump_cooldown_s) {
player_external_force.impulse = Vec3::new(0.0, PLAYER_JUMP_FORCE, 0.0); player_external_force.impulse = Vec3::new(0.0, player_values_state.player_jump_force, 0.0);
*player_linear_y_state = PlayerLinearYState::Jumping; *player_linear_y_state = PlayerLinearYState::Jumping;
*player_damping = Damping { *player_damping = Damping {
linear_damping: PLAYER_LINEAR_DAMPING_WHILE_JUMPING, linear_damping: player_values_state.player_linear_damping_while_jumping,
..Default::default() ..Default::default()
}; };
} }
// When player velocity exceeds max linear velocity then set to max_linear_vel value // When player velocity exceeds max linear velocity then set to max_linear_vel value
if player_velocity.linvel.x.abs() if player_velocity.linvel.x.abs()
> MAX_LINEAR_PLAYER_VELOCITY * crouch_multiplier * sprint_multiplier > player_values_state.max_linear_player_velocity * crouch_multiplier * sprint_multiplier
{ {
let positive = player_velocity.linvel.x.is_sign_positive(); let positive = player_velocity.linvel.x.is_sign_positive();
if positive { if positive {
player_velocity.linvel.x = player_velocity.linvel.x =
MAX_LINEAR_PLAYER_VELOCITY * crouch_multiplier * sprint_multiplier player_values_state.max_linear_player_velocity * crouch_multiplier * sprint_multiplier
} else { } else {
player_velocity.linvel.x = MAX_LINEAR_PLAYER_VELOCITY * -1.0 * crouch_multiplier player_velocity.linvel.x = player_values_state.max_linear_player_velocity * -1.0 * crouch_multiplier
} }
} }
if player_velocity.linvel.z.abs() if player_velocity.linvel.z.abs()
> MAX_LINEAR_PLAYER_VELOCITY * crouch_multiplier * sprint_multiplier > player_values_state.max_linear_player_velocity * crouch_multiplier * sprint_multiplier
{ {
let positive = player_velocity.linvel.z.is_sign_positive(); let positive = player_velocity.linvel.z.is_sign_positive();
if positive { if positive {
player_velocity.linvel.z = MAX_LINEAR_PLAYER_VELOCITY * crouch_multiplier player_velocity.linvel.z = player_values_state.max_linear_player_velocity * crouch_multiplier
} else { } else {
player_velocity.linvel.z = MAX_LINEAR_PLAYER_VELOCITY * -1.0 * crouch_multiplier player_velocity.linvel.z = player_values_state.max_linear_player_velocity * -1.0 * crouch_multiplier
} }
} }
if player_velocity.linvel.x > -1.0 if player_velocity.linvel.x > -1.0
@ -251,6 +252,7 @@ fn apply_movement_acceleration_to_vec(
current_linvel: Vec3, current_linvel: Vec3,
delta_time_secs: f32, delta_time_secs: f32,
multiplier: f32, multiplier: f32,
player_acceleration: f32,
) -> Vec3 { ) -> Vec3 {
current_linvel + (direction * PLAYER_ACCELERATION * delta_time_secs * multiplier) current_linvel + (direction * player_acceleration * delta_time_secs * multiplier)
} }

View File

@ -0,0 +1,58 @@
use bevy::{prelude::{Resource, ReflectResource}, reflect::Reflect};
#[derive(Resource, Reflect)]
#[reflect(Resource)]
pub struct PlayerValuesState {
pub max_linear_player_velocity: f32,
pub player_acceleration: f32,
pub player_jump_force: f32,
pub player_jump_cooldown_s: f64,
pub player_sprint_speed_multiplier: f32,
pub player_crouch_speed_multiplier: f32,
pub player_initial_weight: f32,
pub player_gravity_scale: f32,
pub player_height: f32,
pub player_camera_height: f32,
pub player_crouch_height: f32,
pub player_crouch_time_s: f32,
pub player_linear_damping: f32,
pub player_linear_damping_while_jumping: f32,
pub player_lean_time: f32,
pub player_lean_angle: f32,
pub player_lateral_acceleration_while_sprinting_multiplier: f32,
pub player_lateral_acceleration_multiplier: f32,
pub player_linear_damping_time_offset_after_jump_in_s: f64,
}
impl Default for PlayerValuesState {
fn default() -> Self {
Self {
max_linear_player_velocity: 20.0,
player_acceleration: 20.0,
player_jump_force: 900.0,
player_jump_cooldown_s: 0.075,
player_sprint_speed_multiplier: 3.5,
player_crouch_speed_multiplier: 0.25,
player_initial_weight: 75.0,
player_gravity_scale: 4.0,
player_height: 2.5,
player_camera_height: 1.25,
player_crouch_height: 0.0,
player_crouch_time_s: 1.25,
player_linear_damping: 3.5,
player_linear_damping_while_jumping: 0.25,
player_lean_time: 0.3,
player_lean_angle: 30.0,
player_lateral_acceleration_while_sprinting_multiplier: 0.2,
player_lateral_acceleration_multiplier: 1.0,
player_linear_damping_time_offset_after_jump_in_s: 0.02,
}
}
}

View File

@ -1,40 +1,35 @@
use bevy::prelude::*; use bevy::prelude::*;
use bevy_rapier3d::prelude::*; use bevy_rapier3d::prelude::*;
use crate::{ use crate::comps::core::markers::player::Player;
comps::core::markers::player::Player,
constants::player_values::{
PLAYER_JUMP_COOLDOWN_MS, PLAYER_LINEAR_DAMPING,
PLAYER_LINEAR_DAMPING_TIME_OFFSET_AFTER_JUMP_IN_MS, PLAYER_LINEAR_DAMPING_WHILE_JUMPING,
},
};
use super::player_movement::PlayerLinearYState; use super::{player_movement::PlayerLinearYState, player_values_state::PlayerValuesState};
/// System that captures linear y velocity and determines whether player is falling or grounded, and how long the player has been grounded for. /// System that captures linear y velocity and determines whether player is falling or grounded, and how long the player has been grounded for.
pub fn sync_player_y_state( pub fn sync_player_y_state(
mut query: Query<(&Velocity, &mut PlayerLinearYState, &mut Damping), With<Player>>, mut query: Query<(&Velocity, &mut PlayerLinearYState, &mut Damping), With<Player>>,
time: Res<Time>, time: Res<Time>,
player_values_state: Res<PlayerValuesState>
) { ) {
for (player_velocity, mut player_linear_y_state, mut player_damping) in &mut query { for (player_velocity, mut player_linear_y_state, mut player_damping) in &mut query {
if player_velocity.linvel.y < -1.0 { if player_velocity.linvel.y < -1.0 {
*player_linear_y_state = PlayerLinearYState::Falling; *player_linear_y_state = PlayerLinearYState::Falling;
*player_damping = Damping { *player_damping = Damping {
linear_damping: PLAYER_LINEAR_DAMPING_WHILE_JUMPING, linear_damping: player_values_state.player_linear_damping_while_jumping,
..Default::default() ..Default::default()
}; };
} else if player_velocity.linvel.y >= -1.0 && player_velocity.linvel.y <= 1.0 { } else if player_velocity.linvel.y >= -1.0 && player_velocity.linvel.y <= 1.0 {
let previous_grounded_time = match *player_linear_y_state { let previous_grounded_time = match *player_linear_y_state {
PlayerLinearYState::Grounded(grounded_for) => grounded_for, PlayerLinearYState::Grounded(grounded_for) => grounded_for,
_ => 0, _ => 0.0,
}; };
let new_grounded_time = previous_grounded_time + time.delta().as_millis(); let new_grounded_time = previous_grounded_time + time.delta().as_secs_f64();
*player_linear_y_state = PlayerLinearYState::Grounded(new_grounded_time); *player_linear_y_state = PlayerLinearYState::Grounded(new_grounded_time);
if new_grounded_time if new_grounded_time
> PLAYER_JUMP_COOLDOWN_MS - PLAYER_LINEAR_DAMPING_TIME_OFFSET_AFTER_JUMP_IN_MS > player_values_state.player_jump_cooldown_s - player_values_state.player_linear_damping_time_offset_after_jump_in_s
{ {
*player_damping = Damping { *player_damping = Damping {
linear_damping: PLAYER_LINEAR_DAMPING, linear_damping: player_values_state.player_linear_damping,
..Default::default() ..Default::default()
}; };
} }

View File

@ -1,7 +1,7 @@
use bevy::prelude::*; use bevy::prelude::*;
use bevy_inspector_egui::quick::WorldInspectorPlugin; use bevy_inspector_egui::quick::WorldInspectorPlugin;
use bevy_rapier3d::prelude::*; use bevy_rapier3d::prelude::*;
use logic::core::guns::player_firing::PlayerFiringInfo; use logic::core::{guns::player_firing::PlayerFiringInfo, player::player_values_state::PlayerValuesState};
use scenes::scene1; use scenes::scene1;
use ui::game::plugin::MainGameUIPlugin; use ui::game::plugin::MainGameUIPlugin;
@ -29,7 +29,8 @@ fn setup_plugins(application: &mut App) {
.add_plugins(RapierPhysicsPlugin::<NoUserData>::default()) .add_plugins(RapierPhysicsPlugin::<NoUserData>::default())
.add_plugins(WorldInspectorPlugin::new()) .add_plugins(WorldInspectorPlugin::new())
.add_plugins(MainGameUIPlugin) .add_plugins(MainGameUIPlugin)
.register_type::<PlayerFiringInfo>(); .register_type::<PlayerFiringInfo>()
.register_type::<PlayerValuesState>();
} }
fn load(application: &mut App) { fn load(application: &mut App) {

View File

@ -7,7 +7,7 @@ use crate::{
follow_cursor_with_camera, update_camera_vertical_position, MouseMovementSettings, follow_cursor_with_camera, update_camera_vertical_position, MouseMovementSettings,
}, },
hands::capture_hand_usage, hands::capture_hand_usage,
player_vertical_sync::sync_player_y_state, player_vertical_sync::sync_player_y_state, player_values_state::PlayerValuesState,
}, setup::{assets::load_all_assets, load_state::GameLoadState, spawn::add_all_spawners, animations::{load_animations, AllFirearmAnimations}, equipment::{EquipmentChangeEvent, change_equipment}}, }, setup::{assets::load_all_assets, load_state::GameLoadState, spawn::add_all_spawners, animations::{load_animations, AllFirearmAnimations}, equipment::{EquipmentChangeEvent, change_equipment}},
}; };
@ -19,6 +19,7 @@ pub fn load_scene(application: &mut App) {
application.insert_resource(GameLoadState::default()); application.insert_resource(GameLoadState::default());
application.insert_resource(MouseMovementSettings::default()); application.insert_resource(MouseMovementSettings::default());
application.insert_resource(AllFirearmAnimations::default()); application.insert_resource(AllFirearmAnimations::default());
application.insert_resource(PlayerValuesState::default());
// Startup // Startup
application.add_systems(PreStartup, load_all_assets); application.add_systems(PreStartup, load_all_assets);
application.add_systems(Startup, spawn_ground); application.add_systems(Startup, spawn_ground);

View File

@ -6,9 +6,7 @@ use crate::{
camera::MainCamera, camera::MainCamera,
player::{Player, PlayerHand, PlayerData}, player::{Player, PlayerHand, PlayerData},
}, },
constants::player_values::{ logic::core::{player::{player_movement::{PlayerLinearYState, PlayerLinearXZState}, player_values_state::PlayerValuesState}, guns::player_firing::PlayerFiringInfo}, setup::{load_state::GameLoadState, equipment::EquipmentChangeEvent},
PLAYER_GRAVITY_SCALE, PLAYER_HEIGHT, PLAYER_INITIAL_WEIGHT, PLAYER_LINEAR_DAMPING,
}, logic::core::{player::player_movement::{PlayerLinearYState, PlayerLinearXZState}, guns::player_firing::PlayerFiringInfo}, setup::{load_state::GameLoadState, equipment::EquipmentChangeEvent},
}; };
use crate::setup::spawn::SpawnPoint; use crate::setup::spawn::SpawnPoint;
@ -20,6 +18,7 @@ pub fn player_spawner(
player_sp_query: Query<(Entity, &SpawnPoint<Player>)>, player_sp_query: Query<(Entity, &SpawnPoint<Player>)>,
mut game_load_state: ResMut<GameLoadState>, mut game_load_state: ResMut<GameLoadState>,
mut equipment_change_event_writer: EventWriter<EquipmentChangeEvent>, mut equipment_change_event_writer: EventWriter<EquipmentChangeEvent>,
player_values_state: Res<PlayerValuesState>,
) { ) {
if game_load_state.player_loaded || !game_load_state.is_everything_except_player_loaded() { if game_load_state.player_loaded || !game_load_state.is_everything_except_player_loaded() {
return; return;
@ -56,8 +55,8 @@ pub fn player_spawner(
.spawn(Player(PlayerData::default())) .spawn(Player(PlayerData::default()))
// Physics // Physics
.insert(RigidBody::Dynamic) .insert(RigidBody::Dynamic)
.insert(GravityScale(PLAYER_GRAVITY_SCALE)) .insert(GravityScale(player_values_state.player_gravity_scale))
.insert(Collider::capsule_y(PLAYER_HEIGHT, 2.0)) .insert(Collider::capsule_y(player_values_state.player_height, 2.0))
.insert(Restitution::coefficient(0.0)) .insert(Restitution::coefficient(0.0))
.insert(Friction { .insert(Friction {
coefficient: 0.0, coefficient: 0.0,
@ -69,7 +68,7 @@ pub fn player_spawner(
}) })
.insert(Velocity::zero()) .insert(Velocity::zero())
.insert(Damping { .insert(Damping {
linear_damping: PLAYER_LINEAR_DAMPING, linear_damping: player_values_state.player_linear_damping,
angular_damping: 1.0, angular_damping: 1.0,
}) })
.insert( .insert(
@ -77,7 +76,7 @@ pub fn player_spawner(
| LockedAxes::ROTATION_LOCKED_X | LockedAxes::ROTATION_LOCKED_X
| LockedAxes::ROTATION_LOCKED_Y, | LockedAxes::ROTATION_LOCKED_Y,
) )
.insert(ColliderMassProperties::Mass(PLAYER_INITIAL_WEIGHT)) .insert(ColliderMassProperties::Mass(player_values_state.player_initial_weight))
.insert(ExternalImpulse { .insert(ExternalImpulse {
impulse: Vec3::ZERO, impulse: Vec3::ZERO,
torque_impulse: Vec3::ZERO, torque_impulse: Vec3::ZERO,

View File

@ -2,6 +2,7 @@ use bevy::prelude::*;
pub struct MainEditorUIPlugin; pub struct MainEditorUIPlugin;
#[allow(unused)]
impl Plugin for MainEditorUIPlugin { impl Plugin for MainEditorUIPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
todo!() todo!()