Similar Posts

Subscribe
Notify of
1 Answer
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Quarxy
1 year ago

So you could call the following method in BlockBreakEvent and then destroy the blocks at the coordinates with Block#breakNaturally after you checked that it was the desired pick:

public Collection getBlastBlocks(Location brokenBlock, BlockFace brokenFromFace) {
	List locations = new ArrayList<>();
    if(!face.isCartesian()) {
		return locations;
    }
    switch (face) {
		case UP, DOWN -> {
			locations.add(origin.clone().add(1, 0, 0));
			locations.add(origin.clone().add(-1, 0, 0));
			locations.add(origin.clone().add(0, 0, 1));
			locations.add(origin.clone().add(0, 0, -1));
			locations.add(origin.clone().add(1, 0, 1));
			locations.add(origin.clone().add(-1, 0, 1));
			locations.add(origin.clone().add(1, 0, -1));
			locations.add(origin.clone().add(-1, 0, -1));
		}
		case NORTH, SOUTH -> {
			locations.add(origin.clone().add(1, 0, 0));
			locations.add(origin.clone().add(-1, 0, 0));
			locations.add(origin.clone().add(0, 1, 0));
			locations.add(origin.clone().add(0, -1, 0));
			locations.add(origin.clone().add(1, 1, 0));
			locations.add(origin.clone().add(1, -1, 0));
			locations.add(origin.clone().add(-1, 1, 0));
			locations.add(origin.clone().add(-1, -1, 0));
		}
		case EAST, WEST -> {
			locations.add(origin.clone().add(0, 0, 1));
			locations.add(origin.clone().add(0, 0, -1));
			locations.add(origin.clone().add(0, 1, 0));
			locations.add(origin.clone().add(0, -1, 0));
			locations.add(origin.clone().add(0, 1, 1));
			locations.add(origin.clone().add(0, -1, 1));
			locations.add(origin.clone().add(0, 1, -1));
			locations.add(origin.clone().add(0, -1, -1));
		}
    }
}

Depending on the side of the block from which it is destroyed (PlayerInteractEvent#getBlockFace()), 3×3 is destroyed, i.e. the 8 blocks around the block that was actually dismantled.

Love