85 lines
2.9 KiB
Java
85 lines
2.9 KiB
Java
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<Block> 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<BlockPos> pendingLogs = new ArrayDeque<BlockPos>();
|
|
ArrayDeque<BlockPos> logBlocks = new ArrayDeque<BlockPos>();
|
|
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<BlockPos> 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");
|
|
}
|
|
|
|
} |