From f61a6d1633b019af3e6f64073a1291b252b4f85f Mon Sep 17 00:00:00 2001 From: mat Date: Sat, 30 Sep 2023 12:41:33 -0500 Subject: add more pathfinder goals --- azalea/src/pathfinder/goals.rs | 81 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/azalea/src/pathfinder/goals.rs b/azalea/src/pathfinder/goals.rs index 9818c80d..29c97ff0 100644 --- a/azalea/src/pathfinder/goals.rs +++ b/azalea/src/pathfinder/goals.rs @@ -1,4 +1,4 @@ -use azalea_core::BlockPos; +use azalea_core::{BlockPos, Vec3}; use super::Goal; @@ -14,3 +14,82 @@ impl Goal for BlockPosGoal { n == self.0 } } + +pub struct XZGoal { + pub x: i32, + pub z: i32, +} +impl Goal for XZGoal { + fn heuristic(&self, n: BlockPos) -> f32 { + let dx = (self.x - n.x) as f32; + let dz = (self.z - n.z) as f32; + dx * dx + dz * dz + } + fn success(&self, n: BlockPos) -> bool { + n.x == self.x && n.z == self.z + } +} + +pub struct YGoal { + pub y: i32, +} +impl Goal for YGoal { + fn heuristic(&self, n: BlockPos) -> f32 { + let dy = (self.y - n.y) as f32; + dy * dy + } + fn success(&self, n: BlockPos) -> bool { + n.y == self.y + } +} + +pub struct RadiusGoal { + pub pos: Vec3, + pub radius: f32, +} +impl Goal for RadiusGoal { + fn heuristic(&self, n: BlockPos) -> f32 { + let n = n.center(); + let dx = (self.pos.x - n.x) as f32; + let dy = (self.pos.y - n.y) as f32; + let dz = (self.pos.z - n.z) as f32; + dx * dx + dy * dy + dz * dz + } + fn success(&self, n: BlockPos) -> bool { + let n = n.center(); + let dx = (self.pos.x - n.x) as f32; + let dy = (self.pos.y - n.y) as f32; + let dz = (self.pos.z - n.z) as f32; + dx * dx + dy * dy + dz * dz <= self.radius * self.radius + } +} + +pub struct InverseGoal(pub T); +impl Goal for InverseGoal { + fn heuristic(&self, n: BlockPos) -> f32 { + -self.0.heuristic(n) + } + fn success(&self, n: BlockPos) -> bool { + !self.0.success(n) + } +} + +pub struct OrGoal(pub T, pub U); +impl Goal for OrGoal { + fn heuristic(&self, n: BlockPos) -> f32 { + self.0.heuristic(n).min(self.1.heuristic(n)) + } + fn success(&self, n: BlockPos) -> bool { + self.0.success(n) || self.1.success(n) + } +} + +pub struct AndGoal(pub T, pub U); +impl Goal for AndGoal { + fn heuristic(&self, n: BlockPos) -> f32 { + self.0.heuristic(n).max(self.1.heuristic(n)) + } + fn success(&self, n: BlockPos) -> bool { + self.0.success(n) && self.1.success(n) + } +} -- cgit v1.2.3