diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java index a8f54902790..653d6d272b8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java @@ -67,7 +67,7 @@ public HMCLModpackInstallTask(HMCLGameRepository repository, Path zipFile, Modpa if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(Modpack.class)); - if (!HMCLModpackProvider.INSTANCE.getName().equals(config.getType())) + if (config.getType() != null && !HMCLModpackProvider.INSTANCE.getName().equals(config.getType())) throw new IllegalArgumentException("Instance " + instanceId + " is not a HMCL modpack. Cannot update this instance."); } } catch (JsonParseException | IOException ignore) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java index 03dc54ad1b2..38a45d8e71b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java @@ -236,19 +236,23 @@ else if (modpack.getManifest() instanceof McbbsModpackManifest) } public static Task getUpdateTask(HMCLGameRepository repository, ServerModpackManifest manifest, Charset charset, GameInstanceID instanceId, ModpackConfiguration configuration) throws UnsupportedModpackException { - switch (configuration.getType()) { - case ServerModpackRemoteInstallTask.MODPACK_TYPE: - return new ModpackUpdateTask(repository, instanceId, new ServerModpackRemoteInstallTask(repository.getDependency(), manifest, instanceId)) - .thenComposeAsync(repository.refreshAsync()) - .withStagesHints(new Task.StagesHint("hmcl.modpack"), new Task.StagesHint("hmcl.modpack.download", List.of("hmcl.install.assets", "hmcl.install.libraries"))); - default: - throw new UnsupportedModpackException(); + String type = configuration.getType(); + if (type == null || ServerModpackRemoteInstallTask.MODPACK_TYPE.equals(type)) { + return new ModpackUpdateTask(repository, instanceId, new ServerModpackRemoteInstallTask(repository.getDependency(), manifest, instanceId)) + .thenComposeAsync(repository.refreshAsync()) + .withStagesHints(new Task.StagesHint("hmcl.modpack"), new Task.StagesHint("hmcl.modpack.download", List.of("hmcl.install.assets", "hmcl.install.libraries"))); + } else { + throw new UnsupportedModpackException(); } } public static Task getUpdateTask(HMCLGameRepository repository, Path zipFile, Charset charset, GameInstanceID instanceId, ModpackConfiguration configuration) throws UnsupportedModpackException, ManuallyCreatedModpackException, MismatchedModpackTypeException { Modpack modpack = ModpackHelper.readModpackManifest(zipFile, charset); - ModpackProvider provider = getProviderByType(configuration.getType()); + String type = configuration.getType(); + if (type == null) { + type = modpack.getManifest().getProvider().getName(); + } + ModpackProvider provider = getProviderByType(type); if (provider == null) { throw new UnsupportedModpackException(); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackConfiguration.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackConfiguration.java index 41928323108..6535d08b785 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackConfiguration.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackConfiguration.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; @Immutable public final class ModpackConfiguration implements Validation { @@ -36,7 +37,7 @@ public static TypeToken> typeOf(Class clazz) { } private final T manifest; - private final String type; + private final @Nullable String type; private final String name; private final String version; private final List overrides; @@ -45,7 +46,7 @@ public ModpackConfiguration() { this(null, null, "", null, Collections.emptyList()); } - public ModpackConfiguration(T manifest, String type, String name, String version, List overrides) { + public ModpackConfiguration(T manifest, @Nullable String type, String name, String version, List overrides) { this.manifest = manifest; this.type = type; this.name = name; @@ -57,8 +58,35 @@ public T getManifest() { return manifest; } + @Nullable public String getType() { - return type; + if (type != null) { + return type; + } + if (manifest instanceof ModpackManifest modpackManifest) { + return modpackManifest.getProvider().getName(); + } + if (manifest instanceof Modpack modpack && modpack.getManifest() != null) { + return modpack.getManifest().getProvider().getName(); + } + if (manifest instanceof Map map) { + if (map.containsKey("instanceType") || map.containsKey("components") || map.containsKey("mmcPack")) { + return "MultiMC"; + } + if (map.containsKey("formatVersion") && map.containsKey("game")) { + return "Modrinth"; + } + if (map.containsKey("files") && map.containsKey("minecraft")) { + return "Curse"; + } + if (map.containsKey("fileApi") && !map.containsKey("manifestType")) { + return "Server"; + } + if (map.containsKey("addons") || map.containsKey("manifestType")) { + return "Mcbbs"; + } + } + return null; } public String getName() { @@ -90,8 +118,6 @@ public List getOverrides() { public void validate() throws JsonParseException { if (manifest == null) throw new JsonParseException("MinecraftInstanceConfiguration missing `manifest`"); - if (type == null) - throw new JsonParseException("MinecraftInstanceConfiguration missing `type`"); } @Immutable diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseInstallTask.java index f19dd5ec932..de6bb9a7e4a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseInstallTask.java @@ -109,8 +109,8 @@ public CurseInstallTask(DefaultDependencyManager dependencyManager, Path zipFile if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(CurseManifest.class)); - if (!CurseModpackProvider.INSTANCE.getName().equals(config.getType())) - throw new IllegalArgumentException("Instance " + instanceId + " is not a Curse modpack. Cannot update this instance."); + if (config.getType() != null && !CurseModpackProvider.INSTANCE.getName().equals(config.getType())) + throw new IllegalArgumentException("Instance " + instanceId + " is not a CurseForge modpack. Cannot update this instance."); } } catch (JsonParseException | IOException ignore) { } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackLocalInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackLocalInstallTask.java index 110a1a82d37..b8040ad4dee 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackLocalInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackLocalInstallTask.java @@ -83,8 +83,8 @@ public McbbsModpackLocalInstallTask(DefaultDependencyManager dependencyManager, if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(McbbsModpackManifest.class)); - if (!McbbsModpackProvider.INSTANCE.getName().equals(config.getType())) - throw new IllegalArgumentException("Instance " + instanceId + " is not a Mcbbs modpack. Cannot update this instance."); + if (config.getType() != null && !McbbsModpackProvider.INSTANCE.getName().equals(config.getType())) + throw new IllegalArgumentException("Instance " + instanceId + " is not a MCBBS modpack. Cannot update this instance."); } } catch (JsonParseException | IOException ignore) { } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackRemoteInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackRemoteInstallTask.java index c8e0b80c05f..b0a5fa2ed42 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackRemoteInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackRemoteInstallTask.java @@ -68,8 +68,8 @@ public McbbsModpackRemoteInstallTask(DefaultDependencyManager dependencyManager, if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(McbbsModpackManifest.class)); - if (!MODPACK_TYPE.equals(config.getType())) - throw new IllegalArgumentException("Instance " + instanceId + " is not a Mcbbs modpack. Cannot update this instance."); + if (config.getType() != null && !McbbsModpackProvider.INSTANCE.getName().equals(config.getType())) + throw new IllegalArgumentException("Instance " + instanceId + " is not a MCBBS modpack. Cannot update this instance."); } } catch (JsonParseException | IOException ignore) { } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthInstallTask.java index e378fa4811c..4d035fa4223 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthInstallTask.java @@ -107,7 +107,7 @@ public ModrinthInstallTask(DefaultDependencyManager dependencyManager, Path zipF if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(ModrinthManifest.class)); - if (!ModrinthModpackProvider.INSTANCE.getName().equals(config.getType())) + if (config.getType() != null && !ModrinthModpackProvider.INSTANCE.getName().equals(config.getType())) throw new IllegalArgumentException("Instance " + instanceId + " is not a Modrinth modpack. Cannot update this instance."); } } catch (JsonParseException | IOException ignore) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java index da24c80ecc6..7d5c511e488 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java @@ -117,7 +117,7 @@ public void preExecute() throws Exception { if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(MultiMCInstanceConfiguration.class)); - if (!MultiMCModpackProvider.INSTANCE.getName().equals(config.getType())) + if (config.getType() != null && !MultiMCModpackProvider.INSTANCE.getName().equals(config.getType())) throw new IllegalArgumentException("Instance " + instanceId + " is not a MultiMC modpack. Cannot update this instance."); } } catch (JsonParseException | IOException ignore) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackLocalInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackLocalInstallTask.java index f038c3064c2..f3d34d34915 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackLocalInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackLocalInstallTask.java @@ -74,7 +74,7 @@ public ServerModpackLocalInstallTask(DefaultDependencyManager dependencyManager, if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(ServerModpackManifest.class)); - if (!ServerModpackProvider.INSTANCE.getName().equals(config.getType())) + if (config.getType() != null && !ServerModpackProvider.INSTANCE.getName().equals(config.getType())) throw new IllegalArgumentException("Instance " + instanceId + " is not a Server modpack. Cannot update this instance."); } } catch (JsonParseException | IOException ignore) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackRemoteInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackRemoteInstallTask.java index e29f8438691..613287b3fc5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackRemoteInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackRemoteInstallTask.java @@ -68,7 +68,7 @@ public ServerModpackRemoteInstallTask(DefaultDependencyManager dependencyManager if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(ServerModpackManifest.class)); - if (!MODPACK_TYPE.equals(config.getType())) + if (config.getType() != null && !MODPACK_TYPE.equals(config.getType())) throw new IllegalArgumentException("Instance " + instanceId + " is not a Server modpack. Cannot update this instance."); } } catch (JsonParseException | IOException ignore) {