From 94ef48d9f2e362167c077b9584e42ed2c71d679f Mon Sep 17 00:00:00 2001 From: mat Date: Fri, 6 Oct 2023 16:08:19 -0500 Subject: [PATCH] make sure pathfinder is always centered on the destination block (fixes tests) --- azalea-client/src/attack.rs | 8 +++++++- azalea-client/src/entity_query.rs | 22 ++++++++++++++-------- azalea-core/src/position.rs | 5 +++++ azalea/src/pathfinder/mod.rs | 8 +++++++- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/azalea-client/src/attack.rs b/azalea-client/src/attack.rs index ca2ff3120..644af5de6 100644 --- a/azalea-client/src/attack.rs +++ b/azalea-client/src/attack.rs @@ -53,7 +53,13 @@ impl Client { /// Whether the player has an attack cooldown. pub fn has_attack_cooldown(&self) -> bool { - let ticks_since_last_attack = *self.component::(); + let Some(AttackStrengthScale(ticks_since_last_attack)) = + self.get_component::() + else { + // they don't even have an AttackStrengthScale so they probably can't attack + // lmao, just return false + return false; + }; ticks_since_last_attack < 1.0 } } diff --git a/azalea-client/src/entity_query.rs b/azalea-client/src/entity_query.rs index 7b140825d..484da6f8a 100644 --- a/azalea-client/src/entity_query.rs +++ b/azalea-client/src/entity_query.rs @@ -23,10 +23,14 @@ impl Client { /// # } /// ``` pub fn query<'w, Q: WorldQuery>(&self, ecs: &'w mut World) -> ::Item<'w> { - ecs.query::().get_mut(ecs, self.entity).expect(&format!( - "Our client is missing a required component {:?}", - std::any::type_name::() - )) + ecs.query::() + .get_mut(ecs, self.entity) + .unwrap_or_else(|_| { + panic!( + "Our client is missing a required component {:?}", + std::any::type_name::() + ) + }) } /// Return a lightweight [`Entity`] for the entity that matches the given @@ -67,10 +71,12 @@ impl Client { pub fn entity_component(&mut self, entity: Entity) -> Q { let mut ecs = self.ecs.lock(); let mut q = ecs.query::<&Q>(); - let components = q.get(&ecs, entity).expect(&format!( - "Entity is missing a required component {:?}", - std::any::type_name::() - )); + let components = q.get(&ecs, entity).unwrap_or_else(|_| { + panic!( + "Entity is missing a required component {:?}", + std::any::type_name::() + ) + }); components.clone() } diff --git a/azalea-core/src/position.rs b/azalea-core/src/position.rs index 540419ba3..630a3a553 100755 --- a/azalea-core/src/position.rs +++ b/azalea-core/src/position.rs @@ -39,6 +39,11 @@ macro_rules! vec3_impl { self.x * self.x + self.z * self.z } + #[inline] + pub fn horizontal_distance_to_sqr(&self, other: &Self) -> $type { + (self - other).horizontal_distance_sqr() + } + /// Return a new instance of this position with the y coordinate /// decreased by the given number. #[inline] diff --git a/azalea/src/pathfinder/mod.rs b/azalea/src/pathfinder/mod.rs index c4c4c6883..5d417e913 100644 --- a/azalea/src/pathfinder/mod.rs +++ b/azalea/src/pathfinder/mod.rs @@ -381,7 +381,13 @@ fn tick_execute_path( physics, }; let extra_strict_if_last = if i == pathfinder.path.len() - 1 { - physics.on_ground && BlockPos::from(position) == movement.target + let x_difference_from_center = position.x - (movement.target.x as f64 + 0.5); + let z_difference_from_center = position.z - (movement.target.z as f64 + 0.5); + // this is to make sure we don't fall off immediately after finishing the path + physics.on_ground + && BlockPos::from(position) == movement.target + && x_difference_from_center.abs() < 0.2 + && z_difference_from_center.abs() < 0.2 } else { true };