aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormat <git@matdoes.dev>2023-10-06 16:08:19 -0500
committermat <git@matdoes.dev>2023-10-06 16:08:26 -0500
commit94ef48d9f2e362167c077b9584e42ed2c71d679f (patch)
tree1670cbdc946ce9574f20f6ed6a49e061394bf602
parent30702d94f65a2bd86c9ac0a7c402675b89ac4364 (diff)
downloadazalea-drasl-94ef48d9f2e362167c077b9584e42ed2c71d679f.tar.xz
make sure pathfinder is always centered on the destination block (fixes tests)
-rw-r--r--azalea-client/src/attack.rs8
-rw-r--r--azalea-client/src/entity_query.rs22
-rwxr-xr-xazalea-core/src/position.rs5
-rw-r--r--azalea/src/pathfinder/mod.rs8
4 files changed, 33 insertions, 10 deletions
diff --git a/azalea-client/src/attack.rs b/azalea-client/src/attack.rs
index ca2ff312..644af5de 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::<AttackStrengthScale>();
+ let Some(AttackStrengthScale(ticks_since_last_attack)) =
+ self.get_component::<AttackStrengthScale>()
+ 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 7b140825..484da6f8 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) -> <Q as WorldQuery>::Item<'w> {
- ecs.query::<Q>().get_mut(ecs, self.entity).expect(&format!(
- "Our client is missing a required component {:?}",
- std::any::type_name::<Q>()
- ))
+ ecs.query::<Q>()
+ .get_mut(ecs, self.entity)
+ .unwrap_or_else(|_| {
+ panic!(
+ "Our client is missing a required component {:?}",
+ std::any::type_name::<Q>()
+ )
+ })
}
/// Return a lightweight [`Entity`] for the entity that matches the given
@@ -67,10 +71,12 @@ impl Client {
pub fn entity_component<Q: Component + Clone>(&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::<Q>()
- ));
+ let components = q.get(&ecs, entity).unwrap_or_else(|_| {
+ panic!(
+ "Entity is missing a required component {:?}",
+ std::any::type_name::<Q>()
+ )
+ });
components.clone()
}
diff --git a/azalea-core/src/position.rs b/azalea-core/src/position.rs
index 540419ba..630a3a55 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 c4c4c688..5d417e91 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
};