From fe10b6049cb1f0011cf3d1e8a4ccf0db1d4869fc Mon Sep 17 00:00:00 2001 From: TheMode Date: Sat, 29 Oct 2022 14:56:57 +0200 Subject: [PATCH] Add `anySolid` Signed-off-by: TheMode --- .../server/instance/batch/BatchQuery.java | 3 + .../server/instance/batch/BatchQueryImpl.java | 5 ++ .../batch/BatchQueryIntegrationTest.java | 60 ++++++++++++++++++- 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/instance/batch/BatchQuery.java b/src/main/java/net/minestom/server/instance/batch/BatchQuery.java index 57e1dd3db..510a5da54 100644 --- a/src/main/java/net/minestom/server/instance/batch/BatchQuery.java +++ b/src/main/java/net/minestom/server/instance/batch/BatchQuery.java @@ -22,6 +22,9 @@ public sealed interface BatchQuery @NotNull BatchQuery withExact(@NotNull Block @NotNull ... blocks); interface Result extends Block.Getter { + + boolean anySolid(); + /** * Gets the number of blocks successfully queried. * diff --git a/src/main/java/net/minestom/server/instance/batch/BatchQueryImpl.java b/src/main/java/net/minestom/server/instance/batch/BatchQueryImpl.java index fe19f768b..da3fa01bb 100644 --- a/src/main/java/net/minestom/server/instance/batch/BatchQueryImpl.java +++ b/src/main/java/net/minestom/server/instance/batch/BatchQueryImpl.java @@ -76,6 +76,11 @@ record BatchQueryImpl(int radius, return blocks.get(new Vec(x, y, z)); } + @Override + public boolean anySolid() { + return blocks.values().stream().anyMatch(Block::isSolid); + } + @Override public int count() { return blocks.size(); diff --git a/src/test/java/net/minestom/server/instance/batch/BatchQueryIntegrationTest.java b/src/test/java/net/minestom/server/instance/batch/BatchQueryIntegrationTest.java index ea0a1dd0f..c19bffb18 100644 --- a/src/test/java/net/minestom/server/instance/batch/BatchQueryIntegrationTest.java +++ b/src/test/java/net/minestom/server/instance/batch/BatchQueryIntegrationTest.java @@ -3,10 +3,12 @@ package net.minestom.server.instance.batch; import net.minestom.server.instance.block.Block; import net.minestom.testing.Env; import net.minestom.testing.EnvTest; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.*; @EnvTest public class BatchQueryIntegrationTest { @@ -86,4 +88,58 @@ public class BatchQueryIntegrationTest { } } } + + + @Test + @Disabled("Should #count retrieve air blocks?") + public void airCount(Env env) { + var instance = env.process().instance().createInstanceContainer(); + var batch = BatchQuery.radius(1); + + instance.loadChunk(0, 0).join(); + + var result = instance.getBlocks(8, 8, 8, batch); + assertEquals(0, result.count()); + + instance.setBlock(8, 8, 8, Block.STONE); + result = instance.getBlocks(8, 8, 8, batch); + assertEquals(1, result.count()); + } + + @Test + public void anySolid(Env env) { + var instance = env.process().instance().createInstanceContainer(); + var batch = BatchQuery.radius(1); + + instance.loadChunk(0, 0).join(); + + var random = new Random(12345); + + // Fill section with non-solid/air blocks + for (int x = 0; x < 16; x++) { + for (int y = 0; y < 16; y++) { + for (int z = 0; z < 16; z++) { + instance.setBlock(x, y, z, random.nextBoolean() ? Block.AIR : Block.SUNFLOWER); + } + } + } + + // Place stone in the middle + for (int x = 7; x < 10; x++) { + for (int y = 7; y < 10; y++) { + for (int z = 7; z < 10; z++) { + instance.setBlock(x, y, z, Block.STONE); + } + } + } + + // Retrieve in the middle + var result = instance.getBlocks(8, 8, 8, batch); + assertTrue(result.anySolid()); + assertEquals(27, result.count()); + + // Retrieve at the edge + result = instance.getBlocks(2, 2, 2, batch); + assertFalse(result.anySolid()); + } }