From 0da119d89dbd96bbfde3b0760212e4a3a5e4b943 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Mon, 24 Apr 2023 22:10:42 +0100 Subject: [PATCH] Finally reimplemented BlockUtils#getVein --- .../java/com/willfp/eco/util/BlockUtils.java | 58 +++++++++---------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/eco-api/src/main/java/com/willfp/eco/util/BlockUtils.java b/eco-api/src/main/java/com/willfp/eco/util/BlockUtils.java index 6aa38cbf..26c8a0cd 100644 --- a/eco-api/src/main/java/com/willfp/eco/util/BlockUtils.java +++ b/eco-api/src/main/java/com/willfp/eco/util/BlockUtils.java @@ -8,42 +8,15 @@ import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; +import java.util.Queue; import java.util.Set; /** * Utilities / API methods for blocks. */ public final class BlockUtils { - /** - * Max blocks to mine (yes, this is to prevent a stack overflow). - */ - private static final int MAX_BLOCKS = 2500; - - private static Set getNearbyBlocks(@NotNull final Block start, - @NotNull final List allowedMaterials, - @NotNull final Set blocks, - final int limit) { - for (BlockFace face : BlockFace.values()) { - Block block = start.getRelative(face); - if (blocks.contains(block)) { - continue; - } - - if (allowedMaterials.contains(block.getType())) { - blocks.add(block); - - if (blocks.size() > limit || blocks.size() > MAX_BLOCKS) { - return blocks; - } - - blocks.addAll(getNearbyBlocks(block, allowedMaterials, blocks, limit)); - } - } - - return blocks; - } - /** * Get a set of all blocks in contact with each other of a specific type. * @@ -56,7 +29,32 @@ public final class BlockUtils { public static Set getVein(@NotNull final Block start, @NotNull final List allowedMaterials, final int limit) { - return getNearbyBlocks(start, allowedMaterials, new HashSet<>(), limit); + Set blocks = new HashSet<>(); + Queue toProcess = new LinkedList<>(); + + if (allowedMaterials.contains(start.getType())) { + toProcess.add(start); + } + + while (!toProcess.isEmpty() && blocks.size() < limit) { + Block currentBlock = toProcess.poll(); + + if (blocks.contains(currentBlock)) { + continue; + } + + blocks.add(currentBlock); + + for (BlockFace face : BlockFace.values()) { + Block adjacentBlock = currentBlock.getRelative(face); + + if (!blocks.contains(adjacentBlock) && allowedMaterials.contains(adjacentBlock.getType())) { + toProcess.add(adjacentBlock); + } + } + } + + return blocks; } /**