mirror of
https://github.com/BlueMap-Minecraft/BlueMap.git
synced 2025-01-23 00:31:23 +01:00
Tentative fix for #24
This commit is contained in:
parent
85f5d8947b
commit
de7b0cba02
@ -218,40 +218,57 @@ private Chunk loadChunk(Vector2i chunkPos) throws IOException {
|
|||||||
Vector2i regionPos = chunkToRegion(chunkPos);
|
Vector2i regionPos = chunkToRegion(chunkPos);
|
||||||
Path regionPath = getMCAFilePath(regionPos);
|
Path regionPath = getMCAFilePath(regionPos);
|
||||||
|
|
||||||
try (RandomAccessFile raf = new RandomAccessFile(regionPath.toFile(), "r")) {
|
Throwable exception = null;
|
||||||
|
|
||||||
int xzChunk = Math.floorMod(chunkPos.getY(), 32) * 32 + Math.floorMod(chunkPos.getX(), 32);
|
for (int tries = 1; tries <= 5; tries++) {
|
||||||
|
if (tries > 1) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(200);
|
||||||
|
} catch (InterruptedException interrupt) {
|
||||||
|
throw new IOException("Interrupted while waiting for the " + tries + "th try to load a chunk..");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
raf.seek(xzChunk * 4);
|
try (RandomAccessFile raf = new RandomAccessFile(regionPath.toFile(), "r")) {
|
||||||
int offset = raf.read() << 16;
|
|
||||||
offset |= (raf.read() & 0xFF) << 8;
|
|
||||||
offset |= raf.read() & 0xFF;
|
|
||||||
offset *= 4096;
|
|
||||||
|
|
||||||
int size = raf.readByte() * 4096;
|
int xzChunk = Math.floorMod(chunkPos.getY(), 32) * 32 + Math.floorMod(chunkPos.getX(), 32);
|
||||||
if (size == 0) {
|
|
||||||
|
raf.seek(xzChunk * 4);
|
||||||
|
int offset = raf.read() << 16;
|
||||||
|
offset |= (raf.read() & 0xFF) << 8;
|
||||||
|
offset |= raf.read() & 0xFF;
|
||||||
|
offset *= 4096;
|
||||||
|
|
||||||
|
int size = raf.readByte() * 4096;
|
||||||
|
if (size == 0) {
|
||||||
|
return Chunk.empty(this, chunkPos);
|
||||||
|
}
|
||||||
|
|
||||||
|
raf.seek(offset + 4); // +4 skip chunk size
|
||||||
|
|
||||||
|
byte compressionTypeByte = raf.readByte();
|
||||||
|
CompressionType compressionType = CompressionType.getFromID(compressionTypeByte);
|
||||||
|
if (compressionType == null) {
|
||||||
|
throw new IOException("invalid compression type " + compressionTypeByte);
|
||||||
|
}
|
||||||
|
|
||||||
|
DataInputStream dis = new DataInputStream(new BufferedInputStream(compressionType.decompress(new FileInputStream(raf.getFD()))));
|
||||||
|
Tag<?> tag = Tag.deserialize(dis, Tag.DEFAULT_MAX_DEPTH);
|
||||||
|
if (tag instanceof CompoundTag) {
|
||||||
|
return Chunk.create(this, (CompoundTag) tag);
|
||||||
|
} else {
|
||||||
|
throw new IOException("invalid data tag: " + (tag == null ? "null" : tag.getClass().getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (FileNotFoundException ex) {
|
||||||
return Chunk.empty(this, chunkPos);
|
return Chunk.empty(this, chunkPos);
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
exception = ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
raf.seek(offset + 4); // +4 skip chunk size
|
|
||||||
|
|
||||||
byte compressionTypeByte = raf.readByte();
|
|
||||||
CompressionType compressionType = CompressionType.getFromID(compressionTypeByte);
|
|
||||||
if (compressionType == null) {
|
|
||||||
throw new IOException("invalid compression type " + compressionTypeByte);
|
|
||||||
}
|
|
||||||
|
|
||||||
DataInputStream dis = new DataInputStream(new BufferedInputStream(compressionType.decompress(new FileInputStream(raf.getFD()))));
|
|
||||||
Tag<?> tag = Tag.deserialize(dis, Tag.DEFAULT_MAX_DEPTH);
|
|
||||||
if (tag instanceof CompoundTag) {
|
|
||||||
return Chunk.create(this, (CompoundTag) tag);
|
|
||||||
} else {
|
|
||||||
throw new IOException("invalid data tag: " + (tag == null ? "null" : tag.getClass().getName()));
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (FileNotFoundException ex) {
|
|
||||||
return Chunk.empty(this, chunkPos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (exception == null) throw new IOException("Failed to load chunk after multiple attempts!");
|
||||||
|
throw new IOException("Failed to load chunk after multiple attempts!", exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
Reference in New Issue
Block a user