package wtf.hak.survivalfabric.veinminer.drills; import net.minecraft.block.BlockState; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.TagKey; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Identifier; import java.util.ArrayDeque; import net.minecraft.block.Block; import net.minecraft.registry.Registries; import net.minecraft.util.math.BlockPos; import wtf.hak.survivalfabric.veinminer.VeinMinerSession; import static wtf.hak.survivalfabric.config.ConfigManager.getConfig; public class WoodDrill extends DrillBase { public WoodDrill(VeinMinerSession session) { super(session); } public static final TagKey woodTag = TagKey.of(RegistryKeys.BLOCK, Identifier.of("survivalfabric", "wood")); @Override public boolean canHandle(BlockState blockState) { return blockState.isIn(woodTag); } @Override public boolean drill(BlockPos startPos) { ServerWorld world = session.world; int broken = 0; ArrayDeque pendingLogs = new ArrayDeque(); ArrayDeque logBlocks = new ArrayDeque(); pendingLogs.add(startPos); String leavesBlockId = Registries.BLOCK.getId(world.getBlockState(startPos).getBlock()).toString().replace("_log", "_leaves"); while (!pendingLogs.isEmpty() && broken < getConfig().maxVeinSize) { BlockPos woodPos = pendingLogs.remove(); Block woodBlock = world.getBlockState(woodPos).getBlock(); if (tryBreakBlock(woodPos)) { logBlocks.add(woodPos); broken += 1; // look around current block forXYZ(woodPos, 1, newPos -> { Block newBlock = world.getBlockState(newPos).getBlock(); if (newBlock == woodBlock && !pendingLogs.contains(newPos)) { pendingLogs.add(newPos); } }, true); } } // second round, leaves // The pending blocks are all air now, ArrayDeque pendingLeaves = logBlocks; while (!pendingLeaves.isEmpty() && broken < getConfig().maxVeinSize) { // remove the immediately surrounding leaves around the log blocks broken += forXYZ(pendingLeaves.remove(), 1, newPos -> { int brokenLeaves = 0; Block newBlock = world.getBlockState(newPos).getBlock(); String newBlockId = Registries.BLOCK.getId(newBlock).toString(); if (newBlockId.equals(leavesBlockId)) { if (tryBreakBlock(newPos)) { brokenLeaves += 1; } } return brokenLeaves; }, true); } return true; } private boolean isLeaf(Block block) { return Registries.BLOCK.getId(block).toString().endsWith("_leaves"); } }