blob: 5dda96e63c411e9b7d62fe10f3ec62203e21e370 [file] [log] [blame] [raw]
package net.querz.nbt.mca;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
public final class MCAUtil {
private MCAUtil() {}
//convenience methods to be consistent with NBTUtil
public static MCAFile readMCAFile(File file) throws IOException {
try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
MCAFile mcaFile = new MCAFile();
mcaFile.deserialize(raf);
return mcaFile;
}
}
public static MCAFile readMCAFile(String file) throws IOException {
return readMCAFile(new File(file));
}
//if file already exists, this will completely overwrite it.
public static int writeMCAFile(File file, MCAFile mcaFile, boolean changeLastUpdate) throws IOException {
File to = file;
if (file.exists()) {
to = File.createTempFile(to.getName(), null);
}
int chunks;
try (RandomAccessFile raf = new RandomAccessFile(to, "rw")) {
chunks = mcaFile.serialize(raf, changeLastUpdate);
}
if (chunks > 0 && to != file) {
Files.move(to.toPath(), file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
return chunks;
}
public static int writeMCAFile(File file, MCAFile mcaFile) throws IOException {
return writeMCAFile(file, mcaFile, false);
}
public static int writeMCAFile(String file, MCAFile mcaFile, boolean changeLastUpdate) throws IOException {
return writeMCAFile(new File(file), mcaFile, changeLastUpdate);
}
public static int writeMCAFile(String file, MCAFile mcaFile) throws IOException {
return writeMCAFile(new File(file), mcaFile, false);
}
public static String createNameFromChunkLocation(int chunkX, int chunkZ) {
return "r." + chunkToRegion(chunkX) + "." + chunkToRegion(chunkZ) + ".mca";
}
public static String createNameFromBlockLocation(int blockX, int blockZ) {
return "r." + blockToRegion(blockX) + "." + blockToRegion(blockZ) + ".mca";
}
public static String createNameFromRegionLocation(int regionX, int regionZ) {
return "r." + regionX + "." + regionZ + ".mca";
}
public static int blockToChunk(int block) {
return block >> 4;
}
public static int blockToRegion(int block) {
return block >> 9;
}
public static int chunkToRegion(int chunk) {
return chunk >> 5;
}
public static int regionToChunk(int region) {
return region << 5;
}
public static int regionToBlock(int region) {
return region << 9;
}
public static int chunkToBlock(int chunk) {
return chunk << 4;
}
}