From 60c113b0e85eab82e0803834af2dd2837d681e73 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 02:58:11 -0400 Subject: [PATCH] Allow reading region chunks without loading mca --- .../volmit/iris/engine/data/mca/MCAFile.java | 24 +++++++++++++++++++ .../volmit/iris/engine/data/mca/MCAUtil.java | 10 ++++++++ 2 files changed, 34 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java b/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java index 86b04fe1b..ca4842971 100644 --- a/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java +++ b/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java @@ -19,6 +19,9 @@ package com.volmit.iris.engine.data.mca; import com.volmit.iris.engine.data.nbt.tag.CompoundTag; +import com.volmit.iris.engine.hunk.storage.ArrayHunk; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.math.Position2; import java.io.IOException; import java.io.RandomAccessFile; @@ -88,6 +91,27 @@ public class MCAFile { } } + public KList samplePositions(RandomAccessFile raf) throws IOException { + KList p2 = new KList<>(); + chunks = new AtomicReferenceArray<>(1024); + int x = 0; + int z = 0; + for (int i = 0; i < 1024; i++) { + x++; + z++; + + raf.seek(i * 4); + int offset = raf.read() << 16; + offset |= (raf.read() & 0xFF) << 8; + offset |= raf.read() & 0xFF; + if (raf.readByte() == 0) { + continue; + } + p2.add(new Position2(x & 31, (z / 32) & 31)); + } + return p2; + } + public AtomicReferenceArray getChunks() { return chunks; } diff --git a/src/main/java/com/volmit/iris/engine/data/mca/MCAUtil.java b/src/main/java/com/volmit/iris/engine/data/mca/MCAUtil.java index e438cae10..68a23e4b8 100644 --- a/src/main/java/com/volmit/iris/engine/data/mca/MCAUtil.java +++ b/src/main/java/com/volmit/iris/engine/data/mca/MCAUtil.java @@ -18,6 +18,9 @@ package com.volmit.iris.engine.data.mca; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.math.Position2; + import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; @@ -83,6 +86,13 @@ public final class MCAUtil { } } + public static KList sampleChunkPositions(File file) throws IOException { + MCAFile mcaFile = newMCAFile(file); + try (RandomAccessFile raf = new RandomAccessFile(file, "r")) { + return mcaFile.samplePositions(raf); + } + } + /** * Calls {@link MCAUtil#write(MCAFile, File, boolean)} without changing the timestamps. *