From e74ed047dbaf3877db4a89a2d589e992abd0bb11 Mon Sep 17 00:00:00 2001 From: mat <27899617+mat-1@users.noreply.github.com> Date: Thu, 14 Aug 2025 20:40:13 -0500 Subject: Sneaking (#237) * start implementing sneaking * fix horizontal_collision being inverted and cleanup * clippy * change dimensions and eye height based on pose * proper support for automatically crouching in certain cases * fix anticheat issues * add line to changelog and update a comment --- azalea-entity/src/plugin/mod.rs | 53 ++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 9 deletions(-) (limited to 'azalea-entity/src/plugin/mod.rs') diff --git a/azalea-entity/src/plugin/mod.rs b/azalea-entity/src/plugin/mod.rs index ee6bca61..95fcb93f 100644 --- a/azalea-entity/src/plugin/mod.rs +++ b/azalea-entity/src/plugin/mod.rs @@ -17,7 +17,9 @@ pub use relative_updates::RelativeEntityUpdate; use tracing::debug; use crate::{ - Dead, EyeHeight, FluidOnEyes, LocalEntity, LookDirection, OnClimbable, Physics, Position, + Crouching, Dead, EntityKindComponent, FluidOnEyes, LocalEntity, LookDirection, OnClimbable, + Physics, Pose, Position, + dimensions::{EntityDimensions, calculate_dimensions}, metadata::Health, }; @@ -56,12 +58,12 @@ impl Plugin for EntityPlugin { debug_new_entity, add_dead, clamp_look_direction, - update_fluid_on_eyes, update_on_climbable, + (update_dimensions, update_bounding_box, update_fluid_on_eyes).chain(), + update_crouching, ), ), ) - .add_systems(Update, update_bounding_box) .add_systems(GameTick, update_in_loaded_chunk) .init_resource::(); } @@ -91,15 +93,20 @@ pub fn add_dead(mut commands: Commands, query: Query<(Entity, &Health), Changed< } pub fn update_fluid_on_eyes( - mut query: Query<(&mut FluidOnEyes, &Position, &EyeHeight, &InstanceName)>, + mut query: Query<( + &mut FluidOnEyes, + &Position, + &EntityDimensions, + &InstanceName, + )>, instance_container: Res, ) { - for (mut fluid_on_eyes, position, eye_height, instance_name) in query.iter_mut() { + for (mut fluid_on_eyes, position, dimensions, instance_name) in query.iter_mut() { let Some(instance) = instance_container.get(instance_name) else { continue; }; - let adjusted_eye_y = position.y + (**eye_height as f64) - 0.1111111119389534; + let adjusted_eye_y = position.y + (dimensions.eye_height as f64) - 0.1111111119389534; let eye_block_pos = BlockPos::from(Vec3::new(position.x, adjusted_eye_y, position.z)); let fluid_at_eye = instance .read() @@ -201,13 +208,41 @@ pub fn apply_clamp_look_direction(mut look_direction: LookDirection) -> LookDire /// /// # Safety /// Cached position in the world must be updated. -pub fn update_bounding_box(mut query: Query<(&Position, &mut Physics), Changed>) { - for (position, mut physics) in query.iter_mut() { - let bounding_box = physics.dimensions.make_bounding_box(**position); +#[allow(clippy::type_complexity)] +pub fn update_bounding_box( + mut query: Query< + (&mut Physics, &Position, &EntityDimensions), + Or<(Changed, Changed)>, + >, +) { + for (mut physics, position, dimensions) in query.iter_mut() { + let bounding_box = dimensions.make_bounding_box(**position); physics.bounding_box = bounding_box; } } +#[allow(clippy::type_complexity)] +pub fn update_dimensions( + mut query: Query< + (&mut EntityDimensions, &EntityKindComponent, &Pose), + Or<(Changed, Changed)>, + >, +) { + for (mut dimensions, kind, pose) in query.iter_mut() { + *dimensions = calculate_dimensions(**kind, *pose); + } +} + +pub fn update_crouching(query: Query<(&mut Crouching, &Pose), Without>) { + for (mut crouching, pose) in query { + let new_crouching = *pose == Pose::Crouching; + // avoid triggering change detection + if **crouching != new_crouching { + **crouching = new_crouching; + } + } +} + /// Marks an entity that's in a loaded chunk. This is updated at the beginning /// of every tick. /// -- cgit v1.2.3