diff options
| author | mat <27899617+mat-1@users.noreply.github.com> | 2025-08-14 20:40:13 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-14 20:40:13 -0500 |
| commit | e74ed047dbaf3877db4a89a2d589e992abd0bb11 (patch) | |
| tree | 0a728c8be167a1d59a5492ed9df666f41cf12e57 /azalea-entity/src/plugin | |
| parent | 6695132ddb31780786c67b8b9ff5df8ab3891438 (diff) | |
| download | azalea-drasl-e74ed047dbaf3877db4a89a2d589e992abd0bb11.tar.xz | |
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
Diffstat (limited to 'azalea-entity/src/plugin')
| -rw-r--r-- | azalea-entity/src/plugin/mod.rs | 53 |
1 files changed, 44 insertions, 9 deletions
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::<EntityUuidIndex>(); } @@ -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<InstanceContainer>, ) { - 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<Position>>) { - 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<Position>, Changed<EntityDimensions>)>, + >, +) { + 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<EntityKindComponent>, Changed<Pose>)>, + >, +) { + for (mut dimensions, kind, pose) in query.iter_mut() { + *dimensions = calculate_dimensions(**kind, *pose); + } +} + +pub fn update_crouching(query: Query<(&mut Crouching, &Pose), Without<LocalEntity>>) { + 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. /// |
