Skip to content

Commit a715561

Browse files
committed
Add support for minor pack-versions introduced in 25w31a
1 parent a339247 commit a715561

File tree

10 files changed

+167
-55
lines changed

10 files changed

+167
-55
lines changed

api

Submodule api updated from 4c6ed2f to d1c0f4c

common/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,11 @@
2424
*/
2525
package de.bluecolored.bluemap.common;
2626

27-
import com.google.gson.FieldNamingPolicy;
28-
import com.google.gson.Gson;
29-
import com.google.gson.GsonBuilder;
30-
import com.google.gson.JsonParseException;
31-
import com.google.gson.reflect.TypeToken;
32-
import de.bluecolored.bluemap.api.gson.MarkerGson;
33-
import de.bluecolored.bluemap.api.markers.MarkerSet;
3427
import de.bluecolored.bluemap.common.config.ConfigurationException;
3528
import de.bluecolored.bluemap.common.config.MapConfig;
3629
import de.bluecolored.bluemap.common.config.storage.StorageConfig;
37-
import de.bluecolored.bluemap.common.plugin.Plugin;
3830
import de.bluecolored.bluemap.common.debug.StateDumper;
31+
import de.bluecolored.bluemap.common.plugin.Plugin;
3932
import de.bluecolored.bluemap.core.logger.Logger;
4033
import de.bluecolored.bluemap.core.map.BmMap;
4134
import de.bluecolored.bluemap.core.resources.MinecraftVersion;
@@ -48,14 +41,9 @@
4841
import de.bluecolored.bluemap.core.world.World;
4942
import de.bluecolored.bluemap.core.world.mca.MCAWorld;
5043
import org.jetbrains.annotations.Nullable;
51-
import org.spongepowered.configurate.ConfigurateException;
52-
import org.spongepowered.configurate.ConfigurationNode;
53-
import org.spongepowered.configurate.gson.GsonConfigurationLoader;
54-
import org.spongepowered.configurate.loader.HeaderMode;
5544

5645
import java.io.Closeable;
5746
import java.io.IOException;
58-
import java.lang.reflect.Type;
5947
import java.net.URL;
6048
import java.nio.file.Files;
6149
import java.nio.file.Path;

common/src/main/java/de/bluecolored/bluemap/common/api/BlueMapMapImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,15 @@ public Vector2i getTileOffset() {
9292
}
9393

9494
@Override
95+
@SuppressWarnings("removal")
96+
@Deprecated(forRemoval = true)
9597
public void setTileFilter(@NonNull Predicate<Vector2i> filter) {
9698
unpack(map).setTileFilter(filter);
9799
}
98100

99101
@Override
102+
@SuppressWarnings("removal")
103+
@Deprecated(forRemoval = true)
100104
public Predicate<Vector2i> getTileFilter() {
101105
return unpack(map).getTileFilter();
102106
}

common/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/CombinedMaskSerializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ public CombinedMask deserialize(Type type, ConfigurationNode node) throws Serial
5656

5757
@Override
5858
public void serialize(Type type, @Nullable CombinedMask obj, ConfigurationNode node) {
59-
throw new UnsupportedOperationException("Serialize not supported.");
59+
// serialization not supported
60+
// configurate calls this method sometimes during deserialization for some reason, so we just do nothing here
6061
}
6162

6263
}

core/src/main/java/de/bluecolored/bluemap/core/resources/MinecraftVersion.java

Lines changed: 56 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,27 @@
2424
*/
2525
package de.bluecolored.bluemap.core.resources;
2626

27-
import com.google.gson.Gson;
28-
import com.google.gson.JsonElement;
29-
import com.google.gson.JsonObject;
27+
import com.google.gson.*;
3028
import com.google.gson.annotations.JsonAdapter;
29+
import com.google.gson.annotations.SerializedName;
30+
import com.google.gson.reflect.TypeToken;
3131
import com.google.gson.stream.JsonReader;
32+
import com.google.gson.stream.JsonToken;
3233
import de.bluecolored.bluemap.core.logger.Logger;
3334
import de.bluecolored.bluemap.core.resources.adapter.AbstractTypeAdapterFactory;
35+
import de.bluecolored.bluemap.core.resources.pack.PackVersion;
3436
import de.bluecolored.bluemap.core.util.FileHelper;
3537
import lombok.AccessLevel;
3638
import lombok.Getter;
39+
import lombok.NoArgsConstructor;
3740
import lombok.RequiredArgsConstructor;
3841
import org.jetbrains.annotations.Nullable;
42+
import org.spongepowered.configurate.objectmapping.FieldData;
3943

