use bevy::prelude::*;
use bevy_fpc_core::Player;
use bevy_rapier3d::prelude::KinematicCharacterController;
const DEFAULT_SPRINT_RATE: f32 = 2.;
#[derive(Resource, Copy, Clone, Debug)]
pub struct FpcSprintConfiguration {
pub keyboard_sprint_input: KeyCode,
}
impl Default for FpcSprintConfiguration {
fn default() -> Self {
Self {
keyboard_sprint_input: KeyCode::ShiftLeft,
}
}
}
#[derive(Component)]
pub struct SprintRate(pub f32);
impl Default for SprintRate {
fn default() -> Self {
Self(DEFAULT_SPRINT_RATE)
}
}
pub fn handle_sprint(
mut query: Query<(&mut KinematicCharacterController, &Transform, &SprintRate), With<Player>>,
inputs: Res<Input<KeyCode>>,
fpc_conf: Res<FpcSprintConfiguration>,
) {
query.for_each_mut(|(mut controller, transform, SprintRate(rate))| {
if let Some(translation) = controller.translation {
if inputs.pressed(fpc_conf.keyboard_sprint_input) {
let dot_forward = Vec2::new(transform.local_z().x, transform.local_z().z)
.dot(Vec2::new(translation.x, translation.z));
if dot_forward < -0.001 && dot_forward > -0.1 {
controller.translation = Some(translation * *rate);
}
}
}
});
}