package de.yogularm.minecraft.itemfinder.region; import java.io.IOException; import java.io.InputStream; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Dimension { private List<DroppedItem> items = new ArrayList<>(); private Path path; private LevelInfo levelInfo; private String name; public Dimension(Path regionPath, LevelInfo levleInfo, String name) { this.path = regionPath; this.levelInfo = levleInfo; this.name = name; } public void loadRegions(ProgressListener progessListener) throws IOException, InterruptedException { if (!Files.isDirectory(path)) throw new InvalidSaveFormatException( "region directory does not exist"); ProgressReporter progressReporter = new ProgressReporter( progessListener); try (DirectoryStream<Path> ds = Files.newDirectoryStream(path)) { Pattern fileNamePattern = Pattern .compile("r\\.(-?\\d+)\\.(-?\\d+)\\.mca"); List<Path> regionPaths = new ArrayList<>(); for (Path regionPath : ds) { Matcher fileNameMatcher = fileNamePattern.matcher(regionPath .getFileName().toString()); if (fileNameMatcher.matches()) regionPaths.add(regionPath); } for (Path regionPath : regionPaths) { ProgressListener subListener = progressReporter.startSubtask(1.0 / regionPaths.size()); loadRegionFile(regionPath, subListener); progressReporter.incProgress(1.0 / regionPaths.size()); if (Thread.currentThread().isInterrupted()) throw new InterruptedException(); } } } private void loadRegionFile(Path regionPath, ProgressListener progressListener) throws IOException, InterruptedException { ProgressReporter progressReporter = new ProgressReporter(progressListener); try (AnvilReader reader = new AnvilReader(regionPath)) { while (reader.hasMore()) { try (InputStream chunkStream = reader.readChunkColumn()) { ChunkColumn column = ChunkColumn.load(chunkStream, levelInfo); items.addAll(column.getDroppedItems()); } progressReporter.incProgress(1.0 / reader.getChunkCount()); if (Thread.currentThread().isInterrupted()) throw new InterruptedException(); } } } public String getName() { return name; } public List<DroppedItem> getDroppedItems() { return items; } @Override public String toString() { return name; } }