diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/Command.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/Command.java index e7daa403..e2fdd2cf 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/Command.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/Command.java @@ -4,8 +4,11 @@ import me.tongfei.progressbar.ProgressBarBuilder; import me.tongfei.progressbar.ProgressBarStyle; import pro.gravit.launcher.AsyncDownloader; +import pro.gravit.launcher.Launcher; +import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launchserver.LaunchServer; import pro.gravit.utils.Downloader; +import pro.gravit.utils.command.CommandException; import java.io.IOException; import java.nio.file.Path; @@ -29,6 +32,13 @@ public Command(Map childCommands, Laun this.server = server; } + protected ClientProfile.Version parseClientVersion(String arg) throws CommandException { + if(arg.isEmpty()) { + throw new CommandException("ClientVersion can't be empty"); + } + return Launcher.gsonManager.gson.fromJson(arg, ClientProfile.Version.class); + } + protected boolean showApplyDialog(String text) throws IOException { System.out.printf("%s [Y/N]:", text); String response = server.commandHandler.readLine().toLowerCase(Locale.ROOT); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadClientCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadClientCommand.java index 942be0c2..09922041 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadClientCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/DownloadClientCommand.java @@ -5,6 +5,7 @@ import org.apache.logging.log4j.Logger; import pro.gravit.launcher.Launcher; import pro.gravit.launcher.profiles.ClientProfile; +import pro.gravit.launcher.profiles.ClientProfileVersions; import pro.gravit.launchserver.LaunchServer; import pro.gravit.launchserver.command.Command; import pro.gravit.launchserver.helper.MakeProfileHelper; @@ -81,9 +82,9 @@ public void invoke(String... args) throws IOException, CommandException { if (internalVersion.contains("-")) { internalVersion = internalVersion.substring(0, versionName.indexOf('-')); } - ClientProfile.Version version = ClientProfile.Version.byName(internalVersion); - if (version.compareTo(ClientProfile.Version.MC164) <= 0) { - logger.warn("Minecraft 1.6.4 and below not supported. Use at your own risk"); + ClientProfile.Version version = ClientProfile.Version.of(internalVersion); + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_7_10) <= 0) { + logger.warn("Minecraft 1.7.9 and below not supported. Use at your own risk"); } MakeProfileHelper.MakeProfileOption[] options = MakeProfileHelper.getMakeProfileOptionsFromDir(clientDir, version, Files.exists(server.updatesDir.resolve("assets"))); for (MakeProfileHelper.MakeProfileOption option : options) { diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/MakeProfileCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/MakeProfileCommand.java index 8d70af88..98997e04 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/MakeProfileCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/hash/MakeProfileCommand.java @@ -32,12 +32,12 @@ public String getUsageDescription() { @Override public void invoke(String... args) throws Exception { verifyArgs(args, 3); - ClientProfile.Version version = ClientProfile.Version.byName(args[1]); + ClientProfile.Version version = parseClientVersion(args[1]); MakeProfileHelper.MakeProfileOption[] options = MakeProfileHelper.getMakeProfileOptionsFromDir(server.updatesDir.resolve(args[2]), version, Files.exists(server.updatesDir.resolve("assets"))); for (MakeProfileHelper.MakeProfileOption option : options) { logger.info("Detected option {}", option); } - ClientProfile profile = MakeProfileHelper.makeProfile(ClientProfile.Version.byName(args[1]), args[0], options); + ClientProfile profile = MakeProfileHelper.makeProfile(version, args[0], options); try (Writer writer = IOHelper.newWriter(server.profilesDir.resolve(args[0].concat(".json")))) { Launcher.gsonManager.configGson.toJson(profile, writer); } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/SecurityCheckCommand.java b/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/SecurityCheckCommand.java index 114a054b..e9ef4cb4 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/SecurityCheckCommand.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/command/service/SecurityCheckCommand.java @@ -169,7 +169,7 @@ public void invoke(String... args) { bad = true; } } else { - if (nextToken.equals("memory_repo") || nextToken.equals(profile.getVersion().name)) { + if (nextToken.equals("memory_repo") || nextToken.equals(profile.getVersion().toString())) { printCheckResult(profileModuleName, String.format("updateExclusions %s not safe. Cheats may be injected very easy!", exc), false); bad = true; } diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/helper/MakeProfileHelper.java b/LaunchServer/src/main/java/pro/gravit/launchserver/helper/MakeProfileHelper.java index dc270962..bb03de78 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/helper/MakeProfileHelper.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/helper/MakeProfileHelper.java @@ -2,6 +2,7 @@ import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launcher.profiles.ClientProfileBuilder; +import pro.gravit.launcher.profiles.ClientProfileVersions; import pro.gravit.launcher.profiles.optional.OptionalFile; import pro.gravit.launcher.profiles.optional.actions.OptionalActionFile; import pro.gravit.launcher.profiles.optional.actions.OptionalActionJvmArgs; @@ -16,14 +17,14 @@ public class MakeProfileHelper { public static ClientProfile makeProfile(ClientProfile.Version version, String title, MakeProfileOption... options) { ClientProfileBuilder builder = new ClientProfileBuilder(); - builder.setVersion(version.name); + builder.setVersion(version); builder.setDir(title); if (findOption(options, MakeProfileOptionGlobalAssets.class).isPresent()) { builder.setAssetDir("assets"); } else { - builder.setAssetDir("asset" + version.name); + builder.setAssetDir("asset" + version.toCleanString()); } - builder.setAssetIndex(version.name); + builder.setAssetIndex(version.toString()); builder.setInfo("Информация о сервере"); builder.setTitle(title); builder.setUuid(UUID.randomUUID()); @@ -35,7 +36,7 @@ public static ClientProfile makeProfile(ClientProfile.Version version, String ti List classPath = new ArrayList<>(5); classPath.add("libraries"); classPath.add("minecraft.jar"); - if (version.compareTo(ClientProfile.Version.MC1122) <= 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_12_2) <= 0) { findOption(options, MakeProfileOptionForge.class).ifPresent(e -> classPath.add("forge.jar")); findOption(options, MakeProfileOptionLiteLoader.class).ifPresent(e -> classPath.add("liteloader.jar")); } @@ -46,20 +47,20 @@ public static ClientProfile makeProfile(ClientProfile.Version version, String ti Set optionals = new HashSet<>(); jvmArgs.add("-XX:+DisableAttachMechanism"); // Official Mojang launcher java arguments - if (version.compareTo(ClientProfile.Version.MC112) <= 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_12_2) <= 0) { jvmArgs.add("-XX:+UseConcMarkSweepGC"); jvmArgs.add("-XX:+CMSIncrementalMode"); - } else if (version.compareTo(ClientProfile.Version.MC118) <= 0) { // 1.13 - 1.16.5 + } else if (version.compareTo(ClientProfileVersions.MINECRAFT_1_18) <= 0) { // 1.13 - 1.16.5 jvmArgs.add("-XX:+UseG1GC"); jvmArgs.add("-XX:+UnlockExperimentalVMOptions"); } else { // 1.18+ - jvmArgs.add("-XX:+UseShenandoahGC"); - jvmArgs.add("-XX:+UnlockExperimentalVMOptions"); + //jvmArgs.add("-XX:+UseShenandoahGC"); + //jvmArgs.add("-XX:+UnlockExperimentalVMOptions"); } // ----------- Optional forge = findOption(options, MakeProfileOptionForge.class); Optional fabric = findOption(options, MakeProfileOptionFabric.class); - if (version.compareTo(ClientProfile.Version.MC1122) > 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_12_2) > 0) { jvmArgs.add("-Djava.library.path=natives"); OptionalFile optionalMacOs = new OptionalFile(); optionalMacOs.name = "MacOSArgs"; @@ -112,16 +113,16 @@ public static ClientProfile makeProfile(ClientProfile.Version version, String ti if (log4jOption.logFile != null) { jvmArgs.add("-Dlog4j.configurationFile=".concat(logFile.get().logFile)); } else if (log4jOption.affected) { - if (version.compareTo(ClientProfile.Version.MC117) >= 0 && version.compareTo(ClientProfile.Version.MC118) < 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_17) >= 0 && version.compareTo(ClientProfileVersions.MINECRAFT_1_18) < 0) { jvmArgs.add("-Dlog4j2.formatMsgNoLookups=true"); } } } - if (version.compareTo(ClientProfile.Version.MC117) >= 0 && version.compareTo(ClientProfile.Version.MC118) < 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_17) >= 0 && version.compareTo(ClientProfileVersions.MINECRAFT_1_18) < 0) { builder.setMinJavaVersion(16); builder.setRecommendJavaVersion(16); } - if (version.compareTo(ClientProfile.Version.MC118) >= 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_18) >= 0) { builder.setMinJavaVersion(17); builder.setRecommendJavaVersion(17); } @@ -137,22 +138,22 @@ public static ClientProfile makeProfile(ClientProfile.Version version, String ti } if (forge.isPresent()) { clientArgs.add("--tweakClass"); - if (version.compareTo(ClientProfile.Version.MC1710) > 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_7_10) > 0) { clientArgs.add("net.minecraftforge.fml.common.launcher.FMLTweaker"); } else { clientArgs.add("cpw.mods.fml.common.launcher.FMLTweaker"); } - if (version.compareTo(ClientProfile.Version.MC1122) <= 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_12_2) <= 0) { builder.setMinJavaVersion(8); builder.setRecommendJavaVersion(8); builder.setMaxJavaVersion(8); } } - } else if (version.compareTo(ClientProfile.Version.MC1122) > 0) { + } else if (version.compareTo(ClientProfileVersions.MINECRAFT_1_12_2) > 0) { if (forge.isPresent()) { clientArgs.addAll(forge.get().makeClientArgs()); builder.setClassLoaderConfig(ClientProfile.ClassLoaderConfig.AGENT); - if (version.compareTo(ClientProfile.Version.MC1165) <= 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_16_5) <= 0) { builder.setMaxJavaVersion(15); } } @@ -171,7 +172,7 @@ public static String getMainClassByVersion(ClientProfile.Version version, MakePr if (findOption(options, MakeProfileOptionLaunchWrapper.class).isPresent()) { return "net.minecraft.launchwrapper.Launch"; } - if (findOption(options, MakeProfileOptionForge.class).isPresent() && version.compareTo(ClientProfile.Version.MC1122) > 0) { + if (findOption(options, MakeProfileOptionForge.class).isPresent() && version.compareTo(ClientProfileVersions.MINECRAFT_1_12_2) > 0) { return "cpw.mods.modlauncher.Launcher"; } if (findOption(options, MakeProfileOptionFabric.class).isPresent()) { @@ -206,7 +207,7 @@ public static MakeProfileOption[] getMakeProfileOptionsFromDir(Path dir, ClientP if (Files.exists(dir.resolve("forge.jar"))) { options.add(new MakeProfileOptionForge()); } else if (Files.exists(dir.resolve("libraries/net/minecraftforge/forge"))) { - if (version.compareTo(ClientProfile.Version.MC1122) > 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_12_2) > 0) { options.add(new MakeProfileOptionForge(dir)); } else { options.add(new MakeProfileOptionForge()); diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/LaunchServerGsonManager.java b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/LaunchServerGsonManager.java index 430f2819..106abb2d 100644 --- a/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/LaunchServerGsonManager.java +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/manangers/LaunchServerGsonManager.java @@ -5,6 +5,7 @@ import pro.gravit.launcher.events.request.GetAvailabilityAuthRequestEvent; import pro.gravit.launcher.managers.GsonManager; import pro.gravit.launcher.modules.events.PreGsonPhase; +import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launcher.profiles.optional.actions.OptionalAction; import pro.gravit.launcher.profiles.optional.triggers.OptionalTrigger; import pro.gravit.launcher.request.JsonResultSerializeAdapter; @@ -35,6 +36,7 @@ public void registerAdapters(GsonBuilder builder) { builder.registerTypeAdapterFactory(RecordTypeAdapterFactory.builder() .allowMissingComponentValues() .create()); + builder.registerTypeAdapter(ClientProfile.Version.class, new ClientProfile.Version.GsonSerializer()); builder.registerTypeAdapter(TextureProvider.class, new UniversalJsonAdapter<>(TextureProvider.providers)); builder.registerTypeAdapter(AuthCoreProvider.class, new UniversalJsonAdapter<>(AuthCoreProvider.providers)); builder.registerTypeAdapter(PasswordVerifier.class, new UniversalJsonAdapter<>(PasswordVerifier.providers)); diff --git a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherEntryPoint.java b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherEntryPoint.java index 0817567f..285e94a2 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherEntryPoint.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherEntryPoint.java @@ -16,6 +16,7 @@ import pro.gravit.launcher.modules.events.OfflineModeEvent; import pro.gravit.launcher.modules.events.PreConfigPhase; import pro.gravit.launcher.profiles.ClientProfile; +import pro.gravit.launcher.profiles.ClientProfileVersions; import pro.gravit.launcher.profiles.optional.actions.OptionalAction; import pro.gravit.launcher.profiles.optional.actions.OptionalActionClassPath; import pro.gravit.launcher.profiles.optional.actions.OptionalActionClientArgs; @@ -290,7 +291,7 @@ public static Stream resolveClassPath(Path clientDir, Set private static void launch(ClientProfile profile, ClientLauncherProcess.ClientParams params) throws Throwable { // Add client args Collection args = new LinkedList<>(); - if (profile.getVersion().compareTo(ClientProfile.Version.MC164) >= 0) + if (profile.getVersion().compareTo(ClientProfileVersions.MINECRAFT_1_6_4) >= 0) params.addClientArgs(args); else { params.addClientLegacyArgs(args); diff --git a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherProcess.java b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherProcess.java index 4136aeb8..c064c471 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherProcess.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/ClientLauncherProcess.java @@ -10,6 +10,7 @@ import pro.gravit.launcher.events.request.AuthRequestEvent; import pro.gravit.launcher.hasher.HashedDir; import pro.gravit.launcher.profiles.ClientProfile; +import pro.gravit.launcher.profiles.ClientProfileVersions; import pro.gravit.launcher.profiles.PlayerProfile; import pro.gravit.launcher.profiles.optional.OptionalView; import pro.gravit.launcher.profiles.optional.actions.OptionalAction; @@ -289,7 +290,7 @@ public static class ClientParams { public transient HashedDir javaHDir; public void addClientArgs(Collection args) { - if (profile.getVersion().compareTo(ClientProfile.Version.MC164) >= 0) + if (profile.getVersion().compareTo(ClientProfileVersions.MINECRAFT_1_6_4) >= 0) addModernClientArgs(args); else addClientLegacyArgs(args); @@ -300,7 +301,7 @@ public void addClientLegacyArgs(Collection args) { args.add(accessToken); // Add args for tweaker - Collections.addAll(args, "--version", profile.getVersion().name); + Collections.addAll(args, "--version", profile.getVersion().toString()); Collections.addAll(args, "--gameDir", clientDir); Collections.addAll(args, "--assetsDir", assetDir); } @@ -310,12 +311,12 @@ private void addModernClientArgs(Collection args) { // Add version-dependent args ClientProfile.Version version = profile.getVersion(); Collections.addAll(args, "--username", playerProfile.username); - if (version.compareTo(ClientProfile.Version.MC172) >= 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_7_2) >= 0) { Collections.addAll(args, "--uuid", Launcher.toHash(playerProfile.uuid)); Collections.addAll(args, "--accessToken", accessToken); // Add 1.7.10+ args (user properties, asset index) - if (version.compareTo(ClientProfile.Version.MC1710) >= 0) { + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_7_10) >= 0) { // Add user properties Collections.addAll(args, "--userType", "mojang"); Collections.addAll(args, "--userProperties", "{}"); @@ -327,11 +328,11 @@ private void addModernClientArgs(Collection args) { Collections.addAll(args, "--session", accessToken); // Add version and dirs args - Collections.addAll(args, "--version", profile.getVersion().name); + Collections.addAll(args, "--version", profile.getVersion().toString()); Collections.addAll(args, "--gameDir", clientDir); Collections.addAll(args, "--assetsDir", assetDir); Collections.addAll(args, "--resourcePackDir", resourcePackDir); - if (version.compareTo(ClientProfile.Version.MC194) >= 0) + if (version.compareTo(ClientProfileVersions.MINECRAFT_1_9_4) >= 0) Collections.addAll(args, "--versionType", "Launcher v" + Version.getVersion().getVersionString()); // Add server args diff --git a/Launcher/src/main/java/pro/gravit/launcher/client/ServerPinger.java b/Launcher/src/main/java/pro/gravit/launcher/client/ServerPinger.java index 57a86dbe..7de97b99 100644 --- a/Launcher/src/main/java/pro/gravit/launcher/client/ServerPinger.java +++ b/Launcher/src/main/java/pro/gravit/launcher/client/ServerPinger.java @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import pro.gravit.launcher.profiles.ClientProfile; +import pro.gravit.launcher.profiles.ClientProfileVersions; import pro.gravit.launcher.serialize.HInput; import pro.gravit.launcher.serialize.HOutput; import pro.gravit.utils.helper.IOHelper; @@ -64,7 +65,7 @@ private Result doPing() throws IOException { socket.connect(IOHelper.resolve(address), IOHelper.SOCKET_TIMEOUT); try (HInput input = new HInput(socket.getInputStream()); HOutput output = new HOutput(socket.getOutputStream())) { - return version.compareTo(ClientProfile.Version.MC172) >= 0 ? modernPing(input, output) : legacyPing(input, output, version.compareTo(ClientProfile.Version.MC164) >= 0); + return version.compareTo(ClientProfileVersions.MINECRAFT_1_7_2) >= 0 ? modernPing(input, output) : legacyPing(input, output, version.compareTo(ClientProfileVersions.MINECRAFT_1_6_4) >= 0); } } } @@ -80,7 +81,7 @@ private Result legacyPing(HInput input, HOutput output, boolean mc16) throws IOE byte[] customPayloadPacket; try (ByteArrayOutputStream packetArray = IOHelper.newByteArrayOutput()) { try (HOutput packetOutput = new HOutput(packetArray)) { - packetOutput.writeUnsignedByte(version.protocol); // Protocol version + packetOutput.writeUnsignedByte(0x4a); // Protocol version writeUTF16String(packetOutput, address.getHostString()); // Server address packetOutput.writeInt(address.getPort()); // Server port } @@ -110,11 +111,7 @@ private Result legacyPing(HInput input, HOutput output, boolean mc16) throws IOE if (!magic.equals(LEGACY_PING_HOST_MAGIC)) throw new IOException("Magic file mismatch: " + magic); int protocol = Integer.parseInt(splitted[1]); - if (protocol != version.protocol) - throw new IOException("Protocol mismatch: " + protocol); String clientVersion = splitted[2]; - if (!clientVersion.equals(version.name)) - throw new IOException(String.format("Version mismatch: '%s'", clientVersion)); int onlinePlayers = VerifyHelper.verifyInt(Integer.parseInt(splitted[4]), VerifyHelper.NOT_NEGATIVE, "onlinePlayers can't be < 0"); int maxPlayers = VerifyHelper.verifyInt(Integer.parseInt(splitted[5]), @@ -130,7 +127,7 @@ private Result modernPing(HInput input, HOutput output) throws IOException { try (ByteArrayOutputStream packetArray = IOHelper.newByteArrayOutput()) { try (HOutput packetOutput = new HOutput(packetArray)) { packetOutput.writeVarInt(0x0); // Handshake packet ID - packetOutput.writeVarInt(version.protocol); // Protocol version + packetOutput.writeVarInt(0x4); // Protocol version packetOutput.writeString(address.getHostString(), 0); // Server address packetOutput.writeShort((short) address.getPort()); // Server port packetOutput.writeVarInt(0x1); // Next state - status diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfile.java b/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfile.java index 3773e1c2..69f2037b 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfile.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfile.java @@ -1,5 +1,6 @@ package pro.gravit.launcher.profiles; +import com.google.gson.*; import pro.gravit.launcher.LauncherNetworkAPI; import pro.gravit.launcher.hasher.FileNameMatcher; import pro.gravit.launcher.profiles.optional.OptionalDepend; @@ -8,6 +9,7 @@ import pro.gravit.utils.helper.IOHelper; import pro.gravit.utils.helper.VerifyHelper; +import java.lang.reflect.Type; import java.net.InetSocketAddress; import java.util.*; @@ -20,7 +22,7 @@ public final class ClientProfile implements Comparable { @LauncherNetworkAPI private UUID uuid; @LauncherNetworkAPI - private String version; + private Version version; @LauncherNetworkAPI private String info; @LauncherNetworkAPI @@ -97,7 +99,7 @@ public ClientProfile() { flags = new ArrayList<>(); } - public ClientProfile(List update, List updateExclusions, List updateShared, List updateVerify, Set updateOptional, List jvmArgs, List classPath, List modulePath, List modules, List altClassPath, List clientArgs, List compatClasses, Map properties, List servers, ClassLoaderConfig classLoaderConfig, List flags, String version, String assetIndex, String dir, String assetDir, int recommendJavaVersion, int minJavaVersion, int maxJavaVersion, ProfileDefaultSettings settings, int sortIndex, UUID uuid, String title, String info, String mainClass) { + public ClientProfile(List update, List updateExclusions, List updateShared, List updateVerify, Set updateOptional, List jvmArgs, List classPath, List modulePath, List modules, List altClassPath, List clientArgs, List compatClasses, Map properties, List servers, ClassLoaderConfig classLoaderConfig, List flags, Version version, String assetIndex, String dir, String assetDir, int recommendJavaVersion, int minJavaVersion, int maxJavaVersion, ProfileDefaultSettings settings, int sortIndex, UUID uuid, String title, String info, String mainClass) { this.update = update; this.updateExclusions = updateExclusions; this.updateShared = updateShared; @@ -146,7 +148,7 @@ public String getAssetIndex() { } public FileNameMatcher getAssetUpdateMatcher() { - return getVersion().compareTo(Version.MC1710) >= 0 ? ASSET_MATCHER : null; + return getVersion().compareTo(ClientProfileVersions.MINECRAFT_1_7_10) >= 0 ? ASSET_MATCHER : null; } public String[] getClassPath() { @@ -291,11 +293,11 @@ public void setInfo(String info) { } public Version getVersion() { - return Version.byName(version); + return version; } public void setVersion(Version version) { - this.version = version.name; + this.version = version; } @Deprecated @@ -429,76 +431,6 @@ public List getFlags() { return flags; } - public enum Version { - MC125("1.2.5", 29), - MC147("1.4.7", 51), - MC152("1.5.2", 61), - MC164("1.6.4", 78), - MC172("1.7.2", 4), - MC1710("1.7.10", 5), - MC189("1.8.9", 47), - MC19("1.9", 107), - MC192("1.9.2", 109), - MC194("1.9.4", 110), - MC1102("1.10.2", 210), - MC111("1.11", 315), - MC1112("1.11.2", 316), - MC112("1.12", 335), - MC1121("1.12.1", 338), - MC1122("1.12.2", 340), - MC113("1.13", 393), - MC1131("1.13.1", 401), - MC1132("1.13.2", 402), - MC114("1.14", 477), - MC1141("1.14.1", 480), - MC1142("1.14.2", 485), - MC1143("1.14.3", 490), - MC1144("1.14.4", 498), - MC115("1.15", 573), - MC1151("1.15.1", 575), - MC1152("1.15.2", 578), - MC1161("1.16.1", 736), - MC1162("1.16.2", 751), - MC1163("1.16.3", 753), - MC1164("1.16.4", 754), - MC1165("1.16.5", 754), - MC117("1.17", 755), - MC1171("1.17.1", 756), - MC118("1.18", 757), - MC1181("1.18.1", 757), - MC1182("1.18.2", 758), - MC119("1.19", 759), - MC1191("1.19.1", 760), - MC1192("1.19.2", 760), - MC1193("1.19.3", 761), - MC1194("1.19.4", 762); - private static final Map VERSIONS; - - static { - Version[] versionsValues = values(); - VERSIONS = new HashMap<>(versionsValues.length); - for (Version version : versionsValues) - VERSIONS.put(version.name, version); - } - - public final String name; - public final int protocol; - - Version(String name, int protocol) { - this.name = name; - this.protocol = protocol; - } - - public static Version byName(String name) { - return VerifyHelper.getMapValue(VERSIONS, name, String.format("Unknown client version: '%s'", name)); - } - - @Override - public String toString() { - return "Minecraft " + name; - } - } - public enum ClassLoaderConfig { AGENT, LAUNCHER, MODULE, SYSTEM_ARGS } @@ -507,9 +439,87 @@ public enum CompatibilityFlags { LEGACY_NATIVES_DIR } - @FunctionalInterface - public interface pushOptionalClassPathCallback { - void run(String[] opt); + public static class Version implements Comparable { + private final long[] data; + private final String original; + private final boolean isObjectSerialized; + + public static Version of(String string) { + String tmp = string.replaceAll("[^.0-9]", "."); // Replace any non-digit character to . + String[] list = tmp.split("\\."); + return new Version(Arrays.stream(list) + .filter(e -> !e.isEmpty()) // Filter ".." + .mapToLong(Long::parseLong).toArray(), string); + } + + private Version(long[] data, String str) { + this.data = data; + this.original = str; + this.isObjectSerialized = false; + } + + public Version(long[] data, String original, boolean isObjectSerialized) { + this.data = data; + this.original = original; + this.isObjectSerialized = isObjectSerialized; + } + + @Override + public int compareTo(Version some) { + int result = 0; + for (int i = 0; i < data.length; ++i) { + if (i > some.data.length) break; + result = Long.compare(data[i], some.data[i]); + if (result != 0) return result; + } + return result; + } + + public String toCleanString() { + return join(data); + } + + private static String join(long[] data) { + return String.join(".", Arrays.stream(data).mapToObj(String::valueOf).toArray(String[]::new)); + } + + @Override + public String toString() { + return original; + } + + public static class GsonSerializer implements JsonSerializer, JsonDeserializer { + + @Override + public Version deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + if(json.isJsonObject()) { + JsonObject object = json.getAsJsonObject(); + String name = object.get("name").getAsString(); + long[] list = context.deserialize(object.get("data"), long[].class); + return new Version(list, name, true); + } else if(json.isJsonArray()) { + long[] list = context.deserialize(json, long[].class); + return new Version(list, join(list), false); + } else { + return Version.of(json.getAsString()); + } + } + + @Override + public JsonElement serialize(Version src, Type typeOfSrc, JsonSerializationContext context) { + if(src.isObjectSerialized) { + JsonObject object = new JsonObject(); + object.add("name", new JsonPrimitive(src.original)); + JsonArray array = new JsonArray(); + for(long l : src.data) { + array.add(l); + } + object.add("data", array); + return object; + } + return new JsonPrimitive(src.toString()); + } + } } public static class ServerProfile { diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfileBuilder.java b/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfileBuilder.java index 78ebfae7..5e6a09d6 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfileBuilder.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfileBuilder.java @@ -21,7 +21,7 @@ public class ClientProfileBuilder { private List servers = new ArrayList<>(); private ClientProfile.ClassLoaderConfig classLoaderConfig = ClientProfile.ClassLoaderConfig.LAUNCHER; private List flags = new ArrayList<>(); - private String version; + private ClientProfile.Version version; private String assetIndex; private String dir; private String assetDir; @@ -91,7 +91,7 @@ public void setClassLoaderConfig(ClientProfile.ClassLoaderConfig classLoaderConf this.classLoaderConfig = classLoaderConfig; } - public void setVersion(String version) { + public void setVersion(ClientProfile.Version version) { this.version = version; } diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfileVersions.java b/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfileVersions.java new file mode 100644 index 00000000..0af1185c --- /dev/null +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/profiles/ClientProfileVersions.java @@ -0,0 +1,18 @@ +package pro.gravit.launcher.profiles; + +public class ClientProfileVersions { + private ClientProfileVersions() { + throw new UnsupportedOperationException(); + } + public static final ClientProfile.Version MINECRAFT_1_6_4 = ClientProfile.Version.of("1.6.4"); + public static final ClientProfile.Version MINECRAFT_1_7_2 = ClientProfile.Version.of("1.7.2"); + public static final ClientProfile.Version MINECRAFT_1_7_10 = ClientProfile.Version.of("1.7.10"); + public static final ClientProfile.Version MINECRAFT_1_9_4 = ClientProfile.Version.of("1.9.4"); + public static final ClientProfile.Version MINECRAFT_1_12_2 = ClientProfile.Version.of("1.12.2"); + + public static final ClientProfile.Version MINECRAFT_1_13 = ClientProfile.Version.of("1.13"); + public static final ClientProfile.Version MINECRAFT_1_16_5 = ClientProfile.Version.of("1.16.5"); + public static final ClientProfile.Version MINECRAFT_1_17 = ClientProfile.Version.of("1.17"); + public static final ClientProfile.Version MINECRAFT_1_18 = ClientProfile.Version.of("1.18"); + public static final ClientProfile.Version MINECRAFT_1_19 = ClientProfile.Version.of("1.19"); +} diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java index 04062458..4296684b 100644 --- a/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java +++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/websockets/ClientWebSocketService.java @@ -7,6 +7,7 @@ import pro.gravit.launcher.events.request.*; import pro.gravit.launcher.hasher.HashedEntry; import pro.gravit.launcher.hasher.HashedEntryAdapter; +import pro.gravit.launcher.profiles.ClientProfile; import pro.gravit.launcher.profiles.optional.actions.OptionalAction; import pro.gravit.launcher.profiles.optional.triggers.OptionalTrigger; import pro.gravit.launcher.request.WebSocketEvent; @@ -40,6 +41,7 @@ public ClientWebSocketService(String address) throws SSLException { public static void appendTypeAdapters(GsonBuilder builder) { builder.registerTypeAdapter(HashedEntry.class, new HashedEntryAdapter()); + builder.registerTypeAdapter(ClientProfile.Version.class, new ClientProfile.Version.GsonSerializer()); builder.registerTypeAdapter(WebSocketEvent.class, new UniversalJsonAdapter<>(ClientWebSocketService.results)); builder.registerTypeAdapter(WebSocketRequest.class, new UniversalJsonAdapter<>(ClientWebSocketService.requests)); builder.registerTypeAdapter(AuthRequest.AuthPasswordInterface.class, new UniversalJsonAdapter<>(AuthRequest.providers)); diff --git a/LauncherCore/src/main/java/pro/gravit/launcher/hasher/HashedDir.java b/LauncherCore/src/main/java/pro/gravit/launcher/hasher/HashedDir.java index 38128287..71b28e17 100644 --- a/LauncherCore/src/main/java/pro/gravit/launcher/hasher/HashedDir.java +++ b/LauncherCore/src/main/java/pro/gravit/launcher/hasher/HashedDir.java @@ -288,7 +288,7 @@ public enum WalkAction { @FunctionalInterface public interface WalkCallback { - WalkAction walked(String path, String name, HashedEntry entry); + WalkAction walked(String path, String name, HashedEntry entry) throws IOException; } public static class FindRecursiveResult { diff --git a/ServerWrapper/src/main/java/pro/gravit/launcher/server/ServerWrapper.java b/ServerWrapper/src/main/java/pro/gravit/launcher/server/ServerWrapper.java index 0a44b85d..61fa66a9 100644 --- a/ServerWrapper/src/main/java/pro/gravit/launcher/server/ServerWrapper.java +++ b/ServerWrapper/src/main/java/pro/gravit/launcher/server/ServerWrapper.java @@ -157,7 +157,7 @@ public void run(String... args) throws Throwable { ServerAgent.loadLibraries(librariesDir); } LogHelper.info("ServerWrapper: LaunchServer address: %s. Title: %s", config.address, Launcher.profile != null ? Launcher.profile.getTitle() : "unknown"); - LogHelper.info("Minecraft Version (for profile): %s", wrapper.profile == null ? "unknown" : wrapper.profile.getVersion().name); + LogHelper.info("Minecraft Version (for profile): %s", wrapper.profile == null ? "unknown" : wrapper.profile.getVersion().toString()); String[] real_args; if(config.args != null && config.args.size() > 0) { real_args = config.args.toArray(new String[0]); diff --git a/ServerWrapper/src/main/java/pro/gravit/launcher/server/setup/ServerWrapperSetup.java b/ServerWrapper/src/main/java/pro/gravit/launcher/server/setup/ServerWrapperSetup.java index 6aece315..fdd1fa0d 100644 --- a/ServerWrapper/src/main/java/pro/gravit/launcher/server/setup/ServerWrapperSetup.java +++ b/ServerWrapper/src/main/java/pro/gravit/launcher/server/setup/ServerWrapperSetup.java @@ -2,6 +2,7 @@ import pro.gravit.launcher.events.request.GetPublicKeyRequestEvent; import pro.gravit.launcher.profiles.ClientProfile; +import pro.gravit.launcher.profiles.ClientProfileVersions; import pro.gravit.launcher.request.Request; import pro.gravit.launcher.request.auth.GetPublicKeyRequest; import pro.gravit.launcher.request.websockets.StdWebSocketService; @@ -90,7 +91,7 @@ public void run() throws Exception { } } } - if(wrapper.profile != null && wrapper.profile.getVersion().compareTo(ClientProfile.Version.MC118) >= 0) { + if(wrapper.profile != null && wrapper.profile.getVersion().compareTo(ClientProfileVersions.MINECRAFT_1_18) >= 0) { LogHelper.info("Switch to alternative start mode (1.18)"); wrapper.config.classpath.add(jarName); wrapper.config.classLoaderConfig = ClientProfile.ClassLoaderConfig.LAUNCHER; diff --git a/build.gradle b/build.gradle index fe664078..f4e239bc 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ id 'org.openjfx.javafxplugin' version '0.0.10' apply false } group = 'pro.gravit.launcher' -version = '5.3.6' +version = '5.4.0-SNAPSHOT' apply from: 'props.gradle'