From 2c428faa9540e8666ce3cec07ff284cb53eab34a Mon Sep 17 00:00:00 2001 From: Glavo Date: Sun, 12 Oct 2025 20:42:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E9=83=A8=E5=88=86=E6=97=A7=E7=89=88=E6=9C=AC=20Forge?= =?UTF-8?q?=20=E6=A8=A1=E7=BB=84=E7=9A=84=E9=97=AE=E9=A2=98=20(#4658)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/mod/modinfo/ForgeOldModMetadata.java | 24 +++++++++++++-- .../mod/modinfo/ForgeOldModMetadataLst.java | 29 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeOldModMetadataLst.java diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeOldModMetadata.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeOldModMetadata.java index bcce56fd7..5deee4f9e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeOldModMetadata.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeOldModMetadata.java @@ -19,6 +19,8 @@ package org.jackhuang.hmcl.mod.modinfo; import com.google.gson.JsonParseException; import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; import org.jackhuang.hmcl.mod.LocalModFile; import org.jackhuang.hmcl.mod.ModLoaderType; import org.jackhuang.hmcl.mod.ModManager; @@ -125,9 +127,27 @@ public final class ForgeOldModMetadata { Path mcmod = fs.getPath("mcmod.info"); if (Files.notExists(mcmod)) throw new IOException("File " + modFile + " is not a Forge mod."); - List modList = JsonUtils.fromJsonFile(mcmod, listTypeOf(ForgeOldModMetadata.class)); + + List modList; + + try (var reader = Files.newBufferedReader(mcmod); + var jsonReader = new JsonReader(reader)) { + JsonToken firstToken = jsonReader.peek(); + + if (firstToken == JsonToken.BEGIN_ARRAY) + modList = JsonUtils.GSON.fromJson(jsonReader, listTypeOf(ForgeOldModMetadata.class)); + else if (firstToken == JsonToken.BEGIN_OBJECT) { + ForgeOldModMetadataLst list = JsonUtils.GSON.fromJson(jsonReader, ForgeOldModMetadataLst.class); + if (list == null) + throw new IOException("Mod " + modFile + " `mcmod.info` is malformed"); + modList = list.modList(); + } else { + throw new JsonParseException("Unexpected first token: " + firstToken); + } + } + if (modList == null || modList.isEmpty()) - throw new IOException("Mod " + modFile + " `mcmod.info` is malformed.."); + throw new IOException("Mod " + modFile + " `mcmod.info` is malformed"); ForgeOldModMetadata metadata = modList.get(0); String authors = metadata.getAuthor(); if (StringUtils.isBlank(authors) && metadata.getAuthors().length > 0) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeOldModMetadataLst.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeOldModMetadataLst.java new file mode 100644 index 000000000..b0ac0e8ba --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modinfo/ForgeOldModMetadataLst.java @@ -0,0 +1,29 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2025 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.mod.modinfo; + +import org.jackhuang.hmcl.util.gson.JsonSerializable; + +import java.util.List; + +/// @author Glavo +@JsonSerializable +public record ForgeOldModMetadataLst( + int modListVersion, + List modList) { +}