4044
import java.io.IOException;
4145
import java.io.OutputStream;
4246
import java.io.Reader;
47+
import java.lang.reflect.Type;
4348
import java.nio.charset.StandardCharsets;
4449
import java.nio.file.FileSystem;
4550
import java.nio.file.FileSystems;
@@ -53,7 +58,9 @@
5358
@Getter
5459
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
5560
public class MinecraftVersion {
56-
private static final Gson GSON = new Gson();
61+
private static final Gson GSON = new GsonBuilder()
62+
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
63+
.create();
5764

5865
private static final String LATEST_KNOWN_VERSION = "1.21.8";
5966
private static final String EARLIEST_RESOURCEPACK_VERSION = "1.13";
@@ -62,10 +69,10 @@ public class MinecraftVersion {
6269
private final String id;
6370

6471
private final Path resourcePack;
65-
private final int resourcePackVersion;
72+
private final PackVersion resourcePackVersion;
6673

6774
private final Path dataPack;
68-
private final int dataPackVersion;
75+
private final PackVersion dataPackVersion;
6976

7077
@Override
7178
public boolean equals(Object o) {
@@ -127,10 +134,13 @@ public static MinecraftVersion load(@Nullable String id, Path dataRoot, boolean
127134
VersionInfo resourcePackVersionInfo = loadVersionInfo(resourcePack);
128135
VersionInfo dataPackVersionInfo = resourcePack.equals(dataPack) ? resourcePackVersionInfo : loadVersionInfo(dataPack);
129136

137+
Logger.global.logInfo("Found resource pack version: " + resourcePackVersionInfo.getPackVersion().getResource());
138+
Logger.global.logInfo("Found data pack version: " + resourcePackVersionInfo.getPackVersion().getData());
139+
130140
return new MinecraftVersion(
131141
id,
132-
resourcePack, resourcePackVersionInfo.getResourcePackVersion(),
133-
dataPack, dataPackVersionInfo.getDataPackVersion()
142+
resourcePack, resourcePackVersionInfo.getPackVersion().getResource(),
143+
dataPack, dataPackVersionInfo.getPackVersion().getData()
134144
);
135145

136146
}
@@ -213,43 +223,55 @@ private static VersionInfo loadVersionInfo(Path file) throws IOException {
213223
}
214224

215225
// no version.json found, assume 1.13 - 1.14.4
216-
return new VersionInfo(4, 4);
226+
return new VersionInfo();
217227
}
218228
}
219229

230+
@SuppressWarnings({"unused", "FieldMayBeFinal"})
220231
@Getter
221-
@RequiredArgsConstructor
222-
@JsonAdapter(VersionInfoAdapter.class)
223-
public static class VersionInfo {
232+
private static class VersionInfo {
233+
private PackVersions packVersion = new PackVersions();
234+
}
224235

225-
private final int resourcePackVersion;
226-
private final int dataPackVersion;
236+
@SuppressWarnings("FieldMayBeFinal")
237+
@Getter
238+
@JsonAdapter(PackVersions.Adapter.class)
239+
@NoArgsConstructor
240+
private static class PackVersions {
227241

228-
}
242+
public PackVersions(int resource, int data) {
243+
this.resourceMajor = resource;
244+
this.dataMajor = data;
245+
}
229246

230-
public static class VersionInfoAdapter extends AbstractTypeAdapterFactory<VersionInfo> {
247+
@SerializedName(value = "resource_major", alternate = "resource")
248+
private int resourceMajor = 4;
249+
private int resourceMinor = 0;
250+
@SerializedName(value = "data_major", alternate = "data")
251+
private int dataMajor = 4;
252+
private int dataMinor = 0;
231253

232-
public VersionInfoAdapter() {
233-
super(VersionInfo.class);
254+
public PackVersion getResource() {
255+
return new PackVersion(resourceMajor, resourceMinor);
234256
}
235257

236-
@Override
237-
public VersionInfo read(JsonReader in, Gson gson) throws IOException {
238-
JsonObject object = gson.fromJson(in, JsonObject.class);
239-
240-
JsonElement packVersion = object.get("pack_version");
241-
if (packVersion instanceof JsonObject packVersionObject) {
242-
return new VersionInfo(
243-
packVersionObject.get("resource").getAsInt(),
244-
packVersionObject.get("data").getAsInt()
245-
);
246-
} else {
247-
int version = packVersion.getAsInt();
248-
return new VersionInfo(
249-
version,
250-
version
251-
);
258+
public PackVersion getData() {
259+
return new PackVersion(dataMajor, dataMinor);
260+
}
261+
262+
private static class Adapter extends AbstractTypeAdapterFactory<PackVersions> {
263+
264+
public Adapter() {
265+
super(PackVersions.class);
252266
}
267+
268+
@Override
269+
public PackVersions read(JsonReader in, Gson gson) throws IOException {
270+
return in.peek() == JsonToken.NUMBER ?
271+
new PackVersions(in.nextInt(), 4) :
272+
gson.getDelegateAdapter(this, TypeToken.get(PackVersions.class)).read(in);
273+
}
274+
253275
}
254276

255277
}

core/src/main/java/de/bluecolored/bluemap/core/resources/pack/Pack.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@
4949
@Getter
5050
public abstract class Pack {
5151

52-
private final int packVersion;
52+
private final PackVersion packVersion;
5353
private final @Nullable Set<Key> enabledFeatures;
5454

55-
public Pack(int packVersion) {
55+
public Pack(PackVersion packVersion) {
5656
this(packVersion, null);
5757
}
5858

@@ -137,8 +137,9 @@ public void loadResourcePath(Path root, Loader resourceLoader) throws IOExceptio
137137
for (int i = overlays.length - 1; i >= 0; i--) {
138138
PackMeta.Overlay overlay = overlays[i];
139139
String dir = overlay.getDirectory();
140-
if (dir != null && overlay.getFormats().includes(this.packVersion)) {
140+
if (dir != null && overlay.includes(this.packVersion)) {
141141
Path overlayRoot = root.resolve(dir);
142+
Logger.global.logInfo("Loading overlay '" + overlayRoot + "'...");
142143
if (Files.exists(overlayRoot)) {
143144
try {
144145
loadResourcePath(overlayRoot, resourceLoader);

core/src/main/java/de/bluecolored/bluemap/core/resources/pack/PackMeta.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,23 @@ public class PackMeta {
5050

5151
@Getter
5252
public static class Pack {
53+
@JsonAdapter(PackVersion.MinAdapter.class) private PackVersion minFormat;
54+
@JsonAdapter(PackVersion.MaxAdapter.class) private PackVersion maxFormat;
55+
56+
// <= 1.21.8
5357
private VersionRange packFormat = new VersionRange();
5458
private @Nullable VersionRange supportedFormats;
59+
60+
public boolean includes(PackVersion version) {
61+
62+
// <= 1.21.8
63+
if (minFormat == null || maxFormat == null) {
64+
if (supportedFormats != null && supportedFormats.includes(version.getMajor())) return true;
65+
return packFormat.includes(version.getMajor());
66+
}
67+
68+
return version.isGreaterOrEqual(minFormat) && version.isSmallerOrEqual(maxFormat);
69+
}
5570
}
5671

5772
@Getter
@@ -61,8 +76,23 @@ public static class Overlays {
6176

6277
@Getter
6378
public static class Overlay {
64-
private VersionRange formats = new VersionRange();
79+
@JsonAdapter(PackVersion.MinAdapter.class) private PackVersion minFormat;
80+
@JsonAdapter(PackVersion.MaxAdapter.class) private PackVersion maxFormat;
6581
private @Nullable String directory;
82+
83+
// <= 1.21.8
84+
private VersionRange formats = new VersionRange();
85+
86+
public boolean includes(PackVersion version) {
87+
88+
// <= 1.21.8
89+
if (minFormat == null || maxFormat == null) {
90+
return formats.includes(version.getMajor());
91+
}
92+
93+
return version.isGreaterOrEqual(minFormat) && version.isSmallerOrEqual(maxFormat);
94+
}
95+
6696
}
6797

6898
@Getter
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package de.bluecolored.bluemap.core.resources.pack;
2+
3+
import com.google.gson.TypeAdapter;
4+
import com.google.gson.annotations.JsonAdapter;
5+
import com.google.gson.stream.JsonReader;
6+
import com.google.gson.stream.JsonToken;
7+
import com.google.gson.stream.JsonWriter;
8+
import lombok.AllArgsConstructor;
9+
import lombok.Getter;
10+
import lombok.ToString;
11+
12+
import java.io.IOException;
13+
14+
@AllArgsConstructor
15+
@Getter
16+
@JsonAdapter(PackVersion.MinAdapter.class)
17+
@ToString
18+
public class PackVersion {
19+
private int major, minor;
20+
21+
public boolean isGreaterOrEqual(PackVersion other) {
22+
if (other.major == this.major) return other.minor >= this.minor;
23+
return other.major > this.major;
24+
}
25+
26+
public boolean isSmallerOrEqual(PackVersion other) {
27+
if (other.major == this.major) return other.minor <= this.minor;
28+
return other.major < this.major;
29+
}
30+
31+
public static class Adapter extends TypeAdapter<PackVersion> {
32+
33+
private final int defaultMinor;
34+
35+
public Adapter(int defaultMinor) {
36+
this.defaultMinor = defaultMinor;
37+
}
38+
39+
@Override
40+
public void write(JsonWriter out, PackVersion value) {
41+
throw new UnsupportedOperationException();
42+
}
43+
44+
@Override
45+
public PackVersion read(JsonReader in) throws IOException {
46+
if (in.peek() == JsonToken.NUMBER) return new PackVersion(in.nextInt(), defaultMinor);
47+
in.beginArray();
48+
int major = in.nextInt();
49+
int minor = in.hasNext() ? in.nextInt() : defaultMinor;
50+
in.endArray();
51+
return new PackVersion(major, minor);
52+
}
53+
54+
}
55+
56+
public static class MinAdapter extends Adapter {
57+
public MinAdapter() { super(0); }
58+
}
59+
60+
public static class MaxAdapter extends Adapter {
61+
public MaxAdapter() { super(Integer.MAX_VALUE); }
62+
}
63+
64+
}

core/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/DataPack.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import de.bluecolored.bluemap.core.resources.ResourcePath;
2929
import de.bluecolored.bluemap.core.resources.adapter.ResourcesGson;
3030
import de.bluecolored.bluemap.core.resources.pack.Pack;
31+
import de.bluecolored.bluemap.core.resources.pack.PackVersion;
3132
import de.bluecolored.bluemap.core.resources.pack.ResourcePool;
3233
import de.bluecolored.bluemap.core.resources.pack.datapack.biome.DatapackBiome;
3334
import de.bluecolored.bluemap.core.resources.pack.datapack.dimension.DimensionTypeData;
@@ -60,7 +61,7 @@ public class DataPack extends Pack {
6061

6162
private LegacyBiomes legacyBiomes;
6263

63-
public DataPack(int packVersion) {
64+
public DataPack(PackVersion packVersion) {
6465
super(packVersion);
6566
}
6667

core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePack.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import de.bluecolored.bluemap.core.resources.ResourcePath;
3434
import de.bluecolored.bluemap.core.resources.adapter.ResourcesGson;
3535
import de.bluecolored.bluemap.core.resources.pack.Pack;
36+
import de.bluecolored.bluemap.core.resources.pack.PackVersion;
3637
import de.bluecolored.bluemap.core.resources.pack.ResourcePool;
3738
import de.bluecolored.bluemap.core.resources.pack.resourcepack.atlas.Atlas;
3839
import de.bluecolored.bluemap.core.resources.pack.resourcepack.blockstate.BlockState;
@@ -89,7 +90,7 @@ public interface Extension<T extends ResourcePackExtension> extends Keyed {
8990

9091
private final Map<Extension<?>, ResourcePackExtension> extensions;
9192

92-
public ResourcePack(int packVersion) {
93+
public ResourcePack(PackVersion packVersion) {
9394
super(packVersion);
9495

9596
this.atlases = new ResourcePool<>();

0 commit comments

Comments
 (0)