From e73e77f800418d4b478b940002b3139171a55d63 Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Tue, 26 Dec 2023 19:23:14 -0600 Subject: [PATCH] updated nearest-neighbor for an rtreeless world --- server/src/mine.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/server/src/mine.rs b/server/src/mine.rs index e20e11b..aae12a8 100644 --- a/server/src/mine.rs +++ b/server/src/mine.rs @@ -58,7 +58,7 @@ pub async fn mine_chunk_and_sweep(turtle: TurtleCommander, pos: Vec3, chunk: Vec while let Some(block) = valuables.pop() { refuel_needed(&turtle, volume).await; - if turtle.world().get(block).await.is_none() { + if turtle.world().garbage(block).await { continue; } let near = turtle.goto_adjacent(block).await?; @@ -74,7 +74,7 @@ async fn near_valuables(turtle: &TurtleCommander, pos: Vec3, chunk: Vec3) -> Vec let scan = (0..(chunk*2).product()).map(|n| fill(chunk * 2, n) - chunk/2); let world = turtle.world().lock().await; - scan.map(|n| world.get(n)) + scan.map(|n| world.get(n + pos)) .filter_map(|f| f) .filter(|n| n.name != "minecraft:air") .filter(|n| VALUABLE.iter().any(|v| n.name.contains(v))) @@ -345,6 +345,14 @@ impl ChunkedTask { return Some(chunk); } + loop { // update head (from a save) + let minimum = self.confirmed.load(Ordering::SeqCst); + let head = self.head.load(Ordering::SeqCst); + if let Ok(_) = self.head.compare_exchange(head, minimum.max(head), Ordering::AcqRel, Ordering::SeqCst) { + break; + } + } + let head = self.head.fetch_add(1, Ordering::AcqRel); if head < self.max {