mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Work around older Gson versions without record support
This commit is contained in:
parent
7eb5b539b5
commit
360350d44e
8 changed files with 60 additions and 19 deletions
|
@ -25,6 +25,8 @@ dependencies {
|
||||||
compileOnly(libs.paper.mojangapi)
|
compileOnly(libs.paper.mojangapi)
|
||||||
|
|
||||||
compileOnlyApi(libs.viaversion)
|
compileOnlyApi(libs.viaversion)
|
||||||
|
|
||||||
|
implementation(libs.gson.record.factory) // For 1.16.5/1.17.1
|
||||||
}
|
}
|
||||||
|
|
||||||
platformRelocate("it.unimi.dsi.fastutil")
|
platformRelocate("it.unimi.dsi.fastutil")
|
||||||
|
@ -36,6 +38,7 @@ platformRelocate("me.lucko.commodore")
|
||||||
platformRelocate("org.yaml") // Broken as of 1.20
|
platformRelocate("org.yaml") // Broken as of 1.20
|
||||||
platformRelocate("org.spongepowered")
|
platformRelocate("org.spongepowered")
|
||||||
platformRelocate("io.leangen.geantyref")
|
platformRelocate("io.leangen.geantyref")
|
||||||
|
platformRelocate("marcono1234.gson")
|
||||||
|
|
||||||
// These dependencies are already present on the platform
|
// These dependencies are already present on the platform
|
||||||
provided(libs.viaversion)
|
provided(libs.viaversion)
|
||||||
|
|
|
@ -20,6 +20,10 @@ dependencies {
|
||||||
implementation(libs.configurate.yaml)
|
implementation(libs.configurate.yaml)
|
||||||
api(libs.guava)
|
api(libs.guava)
|
||||||
|
|
||||||
|
compileOnly(libs.gson.record.factory) {
|
||||||
|
isTransitive = false
|
||||||
|
}
|
||||||
|
|
||||||
// Fastutil Maps
|
// Fastutil Maps
|
||||||
implementation(libs.bundles.fastutil)
|
implementation(libs.bundles.fastutil)
|
||||||
|
|
||||||
|
@ -61,7 +65,7 @@ dependencies {
|
||||||
|
|
||||||
// Test
|
// Test
|
||||||
testImplementation(libs.junit)
|
testImplementation(libs.junit)
|
||||||
testImplementation(libs.gson.runtime)
|
testImplementation(libs.gson.runtime) // Record support
|
||||||
|
|
||||||
// Annotation Processors
|
// Annotation Processors
|
||||||
compileOnly(projects.ap)
|
compileOnly(projects.ap)
|
||||||
|
|
|
@ -29,7 +29,6 @@ import com.fasterxml.jackson.core.JsonParser;
|
||||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import com.google.gson.reflect.TypeToken;
|
import com.google.gson.reflect.TypeToken;
|
||||||
import io.netty.channel.epoll.Epoll;
|
import io.netty.channel.epoll.Epoll;
|
||||||
import io.netty.util.NettyRuntime;
|
import io.netty.util.NettyRuntime;
|
||||||
|
@ -57,7 +56,11 @@ import org.geysermc.geyser.api.GeyserApi;
|
||||||
import org.geysermc.geyser.api.command.CommandSource;
|
import org.geysermc.geyser.api.command.CommandSource;
|
||||||
import org.geysermc.geyser.api.event.EventBus;
|
import org.geysermc.geyser.api.event.EventBus;
|
||||||
import org.geysermc.geyser.api.event.EventRegistrar;
|
import org.geysermc.geyser.api.event.EventRegistrar;
|
||||||
import org.geysermc.geyser.api.event.lifecycle.*;
|
import org.geysermc.geyser.api.event.lifecycle.GeyserPostInitializeEvent;
|
||||||
|
import org.geysermc.geyser.api.event.lifecycle.GeyserPostReloadEvent;
|
||||||
|
import org.geysermc.geyser.api.event.lifecycle.GeyserPreInitializeEvent;
|
||||||
|
import org.geysermc.geyser.api.event.lifecycle.GeyserPreReloadEvent;
|
||||||
|
import org.geysermc.geyser.api.event.lifecycle.GeyserShutdownEvent;
|
||||||
import org.geysermc.geyser.api.network.AuthType;
|
import org.geysermc.geyser.api.network.AuthType;
|
||||||
import org.geysermc.geyser.api.network.BedrockListener;
|
import org.geysermc.geyser.api.network.BedrockListener;
|
||||||
import org.geysermc.geyser.api.network.RemoteServer;
|
import org.geysermc.geyser.api.network.RemoteServer;
|
||||||
|
@ -87,7 +90,14 @@ import org.geysermc.geyser.skin.SkinProvider;
|
||||||
import org.geysermc.geyser.text.GeyserLocale;
|
import org.geysermc.geyser.text.GeyserLocale;
|
||||||
import org.geysermc.geyser.text.MinecraftLocale;
|
import org.geysermc.geyser.text.MinecraftLocale;
|
||||||
import org.geysermc.geyser.translator.text.MessageTranslator;
|
import org.geysermc.geyser.translator.text.MessageTranslator;
|
||||||
import org.geysermc.geyser.util.*;
|
import org.geysermc.geyser.util.AssetUtils;
|
||||||
|
import org.geysermc.geyser.util.CooldownUtils;
|
||||||
|
import org.geysermc.geyser.util.DimensionUtils;
|
||||||
|
import org.geysermc.geyser.util.JsonUtils;
|
||||||
|
import org.geysermc.geyser.util.Metrics;
|
||||||
|
import org.geysermc.geyser.util.NewsHandler;
|
||||||
|
import org.geysermc.geyser.util.VersionCheckUtils;
|
||||||
|
import org.geysermc.geyser.util.WebUtils;
|
||||||
import org.geysermc.mcprotocollib.network.tcp.TcpSession;
|
import org.geysermc.mcprotocollib.network.tcp.TcpSession;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -101,7 +111,14 @@ import java.net.UnknownHostException;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.security.Key;
|
import java.security.Key;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.UUID;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
@ -118,7 +135,7 @@ public class GeyserImpl implements GeyserApi {
|
||||||
.enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES)
|
.enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES)
|
||||||
.enable(JsonParser.Feature.ALLOW_SINGLE_QUOTES);
|
.enable(JsonParser.Feature.ALLOW_SINGLE_QUOTES);
|
||||||
|
|
||||||
public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
|
public static final Gson GSON = JsonUtils.createGson();
|
||||||
|
|
||||||
public static final String NAME = "Geyser";
|
public static final String NAME = "Geyser";
|
||||||
public static final String GIT_VERSION = BuildData.GIT_VERSION;
|
public static final String GIT_VERSION = BuildData.GIT_VERSION;
|
||||||
|
|
|
@ -30,6 +30,7 @@ import com.google.gson.JsonDeserializationContext;
|
||||||
import com.google.gson.JsonDeserializer;
|
import com.google.gson.JsonDeserializer;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonParseException;
|
import com.google.gson.JsonParseException;
|
||||||
|
import com.google.gson.annotations.JsonAdapter;
|
||||||
import com.google.gson.annotations.SerializedName;
|
import com.google.gson.annotations.SerializedName;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
import org.geysermc.geyser.api.pack.ResourcePackManifest;
|
import org.geysermc.geyser.api.pack.ResourcePackManifest;
|
||||||
|
@ -46,6 +47,7 @@ public record GeyserResourcePackManifest(@SerializedName("format_version") int f
|
||||||
|
|
||||||
public record Dependency(UUID uuid, Version version) implements ResourcePackManifest.Dependency { }
|
public record Dependency(UUID uuid, Version version) implements ResourcePackManifest.Dependency { }
|
||||||
|
|
||||||
|
@JsonAdapter(value = Version.VersionDeserializer.class)
|
||||||
public record Version(int major, int minor, int patch) implements ResourcePackManifest.Version {
|
public record Version(int major, int minor, int patch) implements ResourcePackManifest.Version {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -25,8 +25,6 @@
|
||||||
|
|
||||||
package org.geysermc.geyser.registry.loader;
|
package org.geysermc.geyser.registry.loader;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
|
||||||
import com.google.gson.GsonBuilder;
|
|
||||||
import org.geysermc.geyser.GeyserImpl;
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
import org.geysermc.geyser.api.event.lifecycle.GeyserLoadResourcePacksEvent;
|
import org.geysermc.geyser.api.event.lifecycle.GeyserLoadResourcePacksEvent;
|
||||||
import org.geysermc.geyser.api.pack.ResourcePack;
|
import org.geysermc.geyser.api.pack.ResourcePack;
|
||||||
|
@ -57,9 +55,6 @@ import java.util.zip.ZipFile;
|
||||||
* Loads {@link ResourcePack}s within a {@link Path} directory, firing the {@link GeyserLoadResourcePacksEvent}.
|
* Loads {@link ResourcePack}s within a {@link Path} directory, firing the {@link GeyserLoadResourcePacksEvent}.
|
||||||
*/
|
*/
|
||||||
public class ResourcePackLoader implements RegistryLoader<Path, Map<String, ResourcePack>> {
|
public class ResourcePackLoader implements RegistryLoader<Path, Map<String, ResourcePack>> {
|
||||||
private static final Gson GSON = new GsonBuilder()
|
|
||||||
.registerTypeAdapter(GeyserResourcePackManifest.Version.class, new GeyserResourcePackManifest.Version.VersionDeserializer())
|
|
||||||
.create();
|
|
||||||
|
|
||||||
static final PathMatcher PACK_MATCHER = FileSystems.getDefault().getPathMatcher("glob:**.{zip,mcpack}");
|
static final PathMatcher PACK_MATCHER = FileSystems.getDefault().getPathMatcher("glob:**.{zip,mcpack}");
|
||||||
|
|
||||||
|
@ -140,7 +135,7 @@ public class ResourcePackLoader implements RegistryLoader<Path, Map<String, Reso
|
||||||
}
|
}
|
||||||
if (name.contains("manifest.json")) {
|
if (name.contains("manifest.json")) {
|
||||||
try {
|
try {
|
||||||
GeyserResourcePackManifest manifest = FileUtils.loadJson(GSON, zip.getInputStream(x), GeyserResourcePackManifest.class);
|
GeyserResourcePackManifest manifest = FileUtils.loadJson(zip.getInputStream(x), GeyserResourcePackManifest.class);
|
||||||
if (manifest.header().uuid() != null) {
|
if (manifest.header().uuid() != null) {
|
||||||
manifestReference.set(manifest);
|
manifestReference.set(manifest);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,11 +30,15 @@ import com.fasterxml.jackson.annotation.Nulls;
|
||||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
|
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
|
||||||
import com.google.gson.Gson;
|
|
||||||
import org.geysermc.geyser.GeyserBootstrap;
|
import org.geysermc.geyser.GeyserBootstrap;
|
||||||
import org.geysermc.geyser.GeyserImpl;
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
@ -65,12 +69,8 @@ public class FileUtils {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> T loadJson(InputStream src, Class<T> valueType) {
|
public static <T> T loadJson(InputStream src, Class<T> valueType) {
|
||||||
return loadJson(GeyserImpl.GSON, src, valueType);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> T loadJson(Gson gson, InputStream src, Class<T> valueType) {
|
|
||||||
// Read specifically with UTF-8 to allow any non-UTF-encoded JSON to read
|
// Read specifically with UTF-8 to allow any non-UTF-encoded JSON to read
|
||||||
return gson.fromJson(new InputStreamReader(src, StandardCharsets.UTF_8), valueType);
|
return GeyserImpl.GSON.fromJson(new InputStreamReader(src, StandardCharsets.UTF_8), valueType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -25,9 +25,13 @@
|
||||||
|
|
||||||
package org.geysermc.geyser.util;
|
package org.geysermc.geyser.util;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParser;
|
import com.google.gson.JsonParser;
|
||||||
|
import marcono1234.gson.recordadapter.RecordTypeAdapterFactory;
|
||||||
import org.geysermc.geyser.GeyserImpl;
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
|
import org.geysermc.geyser.pack.GeyserResourcePackManifest;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
@ -48,6 +52,21 @@ public final class JsonUtils {
|
||||||
return GeyserImpl.GSON.fromJson(new InputStreamReader(stream), type);
|
return GeyserImpl.GSON.fromJson(new InputStreamReader(stream), type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Gson createGson() {
|
||||||
|
GsonBuilder builder = new GsonBuilder().setPrettyPrinting();
|
||||||
|
try {
|
||||||
|
new Gson().fromJson("{\"version\":[1,0,0],\"uuid\":\"eebb4ea8-a701-11eb-95ba-047d7bb283ba\"}", GeyserResourcePackManifest.Dependency.class);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
// 1.16.5 and 1.17.1 (at minimum) have an outdated Gson version that doesn't support records.
|
||||||
|
// Remove this workaround when all platforms support Gson 2.10+
|
||||||
|
// (Explicitly allow missing component values - the dependencies module for resource packs, for example, can be missing)
|
||||||
|
builder.registerTypeAdapterFactory(RecordTypeAdapterFactory.builder().allowMissingComponentValues().create())
|
||||||
|
// Since this is a record, the above will take precedence unless we explicitly declare it.
|
||||||
|
.registerTypeAdapter(GeyserResourcePackManifest.Version.class, new GeyserResourcePackManifest.Version.VersionDeserializer());
|
||||||
|
}
|
||||||
|
return builder.create();
|
||||||
|
}
|
||||||
|
|
||||||
private JsonUtils() {
|
private JsonUtils() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,6 +113,7 @@ commodore = { group = "me.lucko", name = "commodore", version.ref = "commodore"
|
||||||
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
|
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
|
||||||
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
|
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
|
||||||
gson-runtime = { group = "com.google.code.gson", name = "gson", version.ref = "gson-runtime" }
|
gson-runtime = { group = "com.google.code.gson", name = "gson", version.ref = "gson-runtime" }
|
||||||
|
gson-record-factory = { group = "com.github.Marcono1234", name = "gson-record-type-adapter-factory", version = "0.3.0" }
|
||||||
junit = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit" }
|
junit = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit" }
|
||||||
mcauthlib = { group = "com.github.GeyserMC", name = "MCAuthLib", version.ref = "mcauthlib" }
|
mcauthlib = { group = "com.github.GeyserMC", name = "MCAuthLib", version.ref = "mcauthlib" }
|
||||||
mcprotocollib = { group = "org.geysermc.mcprotocollib", name = "protocol", version.ref = "mcprotocollib" }
|
mcprotocollib = { group = "org.geysermc.mcprotocollib", name = "protocol", version.ref = "mcprotocollib" }
|
||||||
|
|
Loading…
Reference in a new issue