private final BlockFace[] adjacentFaces = {
BlockFace.UP, BlockFace.DOWN,
BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST,
BlockFace.NORTH_EAST, BlockFace.NORTH_WEST, BlockFace.SOUTH_EAST, BlockFace.SOUTH_WEST
};
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
Block block = event.getBlock();
if (isLog(block.getType())) {
Map<Block, Material> treeBlocks = findTreeBlocks(block);
// Если нужно, вывод списка координат блоков дерева
List<String> coordinates = getTreeBlockCoordinates(treeBlocks);
for (String coord : coordinates) {
System.out.println(coord)
}
removeTreeBlocks(treeBlocks);
new BukkitRunnable() {
@Override
public void run() {
restoreTreeBlocks(treeBlocks);
}
}.runTaskLater(this, 20L * 10); // реснуть через 10 сек допустим...
}
}
private boolean isLog(Material material) {
return Tag.LOGS.isTagged(material);
}
private boolean isLeaf(Material material) {
return Tag.LEAVES.isTagged(material);
}
private Map<Block, Material> findTreeBlocks(Block startBlock) {
Map<Block, Material> result = new HashMap<>();
Set<Block> visited = new HashSet<>();
exploreTree(startBlock, result, visited);
return result;
}
// Рекурсивный метод для обхода дерева и листвы
private void exploreTree(Block block, Map<Block, Material> result, Set<Block> visited) {
if (!visited.contains(block) && (isLog(block.getType()) || isLeaf(block.getType()))) {
visited.add(block);
result.put(block, block.getType());
for (BlockFace face : adjacentFaces) {
Block adjacentBlock = block.getRelative(face);
exploreTree(adjacentBlock, result, visited);
Block adjacentBlockTwoSteps = adjacentBlock.getRelative(face);
exploreTree(adjacentBlockTwoSteps, result, visited);
}
}
}
private void removeTreeBlocks(Map<Block, Material> treeBlocks) {
for (Block block : treeBlocks.keySet()) {
block.setType(Material.AIR);
}
}
private void restoreTreeBlocks(Map<Block, Material> treeBlocks) {
for (Map.Entry<Block, Material> entry : treeBlocks.entrySet()) {
Block block = entry.getKey();
Material material = entry.getValue();
block.setType(material);
}
}
// Если нужно, получение списка координат блоков дерева
private List<String> getTreeBlockCoordinates(Map<Block, Material> treeBlocks) {
List<String> coordinates = new ArrayList<>();
for (Block block : treeBlocks.keySet()) {
String coord = "X: " + block.getX() + " Y: " + block.getY() + " Z: " + block.getZ();
coordinates.add(coord);
}
return coordinates;
}
}
}