diff --git a/src/entity/player.rs b/src/entity/player.rs index ca869cb..5fc572e 100644 --- a/src/entity/player.rs +++ b/src/entity/player.rs @@ -19,6 +19,7 @@ use collision::{Aabb, Aabb3}; use cgmath::{self, Point3, Vector3, Matrix4, Decomposed, Rotation3, Rad, Quaternion}; use std::collections::HashMap; use std::hash::BuildHasherDefault; +use std::time::Instant; use crate::types::hash::FNVHash; use crate::settings::Stevenkey; use crate::shared::Position as BPosition; @@ -441,6 +442,9 @@ impl ecs::System for PlayerRenderer { #[derive(Default)] pub struct PlayerMovement { pub flying: bool, + pub want_to_fly: bool, + pub when_last_jump_pressed: Option, + pub when_last_jump_released: Option, pub did_touch_ground: bool, pub pressed_keys: HashMap>, } @@ -533,6 +537,27 @@ impl ecs::System for MovementHandler { let gamemode = m.get_component(e, self.gamemode).unwrap(); movement.flying |= gamemode.always_fly(); + // Detect double-tapping jump to toggle creative flight + if movement.is_key_pressed(Stevenkey::Jump) { + if movement.when_last_jump_pressed.is_none() { + movement.when_last_jump_pressed = Some(Instant::now()); + if !movement.when_last_jump_released.is_none() { + let dt = movement.when_last_jump_pressed.unwrap() - movement.when_last_jump_released.unwrap(); + if dt.as_secs() == 0 && dt.subsec_millis() <= crate::settings::DOUBLE_JUMP_MS { + movement.want_to_fly = !movement.want_to_fly; + //println!("double jump! dt={:?} toggle want_to_fly = {}", dt, movement.want_to_fly); + + if gamemode.can_fly() && !gamemode.always_fly() { + movement.flying = movement.want_to_fly; + } + } + } + } + } else if !movement.when_last_jump_pressed.is_none() { + movement.when_last_jump_released = Some(Instant::now()); + movement.when_last_jump_pressed = None; + } + let position = m.get_component_mut(e, self.position).unwrap(); let rotation = m.get_component(e, self.rotation).unwrap(); let velocity = m.get_component_mut(e, self.velocity).unwrap(); diff --git a/src/settings.rs b/src/settings.rs index 3cd5121..d65ba2a 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -59,6 +59,8 @@ pub const CL_KEYBIND_SNEAK: console::CVar = create_keybind!(LShift, "cl_key pub const CL_KEYBIND_SPRINT: console::CVar = create_keybind!(LControl, "cl_keybind_sprint", "Keybinding for sprinting"); pub const CL_KEYBIND_JUMP: console::CVar = create_keybind!(Space, "cl_keybind_jump", "Keybinding for jumping"); +pub const DOUBLE_JUMP_MS: u32 = 100; + pub fn register_vars(vars: &mut console::Vars) { vars.register(R_MAX_FPS); vars.register(R_FOV);