From 86bace4d1359c668ce7601b1ef413a99983e229c Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Wed, 31 Jul 2024 08:57:26 +0800 Subject: [PATCH] =?UTF-8?q?:ok=5Fhand:=20=E4=BF=AE=E6=94=B9=20LTCatt=20?= =?UTF-8?q?=E7=9A=84=E5=AE=A1=E6=A0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 56 ++++++++++++++++--- .../PageVersion/PageVersionExport.xaml.vb | 2 +- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 4ab498d..dd43998 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -955,10 +955,12 @@ Retry: "hmclversion\.cfg", "log4j2\.xml" 'HMCL 配置 } Public Function IsVerRedundant(FilePath As String) As Boolean + FilePath = FilePath.Replace("/", "\") For Each regex In VersionRedundant If RegexCheck(GetFileNameFromPath(FilePath), regex, RegularExpressions.RegexOptions.IgnoreCase) Then Return True - If FilePath.Replace("/", "\").EndsWithF("\journeymap\data\") OrElse - FilePath.Replace("/", "\").EndsWithF("\journeymap\data") Then + If FilePath.EndsWithF("\journeymap\data\") OrElse + FilePath.EndsWithF("\journeymap\data") OrElse + FilePath.EndsWithF("\mods\.connector") Then Return True End If Next @@ -996,17 +998,45 @@ Retry: Log($"[Export] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息") Dim ModrinthMapping As New Dictionary(Of String, JObject) 'Modrinth 获取到的 Mod - Dim LocalMods As New List(Of String) 'Modrinth 获取失败的 Mod + Dim ModrinthFailed As New List(Of McMod) 'Modrinth 获取失败的 Mod For Each Entry In Mods If (Not ModrinthVersion.ContainsKey(Entry.ModrinthHash)) OrElse (ModrinthVersion(Entry.ModrinthHash)("files")(0)("hashes")("sha1") <> Entry.ModrinthHash) Then - LocalMods.Add(Entry.Path) + ModrinthFailed.Add(Entry) Continue For End If ModrinthMapping.Add(Entry.FileName, ModrinthVersion(Entry.ModrinthHash)("files")(0)) Next - '步骤 2:写入 Json 文件 + '步骤 2:把获取失败的 Mod 从 CurseForge 继续获取 + Dim CurseForgeHashes = ModrinthFailed.Select(Function(m) m.CurseForgeHash).ToList() + Dim CurseForgeRaw = CType(CType(GetJson(NetRequestRetry("https://api.curseforge.com/v1/fingerprints/432/", "POST", + $"{{""fingerprints"": [{CurseForgeHashes.Join(",")}]}}", "application/json")), JObject)("data")("exactMatches"), JContainer) + Log($"[Export] 从 CurseForge 获取到 {CurseForgeRaw.Count} 个本地 Mod 的对应信息") + + + Dim CurseForgeMapping As New Dictionary(Of String, JObject) 'CurseForge 获取到的 Mod + For Each m In CurseForgeRaw + Dim hash As String = "" + For Each h In m("file")("hashes") '获取 Modrinth Hash + If h("algo").ToString = 1 Then + hash = h("value") + Exit For + End If + Next + If String.IsNullOrEmpty(hash) OrElse String.IsNullOrEmpty(m("file")("downloadUrl")) Then Continue For + + m("file")("ModrinthHash") = hash + CurseForgeMapping.Add(m("file")("fileName"), m("file")) + For Each file In ModrinthFailed + If file.ModrinthHash = hash Then + ModrinthFailed.Remove(file) + Exit For + End If + Next + Next + + '步骤 3:写入 Json 文件 '获取作为检查目标的加载器和版本 Dim ModLoaders = GetTargetModLoaders() Dim McVersion = Version.Version.McName @@ -1022,6 +1052,16 @@ Retry: {"fileSize", m.Value("size")} }) Next + For Each m In CurseForgeMapping + files.Add(New JObject From { + {"path", $"mods/{m.Key}"}, + {"hashes", New JObject From {{"sha1", m.Value("ModrinthHash").ToString}}}, + {"env", New JObject From {{"client", "required"}, {"server", "required"}}}, + {"downloads", New JArray From {m.Value("downloadUrl")}}, + {"fileSize", m.Value("fileLength")} + }) + Next + Dim depend As New JObject From {{"minecraft", McVersion}} If Version.Version.HasForge Then depend.Add("forge", Version.Version.ForgeVersion) If Version.Version.HasFabric Then depend.Add("fabric-loader", Version.Version.FabricVersion) @@ -1039,9 +1079,9 @@ Retry: File.WriteAllText(tempDir & "modrinth.index.json", json.ToString) - '步骤 3:将获取不到的保存到 overrides 目录 - For Each m In LocalMods - CopyFile(m, tempDir & "overrides\" & GetFileNameFromPath(m)) + '步骤 4:将获取不到的保存到 overrides 目录 + For Each m In ModrinthFailed + CopyFile(m.Path, tempDir & "overrides\mods\" & m.FileName) Next '额外文件 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 7a86a97..3f27dbd 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -298,7 +298,7 @@ For Each c In PanCommonFiles.Children If TypeOf c IsNot MyCheckBox Then Continue For If String.IsNullOrEmpty(c.Tag) Then Continue For - contains.Add(PageVersionLeft.Version.Path & c.Tag) + If c.Checked Then contains.Add(PageVersionLeft.Version.Path & c.Tag) Next ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, contains.Distinct.ToArray, PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text))