2020-04-24 03:25:58 +02:00
|
|
|
package net.minestom.server.instance;
|
2019-08-23 23:55:09 +02:00
|
|
|
|
2020-04-24 03:25:58 +02:00
|
|
|
import net.minestom.server.io.ChunkReader;
|
|
|
|
import net.minestom.server.io.IOManager;
|
|
|
|
import net.minestom.server.utils.CompressionUtils;
|
2019-08-23 23:55:09 +02:00
|
|
|
|
2019-09-15 13:42:36 +02:00
|
|
|
import java.io.File;
|
|
|
|
import java.io.FileNotFoundException;
|
|
|
|
import java.io.FileOutputStream;
|
|
|
|
import java.io.IOException;
|
2019-08-23 23:55:09 +02:00
|
|
|
import java.nio.file.Files;
|
|
|
|
import java.util.function.Consumer;
|
|
|
|
|
|
|
|
public class ChunkLoaderIO {
|
|
|
|
|
|
|
|
private static File getChunkFile(int chunkX, int chunkZ, File folder) {
|
|
|
|
return new File(folder, getChunkFileName(chunkX, chunkZ));
|
|
|
|
}
|
|
|
|
|
|
|
|
private static String getChunkFileName(int chunkX, int chunkZ) {
|
2020-03-29 20:58:30 +02:00
|
|
|
return "chunk_" + chunkX + "." + chunkZ + ".data";
|
2019-08-23 23:55:09 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
protected void saveChunk(Chunk chunk, File folder, Runnable callback) {
|
2019-09-07 11:42:33 +02:00
|
|
|
IOManager.submit(() -> {
|
2019-08-23 23:55:09 +02:00
|
|
|
File chunkFile = getChunkFile(chunk.getChunkX(), chunk.getChunkZ(), folder);
|
2020-03-29 20:58:30 +02:00
|
|
|
if (!chunkFile.exists()) {
|
|
|
|
try {
|
|
|
|
chunkFile.createNewFile();
|
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-23 23:55:09 +02:00
|
|
|
try (FileOutputStream fos = new FileOutputStream(chunkFile)) {
|
|
|
|
byte[] data = chunk.getSerializedData();
|
2019-09-03 07:36:04 +02:00
|
|
|
fos.write(CompressionUtils.getCompressedData(data));
|
2019-08-23 23:55:09 +02:00
|
|
|
} catch (FileNotFoundException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (callback != null)
|
|
|
|
callback.run();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void loadChunk(int chunkX, int chunkZ, Instance instance, Consumer<Chunk> callback) {
|
2019-09-07 11:42:33 +02:00
|
|
|
IOManager.submit(() -> {
|
2019-08-23 23:55:09 +02:00
|
|
|
File chunkFile = getChunkFile(chunkX, chunkZ, instance.getFolder());
|
|
|
|
if (!chunkFile.exists()) {
|
|
|
|
instance.createChunk(chunkX, chunkZ, callback); // Chunk file does not exist, create new chunk
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-08-24 01:05:52 +02:00
|
|
|
byte[] array;
|
2019-08-23 23:55:09 +02:00
|
|
|
try {
|
|
|
|
array = Files.readAllBytes(getChunkFile(chunkX, chunkZ, instance.getFolder()).toPath());
|
|
|
|
} catch (IOException e) {
|
|
|
|
e.printStackTrace();
|
2019-08-24 01:05:52 +02:00
|
|
|
instance.createChunk(chunkX, chunkZ, callback); // Unknown error, create new chunk by default
|
|
|
|
return;
|
2019-08-23 23:55:09 +02:00
|
|
|
}
|
2019-08-24 01:05:52 +02:00
|
|
|
|
2019-09-15 13:42:36 +02:00
|
|
|
ChunkReader.readChunk(array, instance, chunkX, chunkZ, true, callback);
|
2019-08-23 23:55:09 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|