Чтобы не сломать соседние деревья, вы можете использовать `Block.getLocation()` для получения глобальной позиции блока и сравнивать ее с глобальными координатами других деревьев на карте. Если блок находится рядом с другими деревьями, то он не должен быть разрушен. Вы также можете проверить, принадлежит ли блок дереву с помощью `Block.getMetadata()`.
Вот как можно модифицировать код для учета ближайших деревьев:
```java
public void breakTree(Block block) {
if (block == null || block.getType() != Material.OAK_LOG) {
return;
}
World world = block.getWorld();
Set<Block> treeBlocks = new HashSet<>();
// Create a queue to hold all tree blocks
Queue<Block> queue = new LinkedList<>();
queue.add(block);
// Get all nearby trees
List<Location> nearbyTrees = getAllTrees(block.getLocation(), 10); // Change 10 to distance you want to search for trees
Set<Material> treeMaterials = new HashSet<>(Arrays.asList(Material.OAK_LOG, Material.OAK_LEAVES)); // Add all tree materials
while (!queue.isEmpty()) {
Block currentBlock = queue.poll();
// Check if the block is part of a nearby tree
boolean isNearbyTree = false;
for (Location tree : nearbyTrees) {
if (currentBlock.getLocation().distanceSquared(tree) < 25) { // Change 25 to distance squared you want to use (faster performance)
isNearbyTree = true;
break;
}
}
if (!isNearbyTree) {
treeBlocks.add(currentBlock);
// Check all adjacent blocks for tree blocks
for (BlockFace face : BlockFace.values()) {
Block adjacentBlock = currentBlock.getRelative(face);
if ((adjacentBlock.getType() == Material.OAK_LEAVES || adjacentBlock.getType() == Material.OAK_LOG) &&
!treeBlocks.contains(adjacentBlock)) {
queue.add(adjacentBlock);
}
}
}
}
// Break all tree blocks
for (Block treeBlock : treeBlocks) {
treeBlock.breakNaturally();
}
}
private List<Location> getAllTrees(Location center, int radius) {
List<Location> nearbyTrees = new ArrayList<>();
int minY = center.getBlockY() - radius;
int maxY = center.getBlockY() + radius;
for (int x = center.getBlockX() - radius; x <= center.getBlockX() + radius; x++) {
for (int z = center.getBlockZ() - radius; z <= center.getBlockZ() + radius; z++) {
for (int y = minY; y <= maxY; y++) {
Block block = center.getWorld().getBlockAt(x, y, z);
if (treeMaterials.contains(block.getType())) {
nearbyTrees.add(block.getLocation());
}
}
}
}
return nearbyTrees;
}
```
Здесь мы сначала получаем все координаты деревьев в заданном радиусе с помощью `getAllTrees()`. Затем мы проверяем, находится ли каждый блок в радиусе другого д