Skip to content

Commit dbde93c

Browse files
committed
Reimplement Linear region file format support
1 parent ff1e38a commit dbde93c

File tree

10 files changed

+247
-30
lines changed

10 files changed

+247
-30
lines changed

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorld.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public class MCAWorld implements World {
5353
private final Path dimensionFolder;
5454
private final Path regionFolder;
5555

56-
private final ChunkLoader chunkLoader = new ChunkLoader();
56+
private final ChunkLoader chunkLoader = new ChunkLoader(this);
5757
private final LoadingCache<Vector2i, Region> regionCache = Caffeine.newBuilder()
5858
.executor(BlueMap.THREAD_POOL)
5959
.maximumSize(64)

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/ChunkLoader.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import de.bluecolored.bluemap.core.storage.Compression;
44
import de.bluecolored.bluemap.core.world.mca.MCAUtil;
5-
import de.bluecolored.bluemap.core.world.mca.region.MCARegion;
5+
import de.bluecolored.bluemap.core.world.mca.MCAWorld;
66
import lombok.Getter;
77
import lombok.RequiredArgsConstructor;
88
import org.jetbrains.annotations.Nullable;
@@ -16,6 +16,12 @@
1616

1717
public class ChunkLoader {
1818

19+
private final MCAWorld world;
20+
21+
public ChunkLoader(MCAWorld world) {
22+
this.world = world;
23+
}
24+
1925
// sorted list of chunk-versions, loaders at the start of the list are preferred over loaders at the end
2026
private static final List<ChunkVersionLoader<?>> CHUNK_VERSION_LOADERS = List.of(
2127
new ChunkVersionLoader<>(Chunk_1_18.Data.class, Chunk_1_18::new, 2844),
@@ -26,23 +32,23 @@ public class ChunkLoader {
2632

2733
private ChunkVersionLoader<?> lastUsedLoader = CHUNK_VERSION_LOADERS.get(0);
2834

29-
public MCAChunk load(MCARegion region, byte[] data, int offset, int length, Compression compression) throws IOException {
35+
public MCAChunk load(byte[] data, int offset, int length, Compression compression) throws IOException {
3036
InputStream in = new ByteArrayInputStream(data, offset, length);
3137
in.mark(-1);
3238

3339
// try last used version
3440
ChunkVersionLoader<?> usedLoader = lastUsedLoader;
3541
MCAChunk chunk;
3642
try (InputStream decompressedIn = new BufferedInputStream(compression.decompress(in))) {
37-
chunk = usedLoader.load(region, decompressedIn);
43+
chunk = usedLoader.load(world, decompressedIn);
3844
}
3945

4046
// check version and reload chunk if the wrong loader has been used and a better one has been found
4147
ChunkVersionLoader<?> actualLoader = findBestLoaderForVersion(chunk.getDataVersion());
4248
if (actualLoader != null && usedLoader != actualLoader) {
4349
in.reset(); // reset read position
4450
try (InputStream decompressedIn = new BufferedInputStream(compression.decompress(in))) {
45-
chunk = actualLoader.load(region, decompressedIn);
51+
chunk = actualLoader.load(world, decompressedIn);
4652
}
4753
lastUsedLoader = actualLoader;
4854
}
@@ -62,12 +68,12 @@ public MCAChunk load(MCARegion region, byte[] data, int offset, int length, Comp
6268
private static class ChunkVersionLoader<D extends MCAChunk.Data> {
6369

6470
private final Class<D> dataType;
65-
private final BiFunction<MCARegion, D, MCAChunk> constructor;
71+
private final BiFunction<MCAWorld, D, MCAChunk> constructor;
6672
private final int dataVersion;
6773

68-
public MCAChunk load(MCARegion region, InputStream in) throws IOException {
74+
public MCAChunk load(MCAWorld world, InputStream in) throws IOException {
6975
D data = MCAUtil.BLUENBT.read(in, dataType);
70-
return mightSupport(data.getDataVersion()) ? constructor.apply(region, data) : new MCAChunk(region, data) {};
76+
return mightSupport(data.getDataVersion()) ? constructor.apply(world, data) : new MCAChunk(world, data) {};
7177
}
7278

7379
public boolean mightSupport(int dataVersion) {

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_13.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import de.bluecolored.bluemap.core.world.DimensionType;
88
import de.bluecolored.bluemap.core.world.LightData;
99
import de.bluecolored.bluemap.core.world.mca.MCAUtil;
10-
import de.bluecolored.bluemap.core.world.mca.region.MCARegion;
10+
import de.bluecolored.bluemap.core.world.mca.MCAWorld;
1111
import de.bluecolored.bluenbt.NBTName;
1212
import lombok.Getter;
1313
import org.jetbrains.annotations.Nullable;
@@ -38,8 +38,8 @@ public class Chunk_1_13 extends MCAChunk {
3838

3939
final int[] biomes;
4040

41-
public Chunk_1_13(MCARegion region, Data data) {
42-
super(region, data);
41+
public Chunk_1_13(MCAWorld world, Data data) {
42+
super(world, data);
4343

4444
Level level = data.level;
4545

@@ -50,7 +50,7 @@ public Chunk_1_13(MCARegion region, Data data) {
5050
STATUS_POSTPROCESSED.equals(level.status);
5151
this.inhabitedTime = level.inhabitedTime;
5252

53-
DimensionType dimensionType = getRegion().getWorld().getDimensionType();
53+
DimensionType dimensionType = getWorld().getDimensionType();
5454
this.skyLight = dimensionType.hasSkylight() ? 16 : 0;
5555

5656
this.worldSurfaceHeights = level.heightmaps.worldSurface;

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_15.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package de.bluecolored.bluemap.core.world.mca.chunk;
22

33
import de.bluecolored.bluemap.core.world.Biome;
4-
import de.bluecolored.bluemap.core.world.mca.region.MCARegion;
4+
import de.bluecolored.bluemap.core.world.mca.MCAWorld;
55

66
public class Chunk_1_15 extends Chunk_1_13 {
77

8-
public Chunk_1_15(MCARegion region, Data data) {
9-
super(region, data);
8+
public Chunk_1_15(MCAWorld world, Data data) {
9+
super(world, data);
1010
}
1111

1212
@Override

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_16.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import de.bluecolored.bluemap.core.world.DimensionType;
88
import de.bluecolored.bluemap.core.world.LightData;
99
import de.bluecolored.bluemap.core.world.mca.MCAUtil;
10+
import de.bluecolored.bluemap.core.world.mca.MCAWorld;
1011
import de.bluecolored.bluemap.core.world.mca.PackedIntArrayAccess;
11-
import de.bluecolored.bluemap.core.world.mca.region.MCARegion;
1212
import de.bluecolored.bluenbt.NBTName;
1313
import lombok.Getter;
1414
import org.jetbrains.annotations.Nullable;
@@ -37,16 +37,16 @@ public class Chunk_1_16 extends MCAChunk {
3737

3838
private final int[] biomes;
3939

40-
public Chunk_1_16(MCARegion region, Data data) {
41-
super(region, data);
40+
public Chunk_1_16(MCAWorld world, Data data) {
41+
super(world, data);
4242

4343
Level level = data.level;
4444

4545
this.generated = !STATUS_EMPTY.equals(level.status);
4646
this.hasLightData = STATUS_FULL.equals(level.status);
4747
this.inhabitedTime = level.inhabitedTime;
4848

49-
DimensionType dimensionType = getRegion().getWorld().getDimensionType();
49+
DimensionType dimensionType = getWorld().getDimensionType();
5050
this.skyLight = dimensionType.hasSkylight() ? 16 : 0;
5151

5252
int worldHeight = dimensionType.getHeight();

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_18.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import de.bluecolored.bluemap.core.world.DimensionType;
88
import de.bluecolored.bluemap.core.world.LightData;
99
import de.bluecolored.bluemap.core.world.mca.MCAUtil;
10+
import de.bluecolored.bluemap.core.world.mca.MCAWorld;
1011
import de.bluecolored.bluemap.core.world.mca.PackedIntArrayAccess;
11-
import de.bluecolored.bluemap.core.world.mca.region.MCARegion;
1212
import de.bluecolored.bluenbt.NBTName;
1313
import lombok.Getter;
1414
import org.jetbrains.annotations.Nullable;
@@ -37,14 +37,14 @@ public class Chunk_1_18 extends MCAChunk {
3737
private final Section[] sections;
3838
private final int sectionMin, sectionMax;
3939

40-
public Chunk_1_18(MCARegion region, Data data) {
41-
super(region, data);
40+
public Chunk_1_18(MCAWorld world, Data data) {
41+
super(world, data);
4242

4343
this.generated = !STATUS_EMPTY.equals(data.status);
4444
this.hasLightData = STATUS_FULL.equals(data.status);
4545
this.inhabitedTime = data.inhabitedTime;
4646

47-
DimensionType dimensionType = getRegion().getWorld().getDimensionType();
47+
DimensionType dimensionType = getWorld().getDimensionType();
4848
this.worldMinY = dimensionType.getMinY();
4949
this.skyLight = dimensionType.hasSkylight() ? 16 : 0;
5050

BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/MCAChunk.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import de.bluecolored.bluemap.core.world.BlockState;
44
import de.bluecolored.bluemap.core.world.Chunk;
5-
import de.bluecolored.bluemap.core.world.mca.region.MCARegion;
5+
import de.bluecolored.bluemap.core.world.mca.MCAWorld;
66
import lombok.Getter;
77
import lombok.ToString;
88

@@ -20,11 +20,11 @@ public abstract class MCAChunk implements Chunk {
2020
protected static final String[] EMPTY_STRING_ARRAY = new String[0];
2121
protected static final BlockState[] EMPTY_BLOCKSTATE_ARRAY = new BlockState[0];
2222

23-
private final MCARegion region;
23+
private final MCAWorld world;
2424
private final int dataVersion;
2525

26-
public MCAChunk(MCARegion region, Data chunkData) {
27-
this.region = region;
26+
public MCAChunk(MCAWorld world, Data chunkData) {
27+
this.world = world;
2828
this.dataVersion = chunkData.getDataVersion();
2929
}
3030

0 commit comments

Comments
 (0)