package de.yogularm.minecraft.itemfinder.region;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import com.google.common.collect.ImmutableList;
/**
* Represents the terrain of one minecraft world
*/
public class World {
private List<Dimension> dimensions = ImmutableList.of();
private LevelInfo forgeData;
private Path path;
private String gameDirName;
private boolean isLoaded;
public World(Path path, String gameDirName) {
this.path = path;
this.gameDirName = gameDirName;
}
public void load(ProgressListener progressListener) throws IOException,
InterruptedException {
forgeData = new LevelInfo(path.resolve("level.dat"));
ImmutableList.Builder<Dimension> builder = new ImmutableList.Builder<>();
tryAddDimension(builder, "Overworld", path);
tryAddDimension(builder, "Nether", path.resolve("DIM-1"));
tryAddDimension(builder, "End", path.resolve("DIM1"));
dimensions = builder.build();
// load actual data
ProgressReporter progressReporter = new ProgressReporter(progressListener);
for (Dimension dimension : dimensions) {
progressReporter.onAction("Loading " + dimension.getName() + "...");
ProgressListener subListener = progressReporter.startSubtask(1.0 / dimensions.size());
dimension.loadRegions(subListener);
progressReporter.incProgress(1.0 / dimensions.size());
}
isLoaded = true;
}
public boolean isLoaded() {
return isLoaded;
}
private void tryAddDimension(ImmutableList.Builder<Dimension> list, String name, Path path) {
Path regionPath = path.resolve("region");
if (Files.isDirectory(regionPath))
list.add(new Dimension(regionPath, forgeData, name));
}
public List<Dimension> getDimensions() {
return dimensions;
}
public String getWorldName() {
return path.getFileName().toString();
}
public String getGameDirName() {
return gameDirName;
}
public String getDisplayName() {
return getWorldName() + (gameDirName.length() > 0 ? " (" + getGameDirName() + ")" : "");
}
@Override
public String toString() {
return getDisplayName();
}
}