From 09e896dc26ff2eee443cee62f5b1cd21135a4f18 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 9 Jul 2024 10:50:49 +0800 Subject: [PATCH 01/47] =?UTF-8?q?:construction:=20=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=95=B4=E5=90=88=E5=8C=85=EF=BC=9A=E5=8E=8B=E7=BC=A9=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/FormMain.xaml.vb | 1 + .../Modules/Minecraft/ModModpack.vb | 108 ++++++++++++++++++ Plain Craft Launcher 2/Modules/ModMain.vb | 1 + .../Pages/PageVersion/PageVersionExport.xaml | 33 ++++++ .../PageVersion/PageVersionExport.xaml.vb | 5 + .../Pages/PageVersion/PageVersionLeft.xaml | 3 + .../Pages/PageVersion/PageVersionLeft.xaml.vb | 5 +- 7 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml create mode 100644 Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 71b426d..4d9c04b 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -1053,6 +1053,7 @@ Install: VersionSetup = 1 VersionMod = 2 VersionModDisabled = 3 + VersionExport = 4 End Enum ''' ''' 获取次级页面的名称。若并非次级页面则返回空字符串,故可以以此判断是否为次级页面。 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 293af35..3dd9730 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -2,6 +2,7 @@ Public Module ModModpack +#Region "安装" '触发整合包安装的外部接口 ''' ''' 弹窗要求选择一个整合包文件并进行安装。 @@ -849,6 +850,113 @@ Retry: Hint("已加入游戏文件夹列表:" & NewName, HintType.Finish) End Sub +#End Region +#End Region + +#Region "导出" + Private ExpTempDir As String = PathTemp & "PackExport\" + ''' + ''' 整合包类型。 + ''' + Public Enum ModpackType + CurseForge = 0 + HMCL = 1 + MMC = 2 + MCBBS = 3 + Modrinth = 4 + Compressed = 9 + End Enum + ''' + ''' 导出整合包的选项。 + ''' + Public Class ExportOptions + ''' + ''' 要导出的版本。 + ''' + Public Version As McVersion + ''' + ''' 要保存整合包的位置。 + ''' + Public Dest As String + ''' + ''' 整合包类型。 + ''' + Public Type As ModpackType + ''' + ''' 要保留到整合包的存档。 + ''' + Public Saves As String() + End Class + ''' + ''' 导出整合包。 + ''' + ''' 是否成功。 + Public Function ModpackExport(Options As ExportOptions) + Select Case Options.Type + Case ModpackType.Compressed + ExportCompressed(Options.Version, Options.Dest) + End Select + End Function + +#Region "冗余" + Private VersionRedundant As String() = {"saves", "screenshots", "backups", "command_history\.txt", '个人文件 + ".*-natives", "server-resource-packs", "user.*cache\.json", "\.optifine", "\.fabric", '缓存 + ".*\.jar", "downloads", "realms_persistence.json", "\$\{natives_directory\}", '可联网更新 + "logs", "crash-reports", ".*\.log", '日志 + ".*\.dat_old", ".*\.old", '备份 + "\$\{quickPlayPath\}", '服务器 + "\.replay_cache", "replay_recordings", "replay_videos", 'ReplayMod + "irisUpdateInfo\.json", 'Iris + ".*\.BakaCoreInfo" 'BakaXL + } + Private Function IsVerRedundant(FileName As String) As Boolean + For Each regex In VersionRedundant + If RegexCheck(FileName, regex) Then Return True + Next + Return False + End Function +#End Region + +#Region "不同类型整合包的导出方法" + Private Sub ExportCompressed(Version As McVersion, DestPath As String, Optional Saves As String() = Nothing, Optional PCLSetup As Boolean = True) + Try + Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" + Directory.CreateDirectory(tempDir) + Dim tempVerPath As String = $"{tempDir}{Version.Path.Replace(GetPathFromFullPath(Version.PathIndie), "")}" + + For Each f In Directory.EnumerateFiles(Version.Path) + If Not IsVerRedundant(GetFileNameFromPath(f)) Then CopyFile(f, tempVerPath & GetFileNameFromPath(f)) + Next + For Each d In Directory.EnumerateDirectories(Version.Path) + If Not IsVerRedundant(GetFolderNameFromPath(d)) Then CopyDirectory(d, tempVerPath & GetFileNameFromPath(d)) + Next + + If Saves IsNot Nothing Then + For Each s In Saves + Dim saveFullPath As String = Version.Path & "saves" & s + If Not Directory.Exists(saveFullPath) Then Continue For + CopyDirectory(saveFullPath, $"{tempVerPath}saves\{s}") + Next + End If + + If PCLSetup Then + If File.Exists(Path & "PCL\Setup.ini") Then CopyFile("PCL\Setup.ini", tempDir & "PCL\Setup.ini") + If File.Exists(Path & "PCL\Custom.xaml") Then CopyFile("PCL\Custom.xaml", tempDir & "PCL\Custom.xaml") + If Directory.Exists(Path & "PCL\Pictures") Then CopyDirectory(Path & "PCL\Pictures", tempDir & "PCL\Pictures") + If Directory.Exists(Path & "PCL\Musics") Then CopyDirectory(Path & "PCL\Musics", tempDir & "PCL\Musics") + End If + + CopyFile(PathWithName, tempDir & GetFileNameFromPath(PathWithName)) + + If File.Exists(DestPath) Then File.Delete(DestPath) '选择文件的时候已经确认了要替换 + ZipFile.CreateFromDirectory(tempDir, DestPath) + DeleteDirectory(tempDir) + Catch ex As Exception + Log(ex, "导出整合包失败", LogLevel.Msgbox) + End Try + End Sub +#End Region + #End Region End Module diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index a971886..319a431 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -427,6 +427,7 @@ EndHint: Public FrmVersionMod As PageVersionMod Public FrmVersionModDisabled As PageVersionModDisabled Public FrmVersionSetup As PageVersionSetup + Public FrmVersionExport As PageVersionExport '资源信息分页声明 Public FrmDownloadCompDetail As PageDownloadCompDetail diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml new file mode 100644 index 0000000..01aa968 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb new file mode 100644 index 0000000..03316cb --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -0,0 +1,5 @@ +Public Class PageVersionExport + Public Sub BtnExportExport_Click() Handles BtnExportExport.Click + ModpackExport(New ExportOptions With {.Version = McVersionCurrent, .Type = ModpackType.Compressed, .Dest = Path & "export.zip"}) + End Sub +End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index 32d8fde..80be838 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -23,5 +23,8 @@ + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index 9f33fed..5a521b3 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -25,7 +25,7 @@ ''' ''' 勾选事件改变页面。 ''' - Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check + Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemExport.Check '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0 '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag)) @@ -46,6 +46,9 @@ Case FormMain.PageSubType.VersionSetup If IsNothing(FrmVersionSetup) Then FrmVersionSetup = New PageVersionSetup Return FrmVersionSetup + Case FormMain.PageSubType.VersionExport + If FrmVersionExport Is Nothing Then FrmVersionExport = New PageVersionExport + Return FrmVersionExport Case Else Throw New Exception("未知的版本设置子页面种类:" & ID) End Select From ad41b4e377382b02b52f5b82a87d4a4362932f74 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 9 Jul 2024 11:49:49 +0800 Subject: [PATCH 02/47] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E5=B7=A5?= =?UTF-8?q?=E7=A8=8B=E8=AE=BE=E7=BD=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Plain Craft Launcher 2.vbproj | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 58259ad..ab8011b 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -185,9 +185,6 @@ MyIconTextButton.xaml - - - @@ -283,6 +280,9 @@ PageLinkLeft.xaml + + PageVersionExport.xaml + PageVersionLeft.xaml @@ -472,7 +472,6 @@ FormMain.xaml Code - MSBuild:Compile Designer @@ -554,6 +553,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + Designer MSBuild:Compile @@ -674,6 +677,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + @@ -928,7 +935,6 @@ - From 87e1fb0b1e229f54eca552b3456ff24ac556116d Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Wed, 10 Jul 2024 22:14:55 +0800 Subject: [PATCH 03/47] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=8E=8B=E7=BC=A9=E5=8C=85=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 59 ++++++++++++++----- .../PageVersion/PageVersionExport.xaml.vb | 7 ++- .../Plain Craft Launcher 2.vbproj | 4 -- 3 files changed, 51 insertions(+), 19 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 3dd9730..02bfe5a 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -859,10 +859,6 @@ Retry: ''' 整合包类型。 ''' Public Enum ModpackType - CurseForge = 0 - HMCL = 1 - MMC = 2 - MCBBS = 3 Modrinth = 4 Compressed = 9 End Enum @@ -886,17 +882,39 @@ Retry: ''' 要保留到整合包的存档。 ''' Public Saves As String() + ''' + ''' 是否需要保留 PCL 全局设置。仅在压缩包中有效。 + ''' + Public PCLSetupGlobal As Boolean = True + ''' + ''' 是否需要保留 PCL 版本设置。仅在压缩包中有效。 + ''' + Public PCLSetupVer As Boolean = True + Public Sub New(Version As McVersion, + Dest As String, + Type As ModpackType, + Saves As String(), + Optional PCLSetupGlobal As Boolean = True, + Optional PCLSetupVer As Boolean = True) + Me.Version = Version + Me.Dest = Dest + Me.Type = Type + Me.Saves = Saves + Me.PCLSetupGlobal = PCLSetupGlobal + Me.PCLSetupVer = PCLSetupVer + End Sub End Class ''' ''' 导出整合包。 ''' - ''' 是否成功。 - Public Function ModpackExport(Options As ExportOptions) + Public Sub ModpackExport(Options As ExportOptions) Select Case Options.Type + Case ModpackType.Modrinth + ExportModrinth(Options.Version, Options.Dest, Options.Saves) Case ModpackType.Compressed - ExportCompressed(Options.Version, Options.Dest) + ExportCompressed(Options.Version, Options.Dest, Options.Saves, Options.PCLSetupGlobal, Options.PCLSetupVer) End Select - End Function + End Sub #Region "冗余" Private VersionRedundant As String() = {"saves", "screenshots", "backups", "command_history\.txt", '个人文件 @@ -907,7 +925,8 @@ Retry: "\$\{quickPlayPath\}", '服务器 "\.replay_cache", "replay_recordings", "replay_videos", 'ReplayMod "irisUpdateInfo\.json", 'Iris - ".*\.BakaCoreInfo" 'BakaXL + ".*\.BakaCoreInfo", 'BakaXL + "PCL" '到时候会拷,别急 } Private Function IsVerRedundant(FileName As String) As Boolean For Each regex In VersionRedundant @@ -918,7 +937,10 @@ Retry: #End Region #Region "不同类型整合包的导出方法" - Private Sub ExportCompressed(Version As McVersion, DestPath As String, Optional Saves As String() = Nothing, Optional PCLSetup As Boolean = True) + Private Sub ExportModrinth(Version As McVersion, DestPath As String, Saves As String()) + + End Sub + Private Sub ExportCompressed(Version As McVersion, DestPath As String, Saves As String(), PCLSetupGlobal As Boolean, PCLSetupVer As Boolean) Try Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" Directory.CreateDirectory(tempDir) @@ -928,25 +950,34 @@ Retry: If Not IsVerRedundant(GetFileNameFromPath(f)) Then CopyFile(f, tempVerPath & GetFileNameFromPath(f)) Next For Each d In Directory.EnumerateDirectories(Version.Path) - If Not IsVerRedundant(GetFolderNameFromPath(d)) Then CopyDirectory(d, tempVerPath & GetFileNameFromPath(d)) + If Not IsVerRedundant(GetFolderNameFromPath(d)) Then CopyDirectory(d, $"{tempVerPath}{GetFolderNameFromPath(d)}\") Next If Saves IsNot Nothing Then For Each s In Saves - Dim saveFullPath As String = Version.Path & "saves" & s + Dim saveFullPath As String = $"{Version.Path}saves\{s}" If Not Directory.Exists(saveFullPath) Then Continue For CopyDirectory(saveFullPath, $"{tempVerPath}saves\{s}") Next End If - If PCLSetup Then + If PCLSetupGlobal Then If File.Exists(Path & "PCL\Setup.ini") Then CopyFile("PCL\Setup.ini", tempDir & "PCL\Setup.ini") If File.Exists(Path & "PCL\Custom.xaml") Then CopyFile("PCL\Custom.xaml", tempDir & "PCL\Custom.xaml") If Directory.Exists(Path & "PCL\Pictures") Then CopyDirectory(Path & "PCL\Pictures", tempDir & "PCL\Pictures") If Directory.Exists(Path & "PCL\Musics") Then CopyDirectory(Path & "PCL\Musics", tempDir & "PCL\Musics") End If - CopyFile(PathWithName, tempDir & GetFileNameFromPath(PathWithName)) + If PCLSetupVer Then + If Directory.Exists(Version.Path & "PCL\") Then CopyDirectory(Version.Path & "PCL\", tempVerPath & "PCL\") + End If + + If Directory.Exists($"{Version.PathIndie}libraries\optifine") Then '#114 OptiFine Libraries 缺失造成补全文件失败 + CopyDirectory($"{Version.PathIndie}libraries\optifine", + $"{tempDir}{GetFolderNameFromPath(Version.PathIndie)}libraries\optifine") + End If + + CopyFile(PathWithName, tempDir & GetFileNameFromPath(PathWithName)) 'PCL 本体 If File.Exists(DestPath) Then File.Delete(DestPath) '选择文件的时候已经确认了要替换 ZipFile.CreateFromDirectory(tempDir, DestPath) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 03316cb..c8188ac 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -1,5 +1,10 @@ Public Class PageVersionExport Public Sub BtnExportExport_Click() Handles BtnExportExport.Click - ModpackExport(New ExportOptions With {.Version = McVersionCurrent, .Type = ModpackType.Compressed, .Dest = Path & "export.zip"}) + ModpackExport(New ExportOptions(McVersionCurrent, + Path & "export.zip", + ModpackType.Compressed, + {"新的世界", "雕塑"}, + PCLSetupGlobal:=False, + PCLSetupVer:=True)) End Sub End Class diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index ab8011b..ffd61a8 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -677,10 +677,6 @@ Designer MSBuild:Compile - - Designer - MSBuild:Compile - From 49db56856ded7ea8f38ad29ca45a5800fb6580a8 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 11 Jul 2024 10:07:59 +0800 Subject: [PATCH 04/47] =?UTF-8?q?:sparkles:=20=E5=AF=BC=E5=87=BA=E6=95=B4?= =?UTF-8?q?=E5=90=88=E5=8C=85=EF=BC=9AModrinth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModMod.vb | 2 +- .../Modules/Minecraft/ModModpack.vb | 107 +++++++++++++++++- .../PageVersion/PageVersionExport.xaml.vb | 17 ++- .../Plain Craft Launcher 2.vbproj | 4 +- 4 files changed, 116 insertions(+), 14 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb index 0f26a62..1ed28d6 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb @@ -1135,7 +1135,7 @@ Finished: Next WriteFile(PathTemp & "Cache\LocalMod.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) End Sub - Private Function GetTargetModLoaders() As List(Of CompModLoaderType) + Public Function GetTargetModLoaders() As List(Of CompModLoaderType) Dim ModLoaders As New List(Of CompModLoaderType) If PageVersionLeft.Version.Version.HasForge Then ModLoaders.Add(CompModLoaderType.Forge) If PageVersionLeft.Version.Version.HasNeoForge Then ModLoaders.Add(CompModLoaderType.NeoForge) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 02bfe5a..89cf13d 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -890,18 +890,24 @@ Retry: ''' 是否需要保留 PCL 版本设置。仅在压缩包中有效。 ''' Public PCLSetupVer As Boolean = True + ''' + ''' 版本号。仅在 Modrinth 有效。 + ''' + Public VerID As String = "" Public Sub New(Version As McVersion, Dest As String, Type As ModpackType, Saves As String(), Optional PCLSetupGlobal As Boolean = True, - Optional PCLSetupVer As Boolean = True) + Optional PCLSetupVer As Boolean = True, + Optional VerID As String = "") Me.Version = Version Me.Dest = Dest Me.Type = Type Me.Saves = Saves Me.PCLSetupGlobal = PCLSetupGlobal Me.PCLSetupVer = PCLSetupVer + Me.VerID = VerID End Sub End Class ''' @@ -910,7 +916,7 @@ Retry: Public Sub ModpackExport(Options As ExportOptions) Select Case Options.Type Case ModpackType.Modrinth - ExportModrinth(Options.Version, Options.Dest, Options.Saves) + ExportModrinth(Options.Version, Options.Dest, Options.Saves, Options.VerID) Case ModpackType.Compressed ExportCompressed(Options.Version, Options.Dest, Options.Saves, Options.PCLSetupGlobal, Options.PCLSetupVer) End Select @@ -937,31 +943,119 @@ Retry: #End Region #Region "不同类型整合包的导出方法" - Private Sub ExportModrinth(Version As McVersion, DestPath As String, Saves As String()) + Private Sub ExportModrinth(Version As McVersion, DestPath As String, Saves As String(), VerID As String) + Try + Log($"[Export] 导出整合包(Modrinth):{Version.Path} -> {DestPath},导出存档 {If(Saves Is Nothing OrElse Not Saves.Any, "不导出", Saves.Join(", "))}") + Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" + Log($"[Export] 缓存文件夹:{tempDir}") + Directory.CreateDirectory(tempDir) + '步骤 1:从 Modrinth 获取 Mod 工程信息,得到 URL + Dim Mods As New List(Of McMod) + For Each m In Directory.EnumerateFiles(Version.Path & "mods\") + Mods.Add(New McMod(m)) + Next + + '从 Modrinth 获取信息 + Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList() + Dim ModrinthVersion = CType(GetJson(NetRequestRetry("https://api.modrinth.com/v2/version_files", "POST", + $"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject) + 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 + 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) + Continue For + End If + ModrinthMapping.Add(Entry.FileName, ModrinthVersion(Entry.ModrinthHash)("files")(0)) + Next + + '步骤 2:写入 Json 文件 + '获取作为检查目标的加载器和版本 + Dim ModLoaders = GetTargetModLoaders() + Dim McVersion = Version.Version.McName + Log($"[Export] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}") + + Dim files As New JArray + For Each m In ModrinthMapping + Dim f As New JObject + f.Add("path", $"mods/{m.Key}") + f.Add("hashes", m.Value("hashes")) + f.Add("env", New JObject From {{"client", "required"}, {"server", "required"}}) + f.Add("downloads", New JArray From {m.Value("url")}) + f.Add("fileSize", m.Value("size")) + files.Add(f) + 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) + If Version.Version.HasNeoForge Then depend.Add("neoforge", Version.Version.NeoForgeVersion) + + Dim json As New JObject From { + {"game", "minecraft"}, + {"formatVersion", 1}, + {"versionId", VerID}, + {"name", Version.Name}, + {"summary", Version.Info}, + {"files", files}, + {"dependencies", depend} + } + + File.WriteAllText(tempDir & "modrinth.index.json", json.ToString) + + '步骤 3:将获取不到的保存到 overrides 目录 + For Each m In LocalMods + CopyFile(m, tempDir & "overrides\" & GetFileNameFromPath(m)) + Next + + '存档 + For Each s In Saves + Dim fromPath As String = $"{Version.Path}saves\{s}" + If Directory.Exists(fromPath) Then CopyDirectory(fromPath, $"{tempDir}overrides\saves\{s}") + Next + + If File.Exists(DestPath) Then File.Delete(DestPath) '选择文件的时候已经确认了要替换 + ZipFile.CreateFromDirectory(tempDir, DestPath) + DeleteDirectory(tempDir) + Catch ex As Exception + Log(ex, "导出整合包失败", LogLevel.Msgbox) + End Try End Sub Private Sub ExportCompressed(Version As McVersion, DestPath As String, Saves As String(), PCLSetupGlobal As Boolean, PCLSetupVer As Boolean) Try + Log($"[Export] 导出整合包(压缩包):{Version.Path} -> {DestPath},导出存档 {If(Saves Is Nothing OrElse Not Saves.Any, "不导出", Saves.Join(", "))},全局设置 {If(PCLSetupGlobal, "导出", "不导出")},版本设置 {If(PCLSetupVer, "导出", "不导出")}") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" + Log($"[Export] 缓存文件夹:{tempDir}") Directory.CreateDirectory(tempDir) Dim tempVerPath As String = $"{tempDir}{Version.Path.Replace(GetPathFromFullPath(Version.PathIndie), "")}" For Each f In Directory.EnumerateFiles(Version.Path) - If Not IsVerRedundant(GetFileNameFromPath(f)) Then CopyFile(f, tempVerPath & GetFileNameFromPath(f)) + If Not IsVerRedundant(GetFileNameFromPath(f)) Then + Log($"[Export] 复制版本文件:{f} -> {tempVerPath}{GetFileNameFromPath(f)}") + CopyFile(f, tempVerPath & GetFileNameFromPath(f)) + End If Next For Each d In Directory.EnumerateDirectories(Version.Path) - If Not IsVerRedundant(GetFolderNameFromPath(d)) Then CopyDirectory(d, $"{tempVerPath}{GetFolderNameFromPath(d)}\") + If Not IsVerRedundant(GetFolderNameFromPath(d)) Then + Log($"[Export] 复制版本文件夹:{d} -> {tempVerPath}{GetFolderNameFromPath(d)}\") + CopyDirectory(d, $"{tempVerPath}{GetFolderNameFromPath(d)}\") + End If Next If Saves IsNot Nothing Then For Each s In Saves Dim saveFullPath As String = $"{Version.Path}saves\{s}" If Not Directory.Exists(saveFullPath) Then Continue For + Log($"[Export] 复制存档文件夹:{saveFullPath} -> {tempVerPath}saves\{s}") CopyDirectory(saveFullPath, $"{tempVerPath}saves\{s}") Next End If If PCLSetupGlobal Then + Log($"[Export] 正在复制 PCL 全局设置") If File.Exists(Path & "PCL\Setup.ini") Then CopyFile("PCL\Setup.ini", tempDir & "PCL\Setup.ini") If File.Exists(Path & "PCL\Custom.xaml") Then CopyFile("PCL\Custom.xaml", tempDir & "PCL\Custom.xaml") If Directory.Exists(Path & "PCL\Pictures") Then CopyDirectory(Path & "PCL\Pictures", tempDir & "PCL\Pictures") @@ -969,14 +1063,17 @@ Retry: End If If PCLSetupVer Then + Log($"[Export] 正在复制 PCL 版本设置") If Directory.Exists(Version.Path & "PCL\") Then CopyDirectory(Version.Path & "PCL\", tempVerPath & "PCL\") End If If Directory.Exists($"{Version.PathIndie}libraries\optifine") Then '#114 OptiFine Libraries 缺失造成补全文件失败 + Log($"[Export] 正在复制 OptiFine Libraries") CopyDirectory($"{Version.PathIndie}libraries\optifine", $"{tempDir}{GetFolderNameFromPath(Version.PathIndie)}libraries\optifine") End If + Log($"[Export] 正在复制 PCL 本体") CopyFile(PathWithName, tempDir & GetFileNameFromPath(PathWithName)) 'PCL 本体 If File.Exists(DestPath) Then File.Delete(DestPath) '选择文件的时候已经确认了要替换 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index c8188ac..122d451 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -1,10 +1,15 @@ Public Class PageVersionExport Public Sub BtnExportExport_Click() Handles BtnExportExport.Click - ModpackExport(New ExportOptions(McVersionCurrent, - Path & "export.zip", - ModpackType.Compressed, - {"新的世界", "雕塑"}, - PCLSetupGlobal:=False, - PCLSetupVer:=True)) + Dim Type As ModpackType = ModpackType.Modrinth + If Type = ModpackType.Compressed AndAlso Val(VersionBranchCode) <> 50 Then + MyMsgBox("你当前的 PCL 不是正式版,且受到再次分发(制作压缩包)的限制。" & vbCrLf & + "请使用正式版再次进行该操作再试!" & vbCrLf & + "其他类型的整合包(例如 Modrinth 整合包)没有该限制。") + Exit Sub + End If + RunInNewThread(Sub() + ModpackExport(New ExportOptions(McVersionCurrent, Path & "exportmr.zip", Type, {"新的世界", "雕塑"}, + PCLSetupGlobal:=False, PCLSetupVer:=True, VerID:="1.2.3")) + End Sub, "Modpack Export") End Sub End Class diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index ffd61a8..53bf030 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -38,7 +38,7 @@ false false true - D:\Minecraft\程序\ + bin\Debug\ Plain Craft Launcher 2.xml 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314 false @@ -111,7 +111,7 @@ false - D:\Minecraft\程序\ + bin\BETA\ Plain Craft Launcher 2.xml true 1 From 92f30181d507ab6bc5e4dc4f0b4b350532b4d901 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 11 Jul 2024 12:58:48 +0800 Subject: [PATCH 05/47] =?UTF-8?q?:sparkles:=20=E5=AE=8C=E6=88=90=20UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 45 +++++++++++---- .../Pages/PageVersion/PageVersionExport.xaml | 38 ++++++++++++- .../PageVersion/PageVersionExport.xaml.vb | 57 ++++++++++++++++--- .../Pages/PageVersion/PageVersionLeft.xaml | 2 +- 4 files changed, 120 insertions(+), 22 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 89cf13d..6f93a26 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -891,6 +891,10 @@ Retry: ''' Public PCLSetupVer As Boolean = True ''' + ''' 整合包名称。仅在 Modrinth 有效。 + ''' + Public Name As String = "" + ''' ''' 版本号。仅在 Modrinth 有效。 ''' Public VerID As String = "" @@ -900,6 +904,8 @@ Retry: Saves As String(), Optional PCLSetupGlobal As Boolean = True, Optional PCLSetupVer As Boolean = True, + Optional Name As String = "", + Optional Author As String = "", Optional VerID As String = "") Me.Version = Version Me.Dest = Dest @@ -907,23 +913,35 @@ Retry: Me.Saves = Saves Me.PCLSetupGlobal = PCLSetupGlobal Me.PCLSetupVer = PCLSetupVer + Me.Name = Name Me.VerID = VerID End Sub End Class ''' - ''' 导出整合包。 + ''' 导出整合包。不阻塞。 ''' Public Sub ModpackExport(Options As ExportOptions) + Hint("正在导出……") + RunInNewThread(Sub() + If ModpackExportBlocking(Options) Then + Hint("导出成功!", HintType.Finish) + OpenExplorer($"""{GetPathFromFullPath(Options.Dest)}""") + End If + End Sub, "Modpack Export") + End Sub + Private Function ModpackExportBlocking(Options As ExportOptions) As Boolean Select Case Options.Type Case ModpackType.Modrinth - ExportModrinth(Options.Version, Options.Dest, Options.Saves, Options.VerID) + Return ExportModrinth(Options.Version, Options.Dest, Options.Saves, Options.Name, Options.VerID) Case ModpackType.Compressed - ExportCompressed(Options.Version, Options.Dest, Options.Saves, Options.PCLSetupGlobal, Options.PCLSetupVer) + Return ExportCompressed(Options.Version, Options.Dest, Options.Saves, Options.PCLSetupGlobal, Options.PCLSetupVer) + Case Else + Throw New ArgumentException($"未知的整合包类型:{Options.Type}") End Select - End Sub + End Function #Region "冗余" - Private VersionRedundant As String() = {"saves", "screenshots", "backups", "command_history\.txt", '个人文件 + Private VersionRedundant As String() = {"screenshots", "backups", "command_history\.txt", '个人文件 ".*-natives", "server-resource-packs", "user.*cache\.json", "\.optifine", "\.fabric", '缓存 ".*\.jar", "downloads", "realms_persistence.json", "\$\{natives_directory\}", '可联网更新 "logs", "crash-reports", ".*\.log", '日志 @@ -932,7 +950,7 @@ Retry: "\.replay_cache", "replay_recordings", "replay_videos", 'ReplayMod "irisUpdateInfo\.json", 'Iris ".*\.BakaCoreInfo", 'BakaXL - "PCL" '到时候会拷,别急 + "PCL", "saves" '到时候会拷,别急 } Private Function IsVerRedundant(FileName As String) As Boolean For Each regex In VersionRedundant @@ -943,7 +961,7 @@ Retry: #End Region #Region "不同类型整合包的导出方法" - Private Sub ExportModrinth(Version As McVersion, DestPath As String, Saves As String(), VerID As String) + Private Function ExportModrinth(Version As McVersion, DestPath As String, Saves As String(), Name As String, VerID As String) Try Log($"[Export] 导出整合包(Modrinth):{Version.Path} -> {DestPath},导出存档 {If(Saves Is Nothing OrElse Not Saves.Any, "不导出", Saves.Join(", "))}") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" @@ -998,7 +1016,7 @@ Retry: {"game", "minecraft"}, {"formatVersion", 1}, {"versionId", VerID}, - {"name", Version.Name}, + {"name", If(String.IsNullOrEmpty(Name), Version.Name, Name)}, {"summary", Version.Info}, {"files", files}, {"dependencies", depend} @@ -1013,6 +1031,7 @@ Retry: '存档 For Each s In Saves + If String.IsNullOrWhiteSpace(s) Then Continue For '草了,传空字串进去会直接把 saves 整个文件夹拷过去 Dim fromPath As String = $"{Version.Path}saves\{s}" If Directory.Exists(fromPath) Then CopyDirectory(fromPath, $"{tempDir}overrides\saves\{s}") Next @@ -1020,11 +1039,13 @@ Retry: If File.Exists(DestPath) Then File.Delete(DestPath) '选择文件的时候已经确认了要替换 ZipFile.CreateFromDirectory(tempDir, DestPath) DeleteDirectory(tempDir) + Return True Catch ex As Exception Log(ex, "导出整合包失败", LogLevel.Msgbox) + Return False End Try - End Sub - Private Sub ExportCompressed(Version As McVersion, DestPath As String, Saves As String(), PCLSetupGlobal As Boolean, PCLSetupVer As Boolean) + End Function + Private Function ExportCompressed(Version As McVersion, DestPath As String, Saves As String(), PCLSetupGlobal As Boolean, PCLSetupVer As Boolean) Try Log($"[Export] 导出整合包(压缩包):{Version.Path} -> {DestPath},导出存档 {If(Saves Is Nothing OrElse Not Saves.Any, "不导出", Saves.Join(", "))},全局设置 {If(PCLSetupGlobal, "导出", "不导出")},版本设置 {If(PCLSetupVer, "导出", "不导出")}") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" @@ -1079,10 +1100,12 @@ Retry: If File.Exists(DestPath) Then File.Delete(DestPath) '选择文件的时候已经确认了要替换 ZipFile.CreateFromDirectory(tempDir, DestPath) DeleteDirectory(tempDir) + Return True Catch ex As Exception Log(ex, "导出整合包失败", LogLevel.Msgbox) + Return False End Try - End Sub + End Function #End Region #End Region diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 01aa968..2672872 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -7,7 +7,7 @@ PanScroll="{Binding ElementName=PanBack}"> - + @@ -20,12 +20,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 122d451..c6ae677 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -1,15 +1,56 @@ Public Class PageVersionExport - Public Sub BtnExportExport_Click() Handles BtnExportExport.Click - Dim Type As ModpackType = ModpackType.Modrinth + + Private CurrentVersion As McVersion = PageVersionLeft.Version + Private Type As ModpackType = ModpackType.Compressed + Private SelectedSaves As New List(Of Integer) + Private ReadOnly Property Saves As List(Of String) + Get + If Directory.Exists(CurrentVersion.Path & "saves\") Then + Return Directory.EnumerateDirectories(CurrentVersion.Path & "saves\").ToList + End If + Return New List(Of String) + End Get + End Property + + Private Sub PageVersionExport_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + CurrentVersion = PageVersionLeft.Version '各个版本不同,每次都需要重新加载 + TbExportName.HintText = CurrentVersion.Name + End Sub + +#Region "控件事件" + Private Sub ComboExportType_Change(sender As ComboBox, e As SelectionChangedEventArgs) Handles ComboExportType.SelectionChanged + If AniControlEnabled <> 0 Then Exit Sub + Type = If(sender.SelectedIndex = 0, ModpackType.Compressed, ModpackType.Modrinth) + Select Case Type + Case ModpackType.Modrinth + If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Collapsed + If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Visible + Case ModpackType.Compressed + If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Visible + If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Collapsed + End Select + CardExport.TriggerForceResize() + End Sub + + Private Sub BtnExportExport_Click() Handles BtnExportExport.Click If Type = ModpackType.Compressed AndAlso Val(VersionBranchCode) <> 50 Then - MyMsgBox("你当前的 PCL 不是正式版,且受到再次分发(制作压缩包)的限制。" & vbCrLf & + If MyMsgBox("你当前的 PCL 不是正式版,且受到再次分发(制作压缩包)的限制。" & vbCrLf & "请使用正式版再次进行该操作再试!" & vbCrLf & - "其他类型的整合包(例如 Modrinth 整合包)没有该限制。") + "其他类型的整合包(例如 Modrinth 整合包)没有该限制。", Button1:="下载正式版", Button2:="取消") = 1 Then + OpenWebsite("https://afdian.net/p/0164034c016c11ebafcb52540025c377") + End If Exit Sub End If - RunInNewThread(Sub() - ModpackExport(New ExportOptions(McVersionCurrent, Path & "exportmr.zip", Type, {"新的世界", "雕塑"}, - PCLSetupGlobal:=False, PCLSetupVer:=True, VerID:="1.2.3")) - End Sub, "Modpack Export") + Dim savePath As String = SelectAs( + "选择导出位置", $"整合包 - {If(String.IsNullOrWhiteSpace(TbExportName.Text), CurrentVersion.Name, TbExportName.Text)}" & If(Type = ModpackType.Modrinth, ".mrpack", ".zip"), + If(Type = ModpackType.Modrinth, "Modrinth 整合包(*.mrpack)|*.mrpack", "整合包文件(*.zip)|*.zip")) + If String.IsNullOrEmpty(savePath) Then Exit Sub + ModpackExport(New ExportOptions(CurrentVersion, savePath, Type, {TbExportSave.Text}, + PCLSetupGlobal:=CheckExportGlobal.Checked, + PCLSetupVer:=CheckExportVersion.Checked, Name:=TbExportName.Text, + VerID:=TbExportVersion.Text)) End Sub + +#End Region + End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml index 80be838..45eb800 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml @@ -24,7 +24,7 @@ + Logo="M511.488 995.328a128.654222 128.654222 0 0 1-57.116444-13.112889L70.769778 791.808a126.833778 126.833778 0 0 1-70.769778-113.777778V311.608889a126.179556 126.179556 0 0 1 15.36-60.103111V248.604444c1.479111-2.901333 3.356444-5.603556 5.518222-8.021333a127.630222 127.630222 0 0 1 49.891556-42.325333L454.371556 13.368889a128.739556 128.739556 0 0 1 112.981333 0l383.601778 190.407111a126.862222 126.862222 0 0 1 72.049777 113.379556v360.874666a126.805333 126.805333 0 0 1-70.769777 115.939556L568.604444 984.32c-17.92 7.964444-37.461333 11.747556-57.116444 11.008z m42.638222-470.897778v370.204445l360.192-178.545778c14.449778-7.253333 23.552-21.987556 23.438222-38.087111v-335.928889L554.097778 524.430222zM85.248 330.666667v347.335111a42.268444 42.268444 0 0 0 23.438222 38.087111l360.192 178.545778V523.576889L85.248 330.666667zM135.537778 260.835556l375.950222 189.952 137.671111-65.564445L286.435556 188.074667 135.537778 260.864z m245.105778-118.471112l363.576888 197.973334 150.897778-71.480889-365.283555-180.224a42.922667 42.922667 0 0 0-37.518223 0l-111.672888 53.731555z" > From bc58fdaf39d7940813c3828398e27cd44265a0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=9A=E5=AD=90=E6=9F=9A=E5=AD=90?= Date: Thu, 11 Jul 2024 12:59:22 +0800 Subject: [PATCH 06/47] Update Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb Co-authored-by: Pigeon0v0 <60414767+Pigeon0v0@users.noreply.github.com> --- .../Pages/PageVersion/PageVersionExport.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index c6ae677..68e6c60 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -35,7 +35,7 @@ Private Sub BtnExportExport_Click() Handles BtnExportExport.Click If Type = ModpackType.Compressed AndAlso Val(VersionBranchCode) <> 50 Then If MyMsgBox("你当前的 PCL 不是正式版,且受到再次分发(制作压缩包)的限制。" & vbCrLf & - "请使用正式版再次进行该操作再试!" & vbCrLf & + "请使用正式版再次尝试该操作!" & vbCrLf & "其他类型的整合包(例如 Modrinth 整合包)没有该限制。", Button1:="下载正式版", Button2:="取消") = 1 Then OpenWebsite("https://afdian.net/p/0164034c016c11ebafcb52540025c377") End If From a74e59baf4d3e4843ffa1f2e65a103fd9b137300 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 11 Jul 2024 13:00:28 +0800 Subject: [PATCH 07/47] =?UTF-8?q?:speech=5Fballoon:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pigeon0v0 <60414767+Pigeon0v0@users.noreply.github.com> --- .../Pages/PageVersion/PageVersionExport.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index c6ae677..ce079cf 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -34,7 +34,7 @@ Private Sub BtnExportExport_Click() Handles BtnExportExport.Click If Type = ModpackType.Compressed AndAlso Val(VersionBranchCode) <> 50 Then - If MyMsgBox("你当前的 PCL 不是正式版,且受到再次分发(制作压缩包)的限制。" & vbCrLf & + If MyMsgBox("你当前的 PCL 不是正式版,有二次分发(制作压缩包)的限制。" & vbCrLf & "请使用正式版再次进行该操作再试!" & vbCrLf & "其他类型的整合包(例如 Modrinth 整合包)没有该限制。", Button1:="下载正式版", Button2:="取消") = 1 Then OpenWebsite("https://afdian.net/p/0164034c016c11ebafcb52540025c377") From 05b175b5ef10d36f7a42ff0462d0d5a8320654e3 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 11 Jul 2024 13:06:30 +0800 Subject: [PATCH 08/47] =?UTF-8?q?:rewind:=20=E5=9B=9E=E6=BB=9A=20vbproj=20?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 53bf030..8b0900b 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -38,7 +38,7 @@ false false true - bin\Debug\ + D:\Minecraft\程序\ Plain Craft Launcher 2.xml 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314 false @@ -111,7 +111,7 @@ false - bin\BETA\ + D:\Minecraft\程序\ Plain Craft Launcher 2.xml true 1 @@ -185,6 +185,9 @@ MyIconTextButton.xaml + + + @@ -469,6 +472,7 @@ MyRadioButton.xaml + FormMain.xaml Code @@ -927,6 +931,7 @@ + From b7118be391e86aae1129a0c4248bf17695294ce4 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 11 Jul 2024 13:17:37 +0800 Subject: [PATCH 09/47] =?UTF-8?q?:speech=5Fballoon:=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=8C=85=E5=90=AB=E5=AD=98=E6=A1=A3=E7=9A=84=20Tooltip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 2672872..21d5636 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -27,7 +27,7 @@ - + From 4c69defb42fc836efc5e060ce3e47cbda09cb8d0 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 11 Jul 2024 13:28:19 +0800 Subject: [PATCH 10/47] =?UTF-8?q?:sparkles:=20=E5=AF=B9=E9=BD=90=20mr=20?= =?UTF-8?q?=E6=95=B4=E5=90=88=E5=8C=85=E7=9A=84=E8=BE=93=E5=85=A5=E6=A1=86?= =?UTF-8?q?=20=E5=BC=BA=E8=BF=AB=E7=97=87=E5=BF=AB=E4=B9=90.jpg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 21d5636..dc77126 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -22,7 +22,7 @@ - + @@ -46,7 +46,8 @@ - + + @@ -55,9 +56,9 @@ - + - + From 32803b1b67d0cb13ff7386fd197f6a9eaf0dd633 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 11 Jul 2024 13:35:47 +0800 Subject: [PATCH 11/47] =?UTF-8?q?:ok=5Fhand:=20=E6=8E=92=E9=99=A4=20HMCL?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 6f93a26..2c8dab4 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -949,7 +949,8 @@ Retry: "\$\{quickPlayPath\}", '服务器 "\.replay_cache", "replay_recordings", "replay_videos", 'ReplayMod "irisUpdateInfo\.json", 'Iris - ".*\.BakaCoreInfo", 'BakaXL + ".*\.BakaCoreInfo", 'BakaXL 配置 + "hmclversion\.cfg", 'HMCL 配置 "PCL", "saves" '到时候会拷,别急 } Private Function IsVerRedundant(FileName As String) As Boolean From ae4f1b867229fd180392576bdb71e9c43a4e60a6 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 11 Jul 2024 14:11:44 +0800 Subject: [PATCH 12/47] =?UTF-8?q?:ok=5Fhand:=20=E6=8E=92=E9=99=A4=20`log4j?= =?UTF-8?q?2.xml`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 2c8dab4..3125453 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -950,7 +950,7 @@ Retry: "\.replay_cache", "replay_recordings", "replay_videos", 'ReplayMod "irisUpdateInfo\.json", 'Iris ".*\.BakaCoreInfo", 'BakaXL 配置 - "hmclversion\.cfg", 'HMCL 配置 + "hmclversion\.cfg", "log4j2\.xml", 'HMCL 配置 "PCL", "saves" '到时候会拷,别急 } Private Function IsVerRedundant(FileName As String) As Boolean From b28c707cb5a845ee3eed911adced7dc09747691b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=8B=E6=B7=8B=20=E8=90=BD?= Date: Fri, 12 Jul 2024 09:02:15 +0800 Subject: [PATCH 13/47] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E6=95=B4=E5=90=88=E5=8C=85UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml | 106 +++++++++++------- .../PageVersion/PageVersionExport.xaml.vb | 33 +----- 2 files changed, 70 insertions(+), 69 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index dc77126..6408ab1 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -7,7 +7,13 @@ PanScroll="{Binding ElementName=PanBack}"> - + + + + + + + @@ -20,49 +26,73 @@ + + - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 15c81c7..57e83ff 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -18,38 +18,9 @@ End Sub #Region "控件事件" - Private Sub ComboExportType_Change(sender As ComboBox, e As SelectionChangedEventArgs) Handles ComboExportType.SelectionChanged - If AniControlEnabled <> 0 Then Exit Sub - Type = If(sender.SelectedIndex = 0, ModpackType.Compressed, ModpackType.Modrinth) - Select Case Type - Case ModpackType.Modrinth - If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Collapsed - If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Visible - Case ModpackType.Compressed - If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Visible - If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Collapsed - End Select - CardExport.TriggerForceResize() - End Sub - Private Sub BtnExportExport_Click() Handles BtnExportExport.Click - If Type = ModpackType.Compressed AndAlso Val(VersionBranchCode) <> 50 Then - If MyMsgBox("你当前的 PCL 不是正式版,有二次分发(制作压缩包)的限制。" & vbCrLf & - "请使用正式版再次尝试该操作!" & vbCrLf & - "其他类型的整合包(例如 Modrinth 整合包)没有该限制。", Button1:="下载正式版", Button2:="取消") = 1 Then - OpenWebsite("https://afdian.net/p/0164034c016c11ebafcb52540025c377") - End If - Exit Sub - End If - Dim savePath As String = SelectAs( - "选择导出位置", $"整合包 - {If(String.IsNullOrWhiteSpace(TbExportName.Text), CurrentVersion.Name, TbExportName.Text)}" & If(Type = ModpackType.Modrinth, ".mrpack", ".zip"), - If(Type = ModpackType.Modrinth, "Modrinth 整合包(*.mrpack)|*.mrpack", "整合包文件(*.zip)|*.zip")) - If String.IsNullOrEmpty(savePath) Then Exit Sub - ModpackExport(New ExportOptions(CurrentVersion, savePath, Type, {TbExportSave.Text}, - PCLSetupGlobal:=CheckExportGlobal.Checked, - PCLSetupVer:=CheckExportVersion.Checked, Name:=TbExportName.Text, - VerID:=TbExportVersion.Text)) - End Sub + + #End Region From 465a38163b61c5cdf61fd9bdb9e1744d731f1555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=8B=E6=B7=8B=20=E8=90=BD?= Date: Fri, 12 Jul 2024 09:30:12 +0800 Subject: [PATCH 14/47] =?UTF-8?q?=E5=9C=A8=E5=9F=BA=E7=A1=80=E9=80=89?= =?UTF-8?q?=E9=A1=B9=E9=87=8C=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E6=96=87=E4=BB=B6=E7=9A=84=E9=80=89=E6=8B=A9=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=86=E5=9F=BA=E7=A1=80=E9=80=89=E9=A1=B9?= =?UTF-8?q?=E9=87=8C=E7=9A=84=E6=8E=92=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 6408ab1..d8b552d 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -59,13 +59,14 @@ - + + + - @@ -73,15 +74,19 @@ + - - - - - + + + + + + + + From c4974bbf5a0141dd102688fceede44d0ed023ad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=8B=E6=B7=8B=20=E8=90=BD?= Date: Fri, 12 Jul 2024 09:31:03 +0800 Subject: [PATCH 15/47] =?UTF-8?q?=E5=88=A0=E9=99=A4=E4=BA=86=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E7=9A=84=E6=8D=A2=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index d8b552d..a43888a 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -85,8 +85,6 @@ - - From 82c398dee0f0fc37a7d3e160abddf363bd6a3662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=8B=E6=B7=8B=20=E8=90=BD?= Date: Fri, 12 Jul 2024 10:30:57 +0800 Subject: [PATCH 16/47] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=BA=86=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E9=94=99=E8=AF=AF=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E6=A0=87=E9=A2=98=EF=BC=8C=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=BA=86=E9=97=B4=E8=B7=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index a43888a..72513c7 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -28,6 +28,7 @@ + @@ -57,7 +58,7 @@ - + @@ -65,8 +66,8 @@ - - + + @@ -77,22 +78,29 @@ - - - - - - - - + + + + + + + + - + From bc5b37cce5f8fd4fa3bf74108b7f4d09f1cac0fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=8B=E6=B7=8B=20=E8=90=BD?= Date: Fri, 12 Jul 2024 10:43:58 +0800 Subject: [PATCH 17/47] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E6=96=87?= =?UTF-8?q?=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 72513c7..f20bd32 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -60,7 +60,7 @@ - + From 1284f464c10955b35db651d17793a4cc74d4a4aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=8B=E6=B7=8B=20=E8=90=BD?= Date: Fri, 12 Jul 2024 10:56:23 +0800 Subject: [PATCH 18/47] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E2=80=9C?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=95=B4=E5=90=88=E5=8C=85=E2=80=9D=E7=9A=84?= =?UTF-8?q?=E5=92=8C=E8=BE=B9=E7=95=8C=E7=9A=84=E8=B7=9D=E7=A6=BB=EF=BC=8C?= =?UTF-8?q?21=E6=94=B9=E4=B8=BA20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index f20bd32..56cea77 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -14,7 +14,7 @@ - + From a1b98308d4608e663f1ef71f088ffd6c4e035ab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=8B=E6=B7=8B=20=E8=90=BD?= Date: Fri, 12 Jul 2024 11:11:19 +0800 Subject: [PATCH 19/47] =?UTF-8?q?Revert=20"=E4=BF=AE=E6=94=B9=E4=BA=86?= =?UTF-8?q?=E2=80=9C=E5=AF=BC=E5=87=BA=E6=95=B4=E5=90=88=E5=8C=85=E2=80=9D?= =?UTF-8?q?=E7=9A=84=E5=92=8C=E8=BE=B9=E7=95=8C=E7=9A=84=E8=B7=9D=E7=A6=BB?= =?UTF-8?q?=EF=BC=8C21=E6=94=B9=E4=B8=BA20"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 1284f464c10955b35db651d17793a4cc74d4a4aa. --- Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 56cea77..f20bd32 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -14,7 +14,7 @@ - + From 6850cd6764f74be61619051391e0c7e514615ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=8B=E6=B7=8B=20=E8=90=BD?= Date: Fri, 12 Jul 2024 13:17:33 +0800 Subject: [PATCH 20/47] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E2=80=9C?= =?UTF-8?q?=E5=8C=85=E5=90=AB=E5=90=AF=E5=8A=A8=E5=99=A8=E2=80=9D=E5=92=8C?= =?UTF-8?q?=E2=80=9C=E5=90=AF=E5=8A=A8=E5=99=A8=E5=85=A8=E5=B1=80=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E2=80=9D=E7=9A=84=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index f20bd32..1951ffe 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -78,22 +78,22 @@ - - - - - - - - + + From ca07edc7079d028f17454859f74bbbb7848cb1f5 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Fri, 12 Jul 2024 21:42:07 +0800 Subject: [PATCH 21/47] =?UTF-8?q?:construction:=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E9=BE=99=E7=8C=AB=E7=9A=84=E5=AE=A1=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 68 +++++++++---------- .../Pages/PageVersion/PageVersionExport.xaml | 1 + .../PageVersion/PageVersionExport.xaml.vb | 24 ++++--- 3 files changed, 46 insertions(+), 47 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 3125453..cfa67aa 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -859,8 +859,7 @@ Retry: ''' 整合包类型。 ''' Public Enum ModpackType - Modrinth = 4 - Compressed = 9 + Modrinth End Enum ''' ''' 导出整合包的选项。 @@ -875,22 +874,22 @@ Retry: ''' Public Dest As String ''' + ''' 是否包括 PCL 文件。 + ''' + Public IncludePCL As Boolean + ''' ''' 整合包类型。 ''' Public Type As ModpackType ''' - ''' 要保留到整合包的存档。 + ''' 要保留到整合包的文件。 ''' - Public Saves As String() + Public Remain As String() ''' ''' 是否需要保留 PCL 全局设置。仅在压缩包中有效。 ''' Public PCLSetupGlobal As Boolean = True ''' - ''' 是否需要保留 PCL 版本设置。仅在压缩包中有效。 - ''' - Public PCLSetupVer As Boolean = True - ''' ''' 整合包名称。仅在 Modrinth 有效。 ''' Public Name As String = "" @@ -900,19 +899,17 @@ Retry: Public VerID As String = "" Public Sub New(Version As McVersion, Dest As String, - Type As ModpackType, - Saves As String(), + IncludePCL As Boolean, + Remain As String(), Optional PCLSetupGlobal As Boolean = True, - Optional PCLSetupVer As Boolean = True, Optional Name As String = "", Optional Author As String = "", Optional VerID As String = "") Me.Version = Version Me.Dest = Dest - Me.Type = Type - Me.Saves = Saves + Me.IncludePCL = IncludePCL + Me.Remain = Remain Me.PCLSetupGlobal = PCLSetupGlobal - Me.PCLSetupVer = PCLSetupVer Me.Name = Name Me.VerID = VerID End Sub @@ -930,32 +927,34 @@ Retry: End Sub, "Modpack Export") End Sub Private Function ModpackExportBlocking(Options As ExportOptions) As Boolean - Select Case Options.Type - Case ModpackType.Modrinth - Return ExportModrinth(Options.Version, Options.Dest, Options.Saves, Options.Name, Options.VerID) - Case ModpackType.Compressed - Return ExportCompressed(Options.Version, Options.Dest, Options.Saves, Options.PCLSetupGlobal, Options.PCLSetupVer) - Case Else - Throw New ArgumentException($"未知的整合包类型:{Options.Type}") - End Select + If Options.IncludePCL Then + Return ExportCompressed(Options.Version, Options.Dest, Options.Remain, Options.PCLSetupGlobal) + End If + Return ExportModrinth(Options.Version, Options.Dest, Options.Remain, Options.Name, Options.VerID) End Function #Region "冗余" Private VersionRedundant As String() = {"screenshots", "backups", "command_history\.txt", '个人文件 - ".*-natives", "server-resource-packs", "user.*cache\.json", "\.optifine", "\.fabric", '缓存 - ".*\.jar", "downloads", "realms_persistence.json", "\$\{natives_directory\}", '可联网更新 - "logs", "crash-reports", ".*\.log", '日志 + ".*-natives", "server-resource-packs", "user.*cache\.json", "\.optifine", "\.fabric", "\.mixin\.out", '缓存 + ".*\.jar", "downloads", "realms_persistence.json", "\$\{natives_directory\}", "essential", '可联网更新 + "logs", "crash-reports", ".*\.log", "debug", '日志 ".*\.dat_old", ".*\.old", '备份 "\$\{quickPlayPath\}", '服务器 "\.replay_cache", "replay_recordings", "replay_videos", 'ReplayMod "irisUpdateInfo\.json", 'Iris + "modernfix", 'ModernFix 模组 + "modtranslations", 'Mod 翻译 + "schematics", 'schematics 模组 ".*\.BakaCoreInfo", 'BakaXL 配置 - "hmclversion\.cfg", "log4j2\.xml", 'HMCL 配置 - "PCL", "saves" '到时候会拷,别急 + "hmclversion\.cfg", "log4j2\.xml" 'HMCL 配置 } - Private Function IsVerRedundant(FileName As String) As Boolean + Private Function IsVerRedundant(FilePath As String) As Boolean For Each regex In VersionRedundant - If RegexCheck(FileName, regex) Then Return True + If RegexCheck(GetFileNameFromPath(FilePath).ToLower(), regex) Then Return True + If FilePath.Replace("/", "\").EndsWithF("\journeymap\data\") OrElse + FilePath.Replace("/", "\").EndsWithF("\journeymap\data") Then + Return True + End If Next Return False End Function @@ -972,7 +971,7 @@ Retry: '步骤 1:从 Modrinth 获取 Mod 工程信息,得到 URL Dim Mods As New List(Of McMod) For Each m In Directory.EnumerateFiles(Version.Path & "mods\") - Mods.Add(New McMod(m)) + If m.EndsWithF(".jar") Then Mods.Add(New McMod(m)) Next '从 Modrinth 获取信息 @@ -1046,9 +1045,9 @@ Retry: Return False End Try End Function - Private Function ExportCompressed(Version As McVersion, DestPath As String, Saves As String(), PCLSetupGlobal As Boolean, PCLSetupVer As Boolean) + Private Function ExportCompressed(Version As McVersion, DestPath As String, Saves As String(), PCLSetupGlobal As Boolean) Try - Log($"[Export] 导出整合包(压缩包):{Version.Path} -> {DestPath},导出存档 {If(Saves Is Nothing OrElse Not Saves.Any, "不导出", Saves.Join(", "))},全局设置 {If(PCLSetupGlobal, "导出", "不导出")},版本设置 {If(PCLSetupVer, "导出", "不导出")}") + Log($"[Export] 导出整合包(压缩包):{Version.Path} -> {DestPath},导出存档 {If(Saves Is Nothing OrElse Not Saves.Any, "不导出", Saves.Join(", "))},全局设置 {If(PCLSetupGlobal, "导出", "不导出")}") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" Log($"[Export] 缓存文件夹:{tempDir}") Directory.CreateDirectory(tempDir) @@ -1084,11 +1083,6 @@ Retry: If Directory.Exists(Path & "PCL\Musics") Then CopyDirectory(Path & "PCL\Musics", tempDir & "PCL\Musics") End If - If PCLSetupVer Then - Log($"[Export] 正在复制 PCL 版本设置") - If Directory.Exists(Version.Path & "PCL\") Then CopyDirectory(Version.Path & "PCL\", tempVerPath & "PCL\") - End If - If Directory.Exists($"{Version.PathIndie}libraries\optifine") Then '#114 OptiFine Libraries 缺失造成补全文件失败 Log($"[Export] 正在复制 OptiFine Libraries") CopyDirectory($"{Version.PathIndie}libraries\optifine", diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index dc77126..e9690ad 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -61,6 +61,7 @@ + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 15c81c7..2b26139 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -1,7 +1,7 @@ Public Class PageVersionExport Private CurrentVersion As McVersion = PageVersionLeft.Version - Private Type As ModpackType = ModpackType.Compressed + Private Type As ModpackType = ModpackType.Modrinth Private SelectedSaves As New List(Of Integer) Private ReadOnly Property Saves As List(Of String) Get @@ -18,22 +18,27 @@ End Sub #Region "控件事件" + Private Function IncludePCL() As Boolean + Return True + End Function Private Sub ComboExportType_Change(sender As ComboBox, e As SelectionChangedEventArgs) Handles ComboExportType.SelectionChanged If AniControlEnabled <> 0 Then Exit Sub - Type = If(sender.SelectedIndex = 0, ModpackType.Compressed, ModpackType.Modrinth) + Type = sender.SelectedIndex Select Case Type Case ModpackType.Modrinth - If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Collapsed - If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Visible - Case ModpackType.Compressed - If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Visible - If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Collapsed + If IncludePCL() Then 'TODO:修改这里的条件 + If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Visible + If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Collapsed + Else + If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Collapsed + If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Visible + End If End Select CardExport.TriggerForceResize() End Sub Private Sub BtnExportExport_Click() Handles BtnExportExport.Click - If Type = ModpackType.Compressed AndAlso Val(VersionBranchCode) <> 50 Then + If IncludePCL() AndAlso Val(VersionBranchCode) <> 50 Then If MyMsgBox("你当前的 PCL 不是正式版,有二次分发(制作压缩包)的限制。" & vbCrLf & "请使用正式版再次尝试该操作!" & vbCrLf & "其他类型的整合包(例如 Modrinth 整合包)没有该限制。", Button1:="下载正式版", Button2:="取消") = 1 Then @@ -46,8 +51,7 @@ If(Type = ModpackType.Modrinth, "Modrinth 整合包(*.mrpack)|*.mrpack", "整合包文件(*.zip)|*.zip")) If String.IsNullOrEmpty(savePath) Then Exit Sub ModpackExport(New ExportOptions(CurrentVersion, savePath, Type, {TbExportSave.Text}, - PCLSetupGlobal:=CheckExportGlobal.Checked, - PCLSetupVer:=CheckExportVersion.Checked, Name:=TbExportName.Text, + PCLSetupGlobal:=CheckExportGlobal.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text)) End Sub From 13d0cb725ed135ace49564fdb99190739e0f0f36 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Mon, 15 Jul 2024 08:21:15 +0800 Subject: [PATCH 22/47] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 13 ++-- .../Pages/PageVersion/PageVersionExport.xaml | 50 +++++++------- .../PageVersion/PageVersionExport.xaml.vb | 69 ++++++++++--------- 3 files changed, 70 insertions(+), 62 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index cfa67aa..b4c93c3 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -919,12 +919,13 @@ Retry: ''' Public Sub ModpackExport(Options As ExportOptions) Hint("正在导出……") - RunInNewThread(Sub() - If ModpackExportBlocking(Options) Then - Hint("导出成功!", HintType.Finish) - OpenExplorer($"""{GetPathFromFullPath(Options.Dest)}""") - End If - End Sub, "Modpack Export") + RunInNewThread( + Sub() + If ModpackExportBlocking(Options) Then + Hint("导出成功!", HintType.Finish) + OpenExplorer($"""{GetPathFromFullPath(Options.Dest)}""") + End If + End Sub, "Modpack Export") End Sub Private Function ModpackExportBlocking(Options As ExportOptions) As Boolean If Options.IncludePCL Then diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index b03f78d..b9210f1 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -9,8 +9,8 @@ - - + + @@ -33,11 +33,10 @@ - + - @@ -54,14 +53,12 @@ - - - + @@ -77,31 +74,36 @@ + - - + + + - - - - - + ToolTip="options.txt 文件" /> + + + + + + + - - + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index d7fa6c0..1ef3932 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -1,42 +1,53 @@ Public Class PageVersionExport + Private Sub PageVersionExport_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded + TbExportName.HintText = PageVersionLeft.Version.Name + Reload() + End Sub + + Public ItemVersion As MyListItem + Public Sub Reload() + PanDisplayItem.Children.Clear() + ItemVersion = PageSelectRight.McVersionListItem(PageVersionLeft.Version) + ItemVersion.IsHitTestVisible = False + PanDisplayItem.Children.Add(ItemVersion) + End Sub - Private CurrentVersion As McVersion = PageVersionLeft.Version Private Type As ModpackType = ModpackType.Modrinth Private SelectedSaves As New List(Of Integer) Private ReadOnly Property Saves As List(Of String) Get - If Directory.Exists(CurrentVersion.Path & "saves\") Then - Return Directory.EnumerateDirectories(CurrentVersion.Path & "saves\").ToList + If Directory.Exists(PageVersionLeft.Version.Path & "saves\") Then + Return Directory.EnumerateDirectories(PageVersionLeft.Version.Path & "saves\").ToList End If Return New List(Of String) End Get End Property - Private Sub PageVersionExport_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded - CurrentVersion = PageVersionLeft.Version '各个版本不同,每次都需要重新加载 - TbExportName.HintText = CurrentVersion.Name +#Region "整合包信息 & 预览栏" + Private Sub TbExportName_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportName.TextChanged + ItemVersion.Title = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Name, sender.Text) End Sub +#End Region -#Region "控件事件" +#Region "导出" Private Function IncludePCL() As Boolean Return True End Function - Private Sub ComboExportType_Change(sender As ComboBox, e As SelectionChangedEventArgs) Handles ComboExportType.SelectionChanged - If AniControlEnabled <> 0 Then Exit Sub - Type = sender.SelectedIndex - Select Case Type - Case ModpackType.Modrinth - If IncludePCL() Then 'TODO:修改这里的条件 - If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Visible - If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Collapsed - Else - If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Collapsed - If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Visible - End If - End Select - CardExport.TriggerForceResize() - End Sub - If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Visible + 'Private Sub ComboExportType_Change(sender As ComboBox, e As SelectionChangedEventArgs) Handles ComboExportType.SelectionChanged + ' If AniControlEnabled <> 0 Then Exit Sub + ' Type = sender.SelectedIndex + ' Select Case Type + ' Case ModpackType.Modrinth + ' If IncludePCL() Then 'TODO:修改这里的条件 + ' If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Visible + ' If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Collapsed + ' Else + ' If GridCompressed IsNot Nothing Then GridCompressed.Visibility = Visibility.Collapsed + ' If GridModrinth IsNot Nothing Then GridModrinth.Visibility = Visibility.Visible + ' End If + ' End Select + ' CardExport.TriggerForceResize() + 'End Sub Private Sub BtnExportExport_Click() Handles BtnExportExport.Click If IncludePCL() AndAlso Val(VersionBranchCode) <> 50 Then If MyMsgBox("你当前的 PCL 不是正式版,有二次分发(制作压缩包)的限制。" & vbCrLf & @@ -47,17 +58,11 @@ Exit Sub End If Dim savePath As String = SelectAs( - "选择导出位置", $"整合包 - {If(String.IsNullOrWhiteSpace(TbExportName.Text), CurrentVersion.Name, TbExportName.Text)}" & If(Type = ModpackType.Modrinth, ".mrpack", ".zip"), + "选择导出位置", $"整合包 - {If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text)}" & If(Type = ModpackType.Modrinth, ".mrpack", ".zip"), If(Type = ModpackType.Modrinth, "Modrinth 整合包(*.mrpack)|*.mrpack", "整合包文件(*.zip)|*.zip")) If String.IsNullOrEmpty(savePath) Then Exit Sub - ModpackExport(New ExportOptions(CurrentVersion, savePath, Type, {TbExportSave.Text}, - PCLSetupGlobal:=CheckExportGlobal.Checked, Name:=TbExportName.Text, - VerID:=TbExportVersion.Text)) - End Sub - ModpackExport(New ExportOptions(CurrentVersion, savePath, Type, {TbExportSave.Text}, - PCLSetupGlobal:=CheckExportGlobal.Checked, - PCLSetupVer:=CheckExportVersion.Checked, Name:=TbExportName.Text, - VerID:=TbExportVersion.Text)) + ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, Type, {}, 'TODO:改成要保留的文件列表 + Name:=TbExportName.Text, VerID:=TbExportVersion.Text)) End Sub #End Region From aacaf792ef4f1baaad560f6437c1a85296c97e89 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Mon, 15 Jul 2024 22:29:29 +0800 Subject: [PATCH 23/47] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E8=AE=BE=E7=BD=AE=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml | 4 +- .../PageVersion/PageVersionExport.xaml.vb | 42 ++++++++++++++++++- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index b9210f1..0d6a627 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -33,10 +33,10 @@ - + - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 1ef3932..213debc 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -1,4 +1,6 @@ -Public Class PageVersionExport +Imports System.Runtime.CompilerServices + +Public Class PageVersionExport Private Sub PageVersionExport_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded TbExportName.HintText = PageVersionLeft.Version.Name Reload() @@ -6,10 +8,18 @@ Public ItemVersion As MyListItem Public Sub Reload() + AniControlEnabled += 1 + PanDisplayItem.Children.Clear() - ItemVersion = PageSelectRight.McVersionListItem(PageVersionLeft.Version) + ItemVersion = PageSelectRight.McVersionListItem(PageVersionLeft.Version.Load()) ItemVersion.IsHitTestVisible = False + If Not String.IsNullOrEmpty(CustomLogo) Then + ItemVersion.Logo = CustomLogo + End If PanDisplayItem.Children.Add(ItemVersion) + ItemVersion.Title = If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text) + + AniControlEnabled -= 1 End Sub Private Type As ModpackType = ModpackType.Modrinth @@ -27,6 +37,34 @@ Private Sub TbExportName_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportName.TextChanged ItemVersion.Title = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Name, sender.Text) End Sub + + Private CustomLogoVal As String + ''' + ''' 自定义 Logo 的路径。 + ''' + Public Property CustomLogo() As String + Get + Return CustomLogoVal + End Get + Set(value As String) + If AniControlEnabled <> 0 Then Exit Property + CustomLogoVal = value + ItemVersion.Logo = value + Reload() + End Set + End Property + + Private Sub ComboDisplayLogo_SelectionChanged(sender As MyComboBox, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged + If Not AniControlEnabled = 0 Then Exit Sub + '选择 自定义 时修改图片 + If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then + Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片") + If String.IsNullOrWhiteSpace(FileName) Then Exit Sub + CustomLogo = FileName + Else + CustomLogo = sender.SelectedItem.Tag + End If + End Sub #End Region #Region "导出" From 4547b81d68764ccbbbd25c17ae8eb078b5ac4501 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 16 Jul 2024 13:18:41 +0800 Subject: [PATCH 24/47] =?UTF-8?q?:construction:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=95=B4=E5=90=88=E5=8C=85=E6=8F=8F=E8=BF=B0=E7=9A=84=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 13 +++++++++---- .../Pages/PageVersion/PageVersionExport.xaml | 15 ++++++++------- .../Pages/PageVersion/PageVersionExport.xaml.vb | 11 +++++++---- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index b4c93c3..a7e61cb 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -886,15 +886,19 @@ Retry: ''' Public Remain As String() ''' - ''' 是否需要保留 PCL 全局设置。仅在压缩包中有效。 + ''' 是否需要保留 PCL 全局设置。仅在包括 PCL 时有效。 ''' Public PCLSetupGlobal As Boolean = True ''' - ''' 整合包名称。仅在 Modrinth 有效。 + ''' 整合包名称。 ''' Public Name As String = "" ''' - ''' 版本号。仅在 Modrinth 有效。 + ''' 整合包描述。 + ''' + Public Desc As String = "" + ''' + ''' 版本号。 ''' Public VerID As String = "" Public Sub New(Version As McVersion, @@ -903,7 +907,7 @@ Retry: Remain As String(), Optional PCLSetupGlobal As Boolean = True, Optional Name As String = "", - Optional Author As String = "", + Optional Desc As String = "", Optional VerID As String = "") Me.Version = Version Me.Dest = Dest @@ -911,6 +915,7 @@ Retry: Me.Remain = Remain Me.PCLSetupGlobal = PCLSetupGlobal Me.Name = Name + Me.Desc = Desc Me.VerID = VerID End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 0d6a627..3c5edc7 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -28,14 +28,15 @@ - + - - - + + + + + - @@ -50,8 +51,8 @@ - - + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 213debc..aecd7b9 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -1,8 +1,5 @@ -Imports System.Runtime.CompilerServices - -Public Class PageVersionExport +Public Class PageVersionExport Private Sub PageVersionExport_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded - TbExportName.HintText = PageVersionLeft.Version.Name Reload() End Sub @@ -10,6 +7,8 @@ Public Class PageVersionExport Public Sub Reload() AniControlEnabled += 1 + TbExportName.HintText = PageVersionLeft.Version.Name + TbExportDesc.HintText = PageVersionLeft.Version.Info PanDisplayItem.Children.Clear() ItemVersion = PageSelectRight.McVersionListItem(PageVersionLeft.Version.Load()) ItemVersion.IsHitTestVisible = False @@ -38,6 +37,10 @@ Public Class PageVersionExport ItemVersion.Title = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Name, sender.Text) End Sub + Private Sub TbExportDesc_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportDesc.TextChanged + ItemVersion.Info = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Info, sender.Text) + End Sub + Private CustomLogoVal As String ''' ''' 自定义 Logo 的路径。 From 3bd39de7289fd725c6a5cb4f6fb60516f35da121 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 18 Jul 2024 13:09:17 +0800 Subject: [PATCH 25/47] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E6=95=B4?= =?UTF-8?q?=E5=90=88=E5=8C=85=E6=8F=8F=E8=BF=B0=20Reload=20=E6=97=B6?= =?UTF-8?q?=E8=A2=AB=E8=A6=86=E7=9B=96=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml.vb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index aecd7b9..004577c 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -12,11 +12,10 @@ PanDisplayItem.Children.Clear() ItemVersion = PageSelectRight.McVersionListItem(PageVersionLeft.Version.Load()) ItemVersion.IsHitTestVisible = False - If Not String.IsNullOrEmpty(CustomLogo) Then - ItemVersion.Logo = CustomLogo - End If + If Not String.IsNullOrEmpty(CustomLogo) Then ItemVersion.Logo = CustomLogo PanDisplayItem.Children.Add(ItemVersion) ItemVersion.Title = If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text) + ItemVersion.Info = If(String.IsNullOrWhiteSpace(TbExportDesc.Text), PageVersionLeft.Version.Info, TbExportDesc.Text) AniControlEnabled -= 1 End Sub From 898f53428f52631530d039895bc9830456134149 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 18 Jul 2024 13:33:12 +0800 Subject: [PATCH 26/47] =?UTF-8?q?:children=5Fcrossing:=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=B8=80=E4=BA=9B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: luolinlin768 --- .../Pages/PageVersion/PageVersionExport.xaml | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 3c5edc7..d19b9c4 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -9,8 +9,15 @@ - - + + + + + + + + @@ -28,12 +35,12 @@ - + - - + + @@ -51,8 +58,8 @@ - - + + @@ -64,9 +71,9 @@ - - + + @@ -99,7 +106,7 @@ ToolTip="将 PCL 全局配置包含在整合包内" /> - + From de9afd3ece836d15ba3f6ae2354f0656de90122a Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Fri, 19 Jul 2024 22:46:09 +0800 Subject: [PATCH 27/47] =?UTF-8?q?:construction:=20UI=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=EF=BC=88=E6=9C=AA=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 81 +++++++------------ .../Pages/PageVersion/PageVersionExport.xaml | 35 ++++---- .../PageVersion/PageVersionExport.xaml.vb | 81 +++++++++++++++---- 3 files changed, 111 insertions(+), 86 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index a7e61cb..7e2e56e 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -884,7 +884,7 @@ Retry: ''' ''' 要保留到整合包的文件。 ''' - Public Remain As String() + Public Additional As String() ''' ''' 是否需要保留 PCL 全局设置。仅在包括 PCL 时有效。 ''' @@ -904,7 +904,7 @@ Retry: Public Sub New(Version As McVersion, Dest As String, IncludePCL As Boolean, - Remain As String(), + Additional As String(), Optional PCLSetupGlobal As Boolean = True, Optional Name As String = "", Optional Desc As String = "", @@ -912,7 +912,7 @@ Retry: Me.Version = Version Me.Dest = Dest Me.IncludePCL = IncludePCL - Me.Remain = Remain + Me.Additional = Additional Me.PCLSetupGlobal = PCLSetupGlobal Me.Name = Name Me.Desc = Desc @@ -934,9 +934,9 @@ Retry: End Sub Private Function ModpackExportBlocking(Options As ExportOptions) As Boolean If Options.IncludePCL Then - Return ExportCompressed(Options.Version, Options.Dest, Options.Remain, Options.PCLSetupGlobal) + Return ExportCompressed(Options.Version, Options.Dest, Options.Additional, Options.Name, Options.VerID, Options.PCLSetupGlobal) End If - Return ExportModrinth(Options.Version, Options.Dest, Options.Remain, Options.Name, Options.VerID) + Return ExportModrinth(Options.Version, Options.Dest, Options.Additional, Options.Name, Options.VerID) End Function #Region "冗余" @@ -954,7 +954,7 @@ Retry: ".*\.BakaCoreInfo", 'BakaXL 配置 "hmclversion\.cfg", "log4j2\.xml" 'HMCL 配置 } - Private Function IsVerRedundant(FilePath As String) As Boolean + Public Function IsVerRedundant(FilePath As String) As Boolean For Each regex In VersionRedundant If RegexCheck(GetFileNameFromPath(FilePath).ToLower(), regex) Then Return True If FilePath.Replace("/", "\").EndsWithF("\journeymap\data\") OrElse @@ -967,9 +967,9 @@ Retry: #End Region #Region "不同类型整合包的导出方法" - Private Function ExportModrinth(Version As McVersion, DestPath As String, Saves As String(), Name As String, VerID As String) + Private Function ExportModrinth(Version As McVersion, DestPath As String, Additional As String(), Name As String, VerID As String) As Boolean Try - Log($"[Export] 导出整合包(Modrinth):{Version.Path} -> {DestPath},导出存档 {If(Saves Is Nothing OrElse Not Saves.Any, "不导出", Saves.Join(", "))}") + Log($"[Export] 导出整合包(Modrinth):{Version.Path} -> {DestPath},额外版本文件 {If(Additional Is Nothing OrElse Not Additional.Any, "不导出", Additional.Join(", "))}") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" Log($"[Export] 缓存文件夹:{tempDir}") Directory.CreateDirectory(tempDir) @@ -1035,11 +1035,15 @@ Retry: CopyFile(m, tempDir & "overrides\" & GetFileNameFromPath(m)) Next - '存档 - For Each s In Saves - If String.IsNullOrWhiteSpace(s) Then Continue For '草了,传空字串进去会直接把 saves 整个文件夹拷过去 - Dim fromPath As String = $"{Version.Path}saves\{s}" - If Directory.Exists(fromPath) Then CopyDirectory(fromPath, $"{tempDir}overrides\saves\{s}") + '额外文件 + For Each p In Additional + If String.IsNullOrWhiteSpace(p) Then Continue For '传空字串进去会直接把整个版本文件夹拷过去 + Dim fromPath As String = $"{Version.Path}{p}" + If Directory.Exists(fromPath) Then + CopyDirectory(fromPath, $"{tempDir}overrides\{p}") + ElseIf File.Exists(fromPath) Then + CopyFile(fromPath, $"{tempDir}overrides\{p}") + End If Next If File.Exists(DestPath) Then File.Delete(DestPath) '选择文件的时候已经确认了要替换 @@ -1051,52 +1055,23 @@ Retry: Return False End Try End Function - Private Function ExportCompressed(Version As McVersion, DestPath As String, Saves As String(), PCLSetupGlobal As Boolean) + Private Function ExportCompressed(Version As McVersion, DestPath As String, Additional As String(), Name As String, VerID As String, PCLSetupGlobal As Boolean) As Boolean Try - Log($"[Export] 导出整合包(压缩包):{Version.Path} -> {DestPath},导出存档 {If(Saves Is Nothing OrElse Not Saves.Any, "不导出", Saves.Join(", "))},全局设置 {If(PCLSetupGlobal, "导出", "不导出")}") + Log($"[Export] 导出整合包(含启动器):{Version.Path} -> {DestPath},额外版本文件 {If(Additional Is Nothing OrElse Not Additional.Any, "不导出", Additional.Join(", "))},全局设置 {If(PCLSetupGlobal, "导出", "不导出")}") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" - Log($"[Export] 缓存文件夹:{tempDir}") + Log($"[Export] 最终压缩包的缓存文件夹:{tempDir}") Directory.CreateDirectory(tempDir) - Dim tempVerPath As String = $"{tempDir}{Version.Path.Replace(GetPathFromFullPath(Version.PathIndie), "")}" - For Each f In Directory.EnumerateFiles(Version.Path) - If Not IsVerRedundant(GetFileNameFromPath(f)) Then - Log($"[Export] 复制版本文件:{f} -> {tempVerPath}{GetFileNameFromPath(f)}") - CopyFile(f, tempVerPath & GetFileNameFromPath(f)) - End If - Next - For Each d In Directory.EnumerateDirectories(Version.Path) - If Not IsVerRedundant(GetFolderNameFromPath(d)) Then - Log($"[Export] 复制版本文件夹:{d} -> {tempVerPath}{GetFolderNameFromPath(d)}\") - CopyDirectory(d, $"{tempVerPath}{GetFolderNameFromPath(d)}\") - End If - Next - - If Saves IsNot Nothing Then - For Each s In Saves - Dim saveFullPath As String = $"{Version.Path}saves\{s}" - If Not Directory.Exists(saveFullPath) Then Continue For - Log($"[Export] 复制存档文件夹:{saveFullPath} -> {tempVerPath}saves\{s}") - CopyDirectory(saveFullPath, $"{tempVerPath}saves\{s}") - Next - End If - - If PCLSetupGlobal Then - Log($"[Export] 正在复制 PCL 全局设置") - If File.Exists(Path & "PCL\Setup.ini") Then CopyFile("PCL\Setup.ini", tempDir & "PCL\Setup.ini") - If File.Exists(Path & "PCL\Custom.xaml") Then CopyFile("PCL\Custom.xaml", tempDir & "PCL\Custom.xaml") - If Directory.Exists(Path & "PCL\Pictures") Then CopyDirectory(Path & "PCL\Pictures", tempDir & "PCL\Pictures") - If Directory.Exists(Path & "PCL\Musics") Then CopyDirectory(Path & "PCL\Musics", tempDir & "PCL\Musics") - End If - - If Directory.Exists($"{Version.PathIndie}libraries\optifine") Then '#114 OptiFine Libraries 缺失造成补全文件失败 - Log($"[Export] 正在复制 OptiFine Libraries") - CopyDirectory($"{Version.PathIndie}libraries\optifine", - $"{tempDir}{GetFolderNameFromPath(Version.PathIndie)}libraries\optifine") - End If + Log("[Export] 开始导出 Modrinth 整合包") + ExportModrinth(Version, $"{tempDir}modpack.mrpack", Additional, Name, VerID) Log($"[Export] 正在复制 PCL 本体") - CopyFile(PathWithName, tempDir & GetFileNameFromPath(PathWithName)) 'PCL 本体 + CopyFile(PathWithName, tempDir & GetFileNameFromPath(PathWithName)) + + If PCLSetupGlobal Then + Log($"[Export] 正在复制 PCL 全局配置") + CopyFile(Path & "PCL\Setup.ini", tempDir & "PCL\Setup.ini") + End If If File.Exists(DestPath) Then File.Delete(DestPath) '选择文件的时候已经确认了要替换 ZipFile.CreateFromDirectory(tempDir, DestPath) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index d19b9c4..f912938 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -35,7 +35,7 @@ - + @@ -59,15 +59,16 @@ - + - - + + + @@ -87,31 +88,33 @@ + Tag="server.dat" ToolTip="server.dat 文件" /> + Tag="config" ToolTip="config 文件夹" /> + Tag="options.txt" ToolTip="options.txt 文件" /> + Tag="saves" ToolTip="saves 文件夹" /> + Tag="resources" ToolTip="resourcepacks 文件夹" /> + Tag="shaderpacks" ToolTip="shaderpacks 文件夹" /> - - + + - - + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 004577c..e3c25e1 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -4,6 +4,7 @@ End Sub Public ItemVersion As MyListItem + Private SelectedEntries As New List(Of String) Public Sub Reload() AniControlEnabled += 1 @@ -16,12 +17,56 @@ PanDisplayItem.Children.Add(ItemVersion) ItemVersion.Title = If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text) ItemVersion.Info = If(String.IsNullOrWhiteSpace(TbExportDesc.Text), PageVersionLeft.Version.Info, TbExportDesc.Text) +#If BETA Then + CheckIncludePCL.IsEnabled = True +#Else + CheckIncludePCL.IsEnabled = False + TbHint.Text = "你可以在此勾选需要包含进整合包的文件或文件夹,其他文件或文件夹在高级选项添加。" & vbCrLf & "你当前的 PCL 不是正式版,有二次分发的限制,因此不能选择是否包含 PCL 程序。" +#End If + CheckIncludeSetup.IsEnabled = CheckIncludePCL.IsEnabled + ReloadFileList() AniControlEnabled -= 1 End Sub + Private Sub ReloadFileList() + Dim tb As TextBlock = PanFileList.Children(0) + PanFileList.Children.Clear() + PanFileList.Children.Add(tb) - Private Type As ModpackType = ModpackType.Modrinth - Private SelectedSaves As New List(Of Integer) + For Each d In Directory.EnumerateDirectories(PageVersionLeft.Version.Path) + If Directory.EnumerateFileSystemEntries(d).Count = 0 Then Continue For + d = GetFolderNameFromPath(d) + If IsVerRedundant(d) Then Continue For + Dim title As String = "" + Dim listItem As New MyListItem + If Titles.TryGetValue(d, title) Then 'title 作为引用类型传入 + listItem.Title = title + listItem.Info = d + Else + listItem.Title = d + End If + '图标按钮 + Dim btnSwap As New MyIconButton + btnSwap.Path = New Shapes.Path With {.HorizontalAlignment = HorizontalAlignment.Right, .Stretch = Stretch.Uniform, .Height = 6, .Width = 10, .VerticalAlignment = VerticalAlignment.Top, .Margin = New Thickness(0, 17, 16, 0), .Data = New GeometryConverter().ConvertFromString("M2,4 l-2,2 10,10 10,-10 -2,-2 -8,8 -8,-8 z"), .RenderTransform = New RotateTransform(180), .RenderTransformOrigin = New Point(0.5, 0.5)} + AddHandler btnSwap.Click, AddressOf BtnSwap_Click + listItem.Buttons = {btnSwap} + listItem.Type = MyListItem.CheckType.CheckBox + listItem.Height = 35 + listItem.Logo = Logo.IconButtonOpen + PanFileList.Children.Add(listItem) + Next + End Sub + Private Titles As New Dictionary(Of String, String) From { + {"saves", "存档"}, + {"resourcepacks", "资源包"}, + {"config", "Mod 配置"}, + {"shaderpacks", "光影包"}, + {"options.txt", "游戏配置"}, + {"servers.dat", "服务器列表"} + } + Private Sub BtnSwap_Click(sender As MyIconButton, e As Object) + MsgBox("测试") 'TODO:处理展开操作 + End Sub Private ReadOnly Property Saves As List(Of String) Get If Directory.Exists(PageVersionLeft.Version.Path & "saves\") Then @@ -69,10 +114,13 @@ End Sub #End Region +#Region "基本信息" + Private Sub CheckIncludePCL_Change(sender As Object, user As Boolean) Handles CheckIncludePCL.Change + CheckIncludeSetup.IsEnabled = CheckIncludePCL.IsEnabled + End Sub +#End Region + #Region "导出" - Private Function IncludePCL() As Boolean - Return True - End Function 'Private Sub ComboExportType_Change(sender As ComboBox, e As SelectionChangedEventArgs) Handles ComboExportType.SelectionChanged ' If AniControlEnabled <> 0 Then Exit Sub ' Type = sender.SelectedIndex @@ -89,20 +137,19 @@ ' CardExport.TriggerForceResize() 'End Sub Private Sub BtnExportExport_Click() Handles BtnExportExport.Click - If IncludePCL() AndAlso Val(VersionBranchCode) <> 50 Then - If MyMsgBox("你当前的 PCL 不是正式版,有二次分发(制作压缩包)的限制。" & vbCrLf & - "请使用正式版再次尝试该操作!" & vbCrLf & - "其他类型的整合包(例如 Modrinth 整合包)没有该限制。", Button1:="下载正式版", Button2:="取消") = 1 Then - OpenWebsite("https://afdian.net/p/0164034c016c11ebafcb52540025c377") - End If - Exit Sub - End If + '获取需要包含的文件夹 + Dim contains As New List(Of String) + For Each c In PanFiles.Children + If TypeOf c IsNot MyCheckBox Then Continue For + If String.IsNullOrEmpty(c.Tag) Then Continue For + contains.Add(c.Tag) + Next Dim savePath As String = SelectAs( - "选择导出位置", $"整合包 - {If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text)}" & If(Type = ModpackType.Modrinth, ".mrpack", ".zip"), - If(Type = ModpackType.Modrinth, "Modrinth 整合包(*.mrpack)|*.mrpack", "整合包文件(*.zip)|*.zip")) + "选择导出位置", $"整合包 - {If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text)}" & If(CheckIncludePCL.Checked, ".zip", ".mrpack"), + If(CheckIncludePCL.Checked, "整合包文件(*.zip)|*.zip", "Modrinth 整合包(*.mrpack)|*.mrpack")) If String.IsNullOrEmpty(savePath) Then Exit Sub - ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, Type, {}, 'TODO:改成要保留的文件列表 - Name:=TbExportName.Text, VerID:=TbExportVersion.Text)) + ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, {}, 'TODO:改成要保留的文件列表 + PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text)) End Sub #End Region From 3d18a5acc513813e37ee82796562e43c14ebad10 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Sun, 21 Jul 2024 22:18:48 +0800 Subject: [PATCH 28/47] =?UTF-8?q?:construction:=20UI=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=EF=BC=88=E6=9C=AA=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Base/ModBase.vb | 4 + .../Modules/Base/ModValidate.vb | 11 +- .../Modules/Minecraft/ModModpack.vb | 11 +- .../Pages/PageVersion/PageVersionExport.xaml | 14 +- .../PageVersion/PageVersionExport.xaml.vb | 170 +++++++++++++++--- 5 files changed, 176 insertions(+), 34 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 89f1887..4e3d9bb 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -178,6 +178,10 @@ Public Module ModBase ''' Public Const IconButtonOffline As String = "M533.293176 788.841412a60.235294 60.235294 0 1 1 85.202824 85.202823l-42.616471 42.586353c-129.355294 129.385412-339.124706 129.385412-468.510117 0-129.385412-129.385412-129.385412-339.124706 0-468.510117l42.586353-42.616471a60.235294 60.235294 0 1 1 85.202823 85.202824l-42.61647 42.586352a210.823529 210.823529 0 1 0 298.164706 298.164706l42.586352-42.61647z m255.548236-255.548236l42.61647-42.586352a210.823529 210.823529 0 1 0-298.164706-298.164706l-42.586352 42.61647a60.235294 60.235294 0 1 1-85.202824-85.202823l42.616471-42.586353c129.355294-129.385412 339.124706-129.385412 468.510117 0 129.385412 129.385412 129.385412 339.124706 0 468.510117l-42.586353 42.616471a60.235294 60.235294 0 1 1-85.202823-85.202824zM192.542118 192.542118a60.235294 60.235294 0 0 1 85.202823 0l553.712941 553.712941a60.235294 60.235294 0 0 1-85.202823 85.202823L192.542118 277.744941a60.235294 60.235294 0 0 1 0-85.202823z" ''' + ''' 图标,向右箭头,1x + ''' + Public Const IconButtonRight As String = "M757.792745 435.407215L419.597482 96.904967c-40.010393-40.010393-104.886579-40.010393-144.896972 0-40.010393 40.010393-40.010393 104.988908 0 144.9993L540.344959 507.855701 274.70051 773.807135c-40.010393 40.112721-40.010393 104.988908 0 144.9993 40.010393 40.010393 104.886579 40.010393 144.896972 0l338.092935-338.39992c40.112721-40.010393 40.112721-104.988908 0.102328-144.9993z" + ''' ''' 图标,音符,1x ''' Public Const IconMusic As String = "M348.293565 716.53287V254.797913c0-41.672348 28.004174-78.358261 68.919652-90.37913L815.994435 40.826435c62.775652-18.610087 125.907478 26.579478 125.907478 89.933913v539.158261c8.013913 42.25113-8.94887 89.177043-47.014956 127.109565a232.848696 232.848696 0 0 1-170.785392 65.758609c-61.885217-2.938435-111.081739-33.435826-129.113043-80.050087-18.031304-46.614261-2.137043-102.177391 41.672348-145.853218a232.848696 232.848696 0 0 1 170.785391-65.80313c21.014261 1.024 40.514783 5.164522 57.878261 12.065391V233.338435c0-12.109913-10.551652-20.034783-20.569044-20.034783a24.620522 24.620522 0 0 0-5.787826 0.934957L439.785739 338.18713a19.545043 19.545043 0 0 0-14.825739 19.144348v438.984348H423.846957c11.53113 43.987478-5.164522 94.208-45.412174 134.322087a232.848696 232.848696 0 0 1-170.785392 65.758609c-61.885217-2.938435-111.081739-33.435826-129.113043-80.050087-18.031304-46.614261-2.137043-102.177391 41.672348-145.853218a232.848696 232.848696 0 0 1 170.785391-65.80313c20.791652 1.024 40.069565 5.075478 57.299478 11.842783z" diff --git a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb index b7f818b..c9b6aa0 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb @@ -260,6 +260,7 @@ Public Class ValidateFileName Public Property IgnoreCase As Boolean = True Public Property ParentFolder As String = Nothing Public Property RequireParentFolderExists = True + Public Property AllowNull As Boolean = False Public Sub New() End Sub Public Sub New(Name As String, Optional UseMinecraftCharCheck As Boolean = True, Optional IgnoreCase As Boolean = True) @@ -269,14 +270,16 @@ Public Class ValidateFileName End Sub Public Overrides Function Validate(Str As String) As String Try - '检查是否为空 - Dim LengthCheck As String = New ValidateNullOrWhiteSpace().Validate(Str) - If Not LengthCheck = "" Then Return LengthCheck + If Not AllowNull Then + '检查是否为空 + Dim NullCheck As String = New ValidateNullOrWhiteSpace().Validate(Str) + If Not NullCheck = "" Then Return NullCheck + End If '检查空格 If Str.StartsWithF(" ") Then Return "文件名不能以空格开头!" If Str.EndsWithF(" ") Then Return "文件名不能以空格结尾!" '检查长度 - LengthCheck = New ValidateLength(1, 253).Validate(Str & If(ParentFolder, "")) + Dim LengthCheck = New ValidateLength(If(AllowNull, 0, 1), 253).Validate(Str & If(ParentFolder, "")) If Not LengthCheck = "" Then Return LengthCheck '检查尾部小数点 If Str.EndsWithF(".") Then Return "文件名不能以小数点结尾!" diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 7e2e56e..2fa0141 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -956,7 +956,7 @@ Retry: } Public Function IsVerRedundant(FilePath As String) As Boolean For Each regex In VersionRedundant - If RegexCheck(GetFileNameFromPath(FilePath).ToLower(), regex) Then Return True + If RegexCheck(GetFileNameFromPath(FilePath), regex, RegularExpressions.RegexOptions.IgnoreCase) Then Return True If FilePath.Replace("/", "\").EndsWithF("\journeymap\data\") OrElse FilePath.Replace("/", "\").EndsWithF("\journeymap\data") Then Return True @@ -964,6 +964,15 @@ Retry: Next Return False End Function + Private MustExport As String() = { + "mods", "PCL", ".*\.json" + } + Public Function IsMustExport(FileName As String) As Boolean + For Each regex In MustExport + If RegexCheck(FileName, regex, RegularExpressions.RegexOptions.IgnoreCase) Then Return True + Next + Return False + End Function #End Region #Region "不同类型整合包的导出方法" diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index f912938..f0786e2 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -38,7 +38,11 @@ - + + + + + @@ -68,7 +72,7 @@ - + @@ -88,7 +92,7 @@ + Tag="servers.dat" ToolTip="servers.dat 文件" /> - + - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index e3c25e1..708a09b 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -1,13 +1,19 @@ Public Class PageVersionExport + Private CurrentVer As String = "" Private Sub PageVersionExport_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded Reload() End Sub Public ItemVersion As MyListItem - Private SelectedEntries As New List(Of String) Public Sub Reload() AniControlEnabled += 1 + If CurrentVer <> PageVersionLeft.Version.Path Then + '说明切换到另一个版本了,所有的绝对路径都要重置,否则爆炸 + CurrentPath = "" + Selected = New List(Of String) + CurrentVer = PageVersionLeft.Version.Path + End If TbExportName.HintText = PageVersionLeft.Version.Name TbExportDesc.HintText = PageVersionLeft.Version.Info PanDisplayItem.Children.Clear() @@ -21,22 +27,37 @@ CheckIncludePCL.IsEnabled = True #Else CheckIncludePCL.IsEnabled = False - TbHint.Text = "你可以在此勾选需要包含进整合包的文件或文件夹,其他文件或文件夹在高级选项添加。" & vbCrLf & "你当前的 PCL 不是正式版,有二次分发的限制,因此不能选择是否包含 PCL 程序。" + TbHint.Text = "你可以在此勾选需要包含进整合包的文件或文件夹,其他文件或文件夹在高级选项添加。" & vbCrLf & "你当前的 PCL 不是正式版,有二次分发的限制,因此整合包不能包含 PCL 程序。" #End If CheckIncludeSetup.IsEnabled = CheckIncludePCL.IsEnabled - ReloadFileList() + ReloadFileList(CurrentPath) AniControlEnabled -= 1 End Sub - Private Sub ReloadFileList() + +#Region "文件列表" + ''' + ''' 当前所在的文件夹。注意是绝对路径!以 \ 结尾。 + ''' + Private CurrentPath As String = "" + Private Sub ReloadFileList(Optional NewPath As String = "") + If String.IsNullOrWhiteSpace(NewPath) Then NewPath = PageVersionLeft.Version.Path Dim tb As TextBlock = PanFileList.Children(0) PanFileList.Children.Clear() PanFileList.Children.Add(tb) - For Each d In Directory.EnumerateDirectories(PageVersionLeft.Version.Path) + If NewPath <> PageVersionLeft.Version.Path Then + Dim listItem As New MyListItem With {.Title = "返回上一级目录", .Tag = "..", .Height = 35, .Type = MyListItem.CheckType.Clickable} + AddHandler listItem.Click, AddressOf ListItem_Click + PanFileList.Children.Add(listItem) + End If + + Dim fileCount As Integer = 0 + + For Each d In Directory.EnumerateDirectories(NewPath) If Directory.EnumerateFileSystemEntries(d).Count = 0 Then Continue For d = GetFolderNameFromPath(d) - If IsVerRedundant(d) Then Continue For + If IsVerRedundant(NewPath & d) OrElse IsMustExport(d) Then Continue For Dim title As String = "" Dim listItem As New MyListItem If Titles.TryGetValue(d, title) Then 'title 作为引用类型传入 @@ -47,14 +68,44 @@ End If '图标按钮 Dim btnSwap As New MyIconButton - btnSwap.Path = New Shapes.Path With {.HorizontalAlignment = HorizontalAlignment.Right, .Stretch = Stretch.Uniform, .Height = 6, .Width = 10, .VerticalAlignment = VerticalAlignment.Top, .Margin = New Thickness(0, 17, 16, 0), .Data = New GeometryConverter().ConvertFromString("M2,4 l-2,2 10,10 10,-10 -2,-2 -8,8 -8,-8 z"), .RenderTransform = New RotateTransform(180), .RenderTransformOrigin = New Point(0.5, 0.5)} + btnSwap.Logo = Logo.IconButtonRight + btnSwap.LogoScale = 1.0 + btnSwap.Tag = d AddHandler btnSwap.Click, AddressOf BtnSwap_Click listItem.Buttons = {btnSwap} listItem.Type = MyListItem.CheckType.CheckBox listItem.Height = 35 listItem.Logo = Logo.IconButtonOpen + listItem.Tag = d & "\" + If IsSelected(NewPath & d & "\") Then listItem.Checked = True + AddHandler listItem.Click, AddressOf ListItem_Click PanFileList.Children.Add(listItem) + fileCount += 1 Next + + For Each f In Directory.EnumerateFiles(NewPath) + f = GetFileNameFromPath(f) + If IsVerRedundant(NewPath & f) OrElse IsMustExport(f) Then Continue For + Dim title As String = "" + Dim listItem As New MyListItem + If Titles.TryGetValue(f, title) Then 'title 作为引用类型传入 + listItem.Title = title + listItem.Info = f + Else + listItem.Title = f + End If + listItem.Info = (NewPath & f).Replace(GetPathFromFullPath(PageVersionLeft.Version.Path), "") + listItem.Type = MyListItem.CheckType.CheckBox + listItem.Height = 35 + listItem.Tag = f + If IsSelected(NewPath & f) Then listItem.Checked = True + AddHandler listItem.Click, AddressOf ListItem_Click + PanFileList.Children.Add(listItem) + fileCount += 1 + Next + + CurrentPath = NewPath + CardMore.Title = If(NewPath = PageVersionLeft.Version.Path, "高级选项", $"高级选项 ({NewPath.Replace(PageVersionLeft.Version.Path, "").TrimEnd("\")})") End Sub Private Titles As New Dictionary(Of String, String) From { {"saves", "存档"}, @@ -65,16 +116,86 @@ {"servers.dat", "服务器列表"} } Private Sub BtnSwap_Click(sender As MyIconButton, e As Object) - MsgBox("测试") 'TODO:处理展开操作 + Dim actualPath As String = CurrentPath & sender.Tag & "\" + 'Dim relative As String = actualPath.Replace(PageVersionLeft.Version.Path, "") + + If Not Directory.Exists(actualPath) Then + Hint($"找不到目录:{actualPath}", HintType.Critical) + Exit Sub + End If + ReloadFileList(actualPath) End Sub - Private ReadOnly Property Saves As List(Of String) - Get - If Directory.Exists(PageVersionLeft.Version.Path & "saves\") Then - Return Directory.EnumerateDirectories(PageVersionLeft.Version.Path & "saves\").ToList - End If - Return New List(Of String) - End Get - End Property + ''' + ''' 选中的文件列表,绝对路径。 + ''' + Private Selected As New List(Of String) + Private Sub SelectedChange(IsAdd As Boolean, TargetPath As String) + If File.Exists(TargetPath) Then + If IsAdd Then Selected.Add(TargetPath) Else Selected.Remove(TargetPath) + Exit Sub + End If + If Directory.Exists(TargetPath) Then + For Each d In Directory.EnumerateDirectories(TargetPath) + SelectedChange(IsAdd, d) + Next + For Each f In Directory.EnumerateFiles(TargetPath) + If IsAdd Then Selected.Add(f) Else Selected.Remove(f) + Next + End If + End Sub + Private Function IsSelected(TargetPath As String) As Boolean + If File.Exists(TargetPath) Then + Return Selected.Contains(TargetPath) + End If + If Directory.Exists(TargetPath) Then + Return Directory.EnumerateDirectories(TargetPath).All(Function(s) IsSelected(s)) AndAlso + Directory.EnumerateFiles(TargetPath).All(Function(s) Selected.Contains(s)) + End If + Return False + End Function + Private Sub ListItem_Click(sender As MyListItem, e As Object) + If sender.Tag = ".." Then '回到上一级目录 + ReloadFileList(GetPathFromFullPath(CurrentPath)) + Exit Sub + End If + SelectedChange(Not sender.Checked, '非常难绷的逻辑,很难描述清楚,自己打断点看 Checked 属性值吧…… + CurrentPath & sender.Tag) + End Sub + + 'Private ReadOnly Property Saves As List(Of String) + ' Get + ' If Directory.Exists(PageVersionLeft.Version.Path & "saves\") Then + ' Return Directory.EnumerateDirectories(PageVersionLeft.Version.Path & "saves\").ToList + ' End If + ' Return New List(Of String) + ' End Get + 'End Property + + '复选框与高级选项同步 + Private Sub PanCommonFiles_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanCommonFiles.MouseLeftButtonUp + For Each c In PanCommonFiles.Children + If TypeOf c IsNot MyCheckBox Then Continue For + If String.IsNullOrEmpty(c.Tag) Then Continue For + For Each l In PanFileList.Children + If TypeOf l Is MyListItem Then + If l.Tag.Replace("\", "") = c.Tag Then l.Checked = c.Checked + End If + Next + Next + End Sub + '高级选项与复选框同步 + Private Sub PanFileList_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanFileList.MouseLeftButtonUp + For Each l In PanFileList.Children + If TypeOf l IsNot MyListItem Then Continue For + If String.IsNullOrEmpty(l.Tag) Then Continue For + For Each c In PanCommonFiles.Children + If TypeOf c Is MyCheckBox Then + If c.Tag = l.Tag.Replace("\", "") Then c.Checked = l.Checked + End If + Next + Next + End Sub +#End Region #Region "整合包信息 & 预览栏" Private Sub TbExportName_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportName.TextChanged @@ -137,18 +258,19 @@ ' CardExport.TriggerForceResize() 'End Sub Private Sub BtnExportExport_Click() Handles BtnExportExport.Click - '获取需要包含的文件夹 - Dim contains As New List(Of String) - For Each c In PanFiles.Children - If TypeOf c IsNot MyCheckBox Then Continue For - If String.IsNullOrEmpty(c.Tag) Then Continue For - contains.Add(c.Tag) - Next Dim savePath As String = SelectAs( "选择导出位置", $"整合包 - {If(String.IsNullOrWhiteSpace(TbExportName.Text), PageVersionLeft.Version.Name, TbExportName.Text)}" & If(CheckIncludePCL.Checked, ".zip", ".mrpack"), If(CheckIncludePCL.Checked, "整合包文件(*.zip)|*.zip", "Modrinth 整合包(*.mrpack)|*.mrpack")) If String.IsNullOrEmpty(savePath) Then Exit Sub - ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, {}, 'TODO:改成要保留的文件列表 + + '获取需要包含的文件夹 + Dim contains As New List(Of String) + For Each c In PanCommonFiles.Children + If TypeOf c IsNot MyCheckBox Then Continue For + If String.IsNullOrEmpty(c.Tag) Then Continue For + contains.Add(c.Tag) + Next + ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, Selected.ToArray, PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text)) End Sub From 43511b0a494d041a61415c8d44c9443b6855d281 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Mon, 22 Jul 2024 08:57:49 +0800 Subject: [PATCH 29/47] =?UTF-8?q?:bug:=20=E7=A9=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E6=80=BB=E6=98=AF=E5=88=A4=E5=AE=9A=E4=B8=BA=E8=A2=AB?= =?UTF-8?q?=E9=80=89=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml | 2 +- .../PageVersion/PageVersionExport.xaml.vb | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index f0786e2..1192bb3 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -100,7 +100,7 @@ - diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 708a09b..264725b 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -94,7 +94,6 @@ Else listItem.Title = f End If - listItem.Info = (NewPath & f).Replace(GetPathFromFullPath(PageVersionLeft.Version.Path), "") listItem.Type = MyListItem.CheckType.CheckBox listItem.Height = 35 listItem.Tag = f @@ -143,12 +142,14 @@ Next End If End Sub - Private Function IsSelected(TargetPath As String) As Boolean + Private Function IsSelected(TargetPath As String, Optional AllowEmpty As Boolean = False) As Boolean If File.Exists(TargetPath) Then Return Selected.Contains(TargetPath) End If If Directory.Exists(TargetPath) Then - Return Directory.EnumerateDirectories(TargetPath).All(Function(s) IsSelected(s)) AndAlso + Dim di As New DirectoryInfo(TargetPath) + If (Not AllowEmpty) AndAlso di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return False + Return Directory.EnumerateDirectories(TargetPath).All(Function(s) IsSelected(s, True)) AndAlso Directory.EnumerateFiles(TargetPath).All(Function(s) Selected.Contains(s)) End If Return False @@ -178,21 +179,20 @@ If String.IsNullOrEmpty(c.Tag) Then Continue For For Each l In PanFileList.Children If TypeOf l Is MyListItem Then - If l.Tag.Replace("\", "") = c.Tag Then l.Checked = c.Checked + If l.Tag.Replace("\", "") = c.Tag Then + l.Checked = c.Checked + SelectedChange(c.Checked, PageVersionLeft.Version.Path & c.Tag) + End If End If Next Next End Sub '高级选项与复选框同步 Private Sub PanFileList_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanFileList.MouseLeftButtonUp - For Each l In PanFileList.Children - If TypeOf l IsNot MyListItem Then Continue For - If String.IsNullOrEmpty(l.Tag) Then Continue For - For Each c In PanCommonFiles.Children - If TypeOf c Is MyCheckBox Then - If c.Tag = l.Tag.Replace("\", "") Then c.Checked = l.Checked - End If - Next + For Each c In PanCommonFiles.Children + If TypeOf c Is MyCheckBox Then + c.Checked = IsSelected(PageVersionLeft.Version.Path & c.Tag) + End If Next End Sub #End Region From 1095a33a44489fb8be8009a862f62dc9fc37d352 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 23 Jul 2024 08:49:19 +0800 Subject: [PATCH 30/47] =?UTF-8?q?:boom:=20:children=5Fcrossing:=20?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=83=A8=E5=88=86=E9=80=89=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controls/MyListItem.xaml.vb | 30 +++++++--- .../Pages/PageVersion/PageVersionExport.xaml | 2 +- .../PageVersion/PageVersionExport.xaml.vb | 55 ++++++++++++++----- 3 files changed, 66 insertions(+), 21 deletions(-) diff --git a/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb b/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb index 60706f9..a4015da 100644 --- a/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb +++ b/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb @@ -344,7 +344,16 @@ Return _Checked End Get Set(value As Boolean) - SetChecked(value, False, True) + SetChecked(value, False, True, _Half) + End Set + End Property + Private _Half As Boolean = False + Public Property Half As Boolean + Get + Return _Half + End Get + Set(value As Boolean) + SetChecked(_Checked, False, True, value) End Set End Property ''' @@ -353,7 +362,8 @@ ''' 新的 Checked 属性。 ''' 是否由用户引发。 ''' 是否执行动画。 - Public Sub SetChecked(value As Boolean, user As Boolean, anime As Boolean) + ''' 是否为部分选中。 + Public Sub SetChecked(value As Boolean, user As Boolean, anime As Boolean, Optional half As Boolean = False) Try '自定义属性基础 @@ -371,8 +381,9 @@ End If _Checked = value Else - If value = _Checked Then Exit Sub + If value = _Checked AndAlso half = _Half Then Exit Sub _Checked = value + _Half = half If IsInitialized Then RaiseEvent Changed(Me, ChangedEventArgs) If ChangedEventArgs.Handled Then @@ -436,9 +447,9 @@ '由无变有 If Not IsNothing(RectCheck) Then Dim Delta = ActualHeight - RectCheck.ActualHeight - 12 - Anim.Add(AaHeight(RectCheck, Delta * 0.4, 200,, New AniEaseOutFluent(AniEasePower.Weak))) - Anim.Add(AaHeight(RectCheck, Delta * 0.6, 300,, New AniEaseOutBack(AniEasePower.Weak))) - Anim.Add(AaOpacity(RectCheck, 1 - RectCheck.Opacity, 30)) + Anim.Add(AaHeight(RectCheck, Delta * If(half, 0.2, 0.4), 200,, New AniEaseOutFluent(AniEasePower.Weak))) + Anim.Add(AaHeight(RectCheck, Delta * If(half, 0.3, 0.6), 300,, New AniEaseOutBack(AniEasePower.Weak))) + Anim.Add(AaOpacity(RectCheck, If(half, 0.5, 1) - RectCheck.Opacity, 30)) RectCheck.VerticalAlignment = VerticalAlignment.Center RectCheck.Margin = New Thickness(-1, 0, 0, 0) End If @@ -457,12 +468,17 @@ Else '不使用动画 AniStop("MyListItem Checked " & Uuid) - If Checked Then + + If Checked OrElse half Then If Not IsNothing(RectCheck) Then RectCheck.Height = Double.NaN RectCheck.Margin = New Thickness(-1, 6, 0, 6) RectCheck.Opacity = 1 RectCheck.VerticalAlignment = VerticalAlignment.Stretch + If half Then + RectCheck.Height = Height * 0.4 + RectCheck.Opacity = 0.5 + End If End If SetResourceReference(ForegroundProperty, If(Height < 40, "ColorBrush3", "ColorBrush2")) Else diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 1192bb3..ea647d4 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -115,7 +115,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 264725b..ebe060e 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -77,7 +77,12 @@ listItem.Height = 35 listItem.Logo = Logo.IconButtonOpen listItem.Tag = d & "\" - If IsSelected(NewPath & d & "\") Then listItem.Checked = True + Select Case IsSelected(NewPath & d & "\") + Case 1 + listItem.Half = True + Case 2 + listItem.Checked = True + End Select AddHandler listItem.Click, AddressOf ListItem_Click PanFileList.Children.Add(listItem) fileCount += 1 @@ -97,7 +102,7 @@ listItem.Type = MyListItem.CheckType.CheckBox listItem.Height = 35 listItem.Tag = f - If IsSelected(NewPath & f) Then listItem.Checked = True + listItem.Checked = (IsSelected(NewPath & f) = 2) AddHandler listItem.Click, AddressOf ListItem_Click PanFileList.Children.Add(listItem) fileCount += 1 @@ -141,18 +146,42 @@ If IsAdd Then Selected.Add(f) Else Selected.Remove(f) Next End If + Selected = Selected.Distinct().ToList() End Sub - Private Function IsSelected(TargetPath As String, Optional AllowEmpty As Boolean = False) As Boolean + ''' + ''' 获取 TargetPath 是否选中。 + ''' + ''' 全部未选中为 0,部分选中为 1,全部选中为 2。 + Private Function IsSelected(TargetPath As String, Optional AllowEmpty As Boolean = False) As Integer If File.Exists(TargetPath) Then - Return Selected.Contains(TargetPath) + Return If(Selected.Contains(TargetPath), 2, 0) End If If Directory.Exists(TargetPath) Then Dim di As New DirectoryInfo(TargetPath) - If (Not AllowEmpty) AndAlso di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return False - Return Directory.EnumerateDirectories(TargetPath).All(Function(s) IsSelected(s, True)) AndAlso - Directory.EnumerateFiles(TargetPath).All(Function(s) Selected.Contains(s)) + If (Not AllowEmpty) AndAlso di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return 0 + '如果有一个文件不在列表,则 hasFalse = True + Dim hasFalse As Boolean = False + '如果有一个文件在列表,则 hasTrue = True + Dim hasTrue As Boolean = False + For Each d In Directory.EnumerateDirectories(TargetPath) + Select Case IsSelected(d, True) + Case 0 + hasFalse = True + Case 1 + Return 1 + Case 2 + hasTrue = True + End Select + If hasTrue AndAlso hasFalse Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中 + Next + For Each f In Directory.EnumerateFiles(TargetPath) + If Selected.Contains(f) Then hasTrue = True Else hasFalse = True + If hasTrue AndAlso hasFalse Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中 + Next + If hasFalse AndAlso Not hasTrue Then Return 0 + If hasTrue AndAlso Not hasFalse Then Return 2 End If - Return False + Return 0 End Function Private Sub ListItem_Click(sender As MyListItem, e As Object) If sender.Tag = ".." Then '回到上一级目录 @@ -191,7 +220,7 @@ Private Sub PanFileList_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanFileList.MouseLeftButtonUp For Each c In PanCommonFiles.Children If TypeOf c Is MyCheckBox Then - c.Checked = IsSelected(PageVersionLeft.Version.Path & c.Tag) + c.Checked = (IsSelected(PageVersionLeft.Version.Path & c.Tag) = 2) End If Next End Sub @@ -263,14 +292,14 @@ If(CheckIncludePCL.Checked, "整合包文件(*.zip)|*.zip", "Modrinth 整合包(*.mrpack)|*.mrpack")) If String.IsNullOrEmpty(savePath) Then Exit Sub - '获取需要包含的文件夹 - Dim contains As New List(Of String) + '获取需要包含的文件 + Dim contains As List(Of String) = Selected For Each c In PanCommonFiles.Children If TypeOf c IsNot MyCheckBox Then Continue For If String.IsNullOrEmpty(c.Tag) Then Continue For - contains.Add(c.Tag) + contains.Add(PageVersionLeft.Version.Path & c.Tag) Next - ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, Selected.ToArray, + ModpackExport(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, contains.Distinct.ToArray, PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text)) End Sub From 68086200836ef6fd4b5eb79549cc471ee3123a2e Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 23 Jul 2024 09:05:48 +0800 Subject: [PATCH 31/47] =?UTF-8?q?:bug:=20=E7=A9=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=E9=80=A0=E6=88=90=E9=80=89=E4=B8=AD=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml.vb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index ebe060e..7a86a97 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -158,12 +158,13 @@ End If If Directory.Exists(TargetPath) Then Dim di As New DirectoryInfo(TargetPath) - If (Not AllowEmpty) AndAlso di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return 0 + If di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return If(AllowEmpty, 2, 0) '如果有一个文件不在列表,则 hasFalse = True Dim hasFalse As Boolean = False '如果有一个文件在列表,则 hasTrue = True Dim hasTrue As Boolean = False For Each d In Directory.EnumerateDirectories(TargetPath) + If Directory.EnumerateFileSystemEntries(d).Count = 0 Then Continue For Select Case IsSelected(d, True) Case 0 hasFalse = True From 690e73eab15bff7de10f2468f06b9de13e52fb16 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 25 Jul 2024 17:29:21 +0800 Subject: [PATCH 32/47] =?UTF-8?q?:children=5Fcrossing:=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=BC=B9=E5=87=BA=20explorer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 2fa0141..4ab498d 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -928,7 +928,7 @@ Retry: Sub() If ModpackExportBlocking(Options) Then Hint("导出成功!", HintType.Finish) - OpenExplorer($"""{GetPathFromFullPath(Options.Dest)}""") + OpenExplorer($"/select,""{Options.Dest}""") End If End Sub, "Modpack Export") End Sub @@ -1014,13 +1014,13 @@ Retry: Dim files As New JArray For Each m In ModrinthMapping - Dim f As New JObject - f.Add("path", $"mods/{m.Key}") - f.Add("hashes", m.Value("hashes")) - f.Add("env", New JObject From {{"client", "required"}, {"server", "required"}}) - f.Add("downloads", New JArray From {m.Value("url")}) - f.Add("fileSize", m.Value("size")) - files.Add(f) + files.Add(New JObject From { + {"path", $"mods/{m.Key}"}, + {"hashes", m.Value("hashes")}, + {"env", New JObject From {{"client", "required"}, {"server", "required"}}}, + {"downloads", New JArray From {m.Value("url")}}, + {"fileSize", m.Value("size")} + }) Next Dim depend As New JObject From {{"minecraft", McVersion}} If Version.Version.HasForge Then depend.Add("forge", Version.Version.ForgeVersion) @@ -1047,11 +1047,10 @@ Retry: '额外文件 For Each p In Additional If String.IsNullOrWhiteSpace(p) Then Continue For '传空字串进去会直接把整个版本文件夹拷过去 - Dim fromPath As String = $"{Version.Path}{p}" - If Directory.Exists(fromPath) Then - CopyDirectory(fromPath, $"{tempDir}overrides\{p}") - ElseIf File.Exists(fromPath) Then - CopyFile(fromPath, $"{tempDir}overrides\{p}") + If Not p.StartsWithF(Version.Path, IgnoreCase:=True) Then Continue For + Dim relative As String = p.Replace(Version.Path, "") + If File.Exists(p) AndAlso Not IsVerRedundant(p) Then + CopyFile(p, $"{tempDir}overrides\{relative}") End If Next @@ -1066,7 +1065,7 @@ Retry: End Function Private Function ExportCompressed(Version As McVersion, DestPath As String, Additional As String(), Name As String, VerID As String, PCLSetupGlobal As Boolean) As Boolean Try - Log($"[Export] 导出整合包(含启动器):{Version.Path} -> {DestPath},额外版本文件 {If(Additional Is Nothing OrElse Not Additional.Any, "不导出", Additional.Join(", "))},全局设置 {If(PCLSetupGlobal, "导出", "不导出")}") + Log($"[Export] 导出整合包(含启动器):{Version.Path} -> {DestPath},额外版本文件 {Additional.Count} 个,全局设置 {If(PCLSetupGlobal, "导出", "不导出")}") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" Log($"[Export] 最终压缩包的缓存文件夹:{tempDir}") Directory.CreateDirectory(tempDir) From 86bace4d1359c668ce7601b1ef413a99983e229c Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Wed, 31 Jul 2024 08:57:26 +0800 Subject: [PATCH 33/47] =?UTF-8?q?:ok=5Fhand:=20=E4=BF=AE=E6=94=B9=20LTCatt?= =?UTF-8?q?=20=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)) From ddfc6897d76bda02aab899500b037b4f83c60dba Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 20 Aug 2024 12:27:12 +0800 Subject: [PATCH 34/47] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Base/ModValidate.vb | 5 +++-- Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb | 8 +++++--- .../Pages/PageVersion/PageVersionExport.xaml | 6 +----- .../Pages/PageVersion/PageVersionExport.xaml.vb | 9 ++++++++- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb index c9b6aa0..9dd8a4c 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb @@ -314,6 +314,7 @@ End Class Public Class ValidateFolderPath Inherits Validate Public Property UseMinecraftCharCheck As Boolean = True + Public Property AllowNull As Boolean = False Public Sub New() End Sub Public Sub New(UseMinecraftCharCheck As Boolean) @@ -325,9 +326,9 @@ Public Class ValidateFolderPath If Not Str.TrimEnd("\").EndsWithF(":") Then Str = Str.TrimEnd("\") '检查是否为空 Dim LengthCheck As String = New ValidateNullOrWhiteSpace().Validate(Str) - If Not LengthCheck = "" Then Return LengthCheck + If Not AllowNull AndAlso Not LengthCheck = "" Then Return LengthCheck '检查长度 - LengthCheck = New ValidateLength(1, 254).Validate(Str) + LengthCheck = New ValidateLength(If(AllowNull, 0, 1), 254).Validate(Str) If Not LengthCheck = "" Then Return LengthCheck '检查开头 If Str.StartsWithF("\\Mac\") Then GoTo Fin diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index dd43998..ac4fd7f 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -987,9 +987,11 @@ Retry: '步骤 1:从 Modrinth 获取 Mod 工程信息,得到 URL Dim Mods As New List(Of McMod) - For Each m In Directory.EnumerateFiles(Version.Path & "mods\") - If m.EndsWithF(".jar") Then Mods.Add(New McMod(m)) - Next + If Directory.Exists(Version.Path & "mods\") Then + For Each m In Directory.EnumerateFiles(Version.Path & "mods\") + If m.EndsWithF(".jar") Then Mods.Add(New McMod(m)) + Next + End If '从 Modrinth 获取信息 Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList() diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index ea647d4..39cf72d 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -38,11 +38,7 @@ - - - - - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 3f27dbd..c432673 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -14,6 +14,11 @@ Selected = New List(Of String) CurrentVer = PageVersionLeft.Version.Path End If + + TbExportName.ShowValidateResult = True + TbExportName.ValidateRules = New ObjectModel.Collection(Of Validate) From {New ValidateFileName() With {.AllowNull = True}} + TbExportName.Validate() + TbExportName.HintText = PageVersionLeft.Version.Name TbExportDesc.HintText = PageVersionLeft.Version.Info PanDisplayItem.Children.Clear() @@ -229,7 +234,9 @@ #Region "整合包信息 & 预览栏" Private Sub TbExportName_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportName.TextChanged - ItemVersion.Title = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Name, sender.Text) + If String.IsNullOrEmpty(TbExportName.ValidateResult) Then + ItemVersion.Title = If(String.IsNullOrWhiteSpace(sender.Text), PageVersionLeft.Version.Name, sender.Text) + End If End Sub Private Sub TbExportDesc_TextChanged(sender As MyTextBox, e As TextChangedEventArgs) Handles TbExportDesc.TextChanged From ef5b0ba1f7a93fac1a1b9e41ae673bc607e83d7e Mon Sep 17 00:00:00 2001 From: tangge233 Date: Tue, 20 Aug 2024 14:24:40 +0800 Subject: [PATCH 35/47] =?UTF-8?q?fix:=20=E6=90=81=E8=BF=99=E6=9C=80?= =?UTF-8?q?=E5=BC=BA=E5=A4=A7=E8=84=91=E5=91=A2=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PageVersion/PageVersionExport.xaml.vb | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index c432673..5a1b615 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -164,28 +164,28 @@ If Directory.Exists(TargetPath) Then Dim di As New DirectoryInfo(TargetPath) If di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return If(AllowEmpty, 2, 0) - '如果有一个文件不在列表,则 hasFalse = True - Dim hasFalse As Boolean = False + '如果有一个文件不在列表,则 hasExclude = True + Dim hasExclude As Boolean = False '如果有一个文件在列表,则 hasTrue = True - Dim hasTrue As Boolean = False + Dim hasInclude As Boolean = False For Each d In Directory.EnumerateDirectories(TargetPath) If Directory.EnumerateFileSystemEntries(d).Count = 0 Then Continue For Select Case IsSelected(d, True) Case 0 - hasFalse = True + hasExclude = True Case 1 Return 1 Case 2 - hasTrue = True + hasInclude = True End Select - If hasTrue AndAlso hasFalse Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中 + If hasInclude AndAlso hasExclude Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中 Next For Each f In Directory.EnumerateFiles(TargetPath) - If Selected.Contains(f) Then hasTrue = True Else hasFalse = True - If hasTrue AndAlso hasFalse Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中 + If Selected.Contains(f) Then hasInclude = True Else hasExclude = True + If hasInclude AndAlso hasExclude Then Return 1 '如果有文件在、有文件不在列表中,可以断定部分选中 Next - If hasFalse AndAlso Not hasTrue Then Return 0 - If hasTrue AndAlso Not hasFalse Then Return 2 + If hasExclude AndAlso Not hasInclude Then Return 0 + If hasInclude AndAlso Not hasExclude Then Return 2 End If Return 0 End Function From 37eacb00c50d9194546d96795bb8f7a9fb9e5a5b Mon Sep 17 00:00:00 2001 From: tangge233 Date: Tue, 20 Aug 2024 14:28:25 +0800 Subject: [PATCH 36/47] =?UTF-8?q?comment:=20=E5=90=8C=E6=AD=A5=E4=B8=8B?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 5a1b615..7768572 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -166,7 +166,7 @@ If di.GetDirectories.Length + di.GetFiles.Length = 0 Then Return If(AllowEmpty, 2, 0) '如果有一个文件不在列表,则 hasExclude = True Dim hasExclude As Boolean = False - '如果有一个文件在列表,则 hasTrue = True + '如果有一个文件在列表,则 hasInclude = True Dim hasInclude As Boolean = False For Each d In Directory.EnumerateDirectories(TargetPath) If Directory.EnumerateFileSystemEntries(d).Count = 0 Then Continue For From 10e4bc0bbbbb1188064e5cd7d6d6a25adbb44af7 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 20 Aug 2024 15:33:14 +0800 Subject: [PATCH 37/47] =?UTF-8?q?:bug:=20Tag:=20resources=20->=20resourcep?= =?UTF-8?q?acks=20=E6=88=91=E6=98=AF=E5=82=BB=E9=80=BC=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 39cf72d..5f5c33a 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -97,7 +97,7 @@ + Tag="resourcepacks" ToolTip="resourcepacks 文件夹" /> From f27822b005d0c56a97f58ea58a9e3658b4dde91e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=B8=E5=AD=90=E6=9F=9A=E5=AD=90?= Date: Sun, 13 Oct 2024 20:51:52 +0800 Subject: [PATCH 38/47] =?UTF-8?q?:speech=5Fballoon:=20=E9=AB=98=E7=BA=A7?= =?UTF-8?q?=E9=80=89=E9=A1=B9=E6=8F=90=E7=A4=BA=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pigeon0v0 <60414767+Pigeon0v0@users.noreply.github.com> --- Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 5f5c33a..e8bb0d9 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -111,7 +111,7 @@ - + From f6cbb0f986d858df46a361dc84364b1ff19d88ad Mon Sep 17 00:00:00 2001 From: youzi-3222 Date: Tue, 14 Jan 2025 16:47:28 +0800 Subject: [PATCH 39/47] =?UTF-8?q?:recycle:=20:bug:=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E7=89=88=E6=9C=AC=E9=9A=94=E7=A6=BB=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 187 +++++++++--------- .../PageVersion/PageVersionExport.xaml.vb | 42 ++-- 2 files changed, 118 insertions(+), 111 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 79bbefa..d8f8da5 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -982,7 +982,8 @@ Retry: "modtranslations", 'Mod 翻译 "schematics", 'schematics 模组 ".*\.BakaCoreInfo", 'BakaXL 配置 - "hmclversion\.cfg", "log4j2\.xml" 'HMCL 配置 + "hmclversion\.cfg", "log4j2\.xml", 'HMCL 配置 + "assets", "libraries", "\$natives", "launcher_profiles\.json", "versions" '开启版本隔离时排除的文件 } Public Function IsVerRedundant(FilePath As String) As Boolean FilePath = FilePath.Replace("/", "\") @@ -999,9 +1000,9 @@ Retry: Private MustExport As String() = { "mods", "PCL", ".*\.json" } - Public Function IsMustExport(FileName As String) As Boolean + Public Function IsMustExport(FilePath As String) As Boolean For Each regex In MustExport - If RegexCheck(FileName, regex, RegularExpressions.RegexOptions.IgnoreCase) Then Return True + If RegexCheck(GetFileNameFromPath(FilePath), regex, RegularExpressions.RegexOptions.IgnoreCase) Then Return True Next Return False End Function @@ -1015,112 +1016,112 @@ Retry: Log($"[Export] 缓存文件夹:{tempDir}") Directory.CreateDirectory(tempDir) - '步骤 1:从 Modrinth 获取 Mod 工程信息,得到 URL - Dim Mods As New List(Of McMod) - If Directory.Exists(Version.Path & "mods\") Then - For Each m In Directory.EnumerateFiles(Version.Path & "mods\") - If m.EndsWithF(".jar") Then Mods.Add(New McMod(m)) - Next - End If + ' '步骤 1:从 Modrinth 获取 Mod 工程信息,得到 URL + ' Dim Mods As New List(Of McMod) + ' If Directory.Exists(Version.Path & "mods\") Then + ' For Each m In Directory.EnumerateFiles(Version.Path & "mods\") + ' If m.EndsWithF(".jar") Then Mods.Add(New McMod(m)) + ' Next + ' End If - '从 Modrinth 获取信息 - Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList() - Dim ModrinthVersion = CType(GetJson(NetRequestRetry("https://api.modrinth.com/v2/version_files", "POST", - $"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject) - Log($"[Export] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息") + ' '从 Modrinth 获取信息 + ' Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList() + ' Dim ModrinthVersion = CType(GetJson(NetRequestRetry("https://api.modrinth.com/v2/version_files", "POST", + '$"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject) + ' Log($"[Export] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息") - Dim ModrinthMapping As New Dictionary(Of String, JObject) '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 - ModrinthFailed.Add(Entry) - Continue For - End If - ModrinthMapping.Add(Entry.FileName, ModrinthVersion(Entry.ModrinthHash)("files")(0)) - Next + ' Dim ModrinthMapping As New Dictionary(Of String, JObject) '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 + ' ModrinthFailed.Add(Entry) + ' Continue For + ' End If + ' ModrinthMapping.Add(Entry.FileName, ModrinthVersion(Entry.ModrinthHash)("files")(0)) + ' Next - '步骤 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 的对应信息") + ' '步骤 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 + ' 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 + ' 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 - Log($"[Export] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}") + ' '步骤 3:写入 Json 文件 + ' '获取作为检查目标的加载器和版本 + ' Dim ModLoaders = GetTargetModLoaders() + ' Dim McVersion = Version.Version.McName + ' Log($"[Export] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}") - Dim files As New JArray - For Each m In ModrinthMapping - files.Add(New JObject From { - {"path", $"mods/{m.Key}"}, - {"hashes", m.Value("hashes")}, - {"env", New JObject From {{"client", "required"}, {"server", "required"}}}, - {"downloads", New JArray From {m.Value("url")}}, - {"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 files As New JArray + ' For Each m In ModrinthMapping + ' files.Add(New JObject From { + ' {"path", $"mods/{m.Key}"}, + ' {"hashes", m.Value("hashes")}, + ' {"env", New JObject From {{"client", "required"}, {"server", "required"}}}, + ' {"downloads", New JArray From {m.Value("url")}}, + ' {"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) - If Version.Version.HasNeoForge Then depend.Add("neoforge", Version.Version.NeoForgeVersion) + ' 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) + ' If Version.Version.HasNeoForge Then depend.Add("neoforge", Version.Version.NeoForgeVersion) - Dim json As New JObject From { - {"game", "minecraft"}, - {"formatVersion", 1}, - {"versionId", VerID}, - {"name", If(String.IsNullOrEmpty(Name), Version.Name, Name)}, - {"summary", Version.Info}, - {"files", files}, - {"dependencies", depend} - } + ' Dim json As New JObject From { + ' {"game", "minecraft"}, + ' {"formatVersion", 1}, + ' {"versionId", VerID}, + ' {"name", If(String.IsNullOrEmpty(Name), Version.Name, Name)}, + ' {"summary", Version.Info}, + ' {"files", files}, + ' {"dependencies", depend} + ' } - File.WriteAllText(tempDir & "modrinth.index.json", json.ToString) + ' File.WriteAllText(tempDir & "modrinth.index.json", json.ToString) - '步骤 4:将获取不到的保存到 overrides 目录 - For Each m In ModrinthFailed - CopyFile(m.Path, tempDir & "overrides\mods\" & m.FileName) - Next + ' '步骤 4:将获取不到的保存到 overrides 目录 + ' For Each m In ModrinthFailed + ' CopyFile(m.Path, tempDir & "overrides\mods\" & m.FileName) + ' Next '额外文件 For Each p In Additional If String.IsNullOrWhiteSpace(p) Then Continue For '传空字串进去会直接把整个版本文件夹拷过去 - If Not p.StartsWithF(Version.Path, IgnoreCase:=True) Then Continue For - Dim relative As String = p.Replace(Version.Path, "") + If Not p.StartsWithF(GetPathFromFullPath(GetPathFromFullPath(Version.Path)), IgnoreCase:=True) Then Continue For + Dim relative As String = p.Replace(Version.Path, "").Replace(GetPathFromFullPath(GetPathFromFullPath(Version.Path)), "") If File.Exists(p) AndAlso Not IsVerRedundant(p) Then CopyFile(p, $"{tempDir}overrides\{relative}") End If diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 7768572..f1c957a 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -46,7 +46,8 @@ ''' Private CurrentPath As String = "" Private Sub ReloadFileList(Optional NewPath As String = "") - If String.IsNullOrWhiteSpace(NewPath) Then NewPath = PageVersionLeft.Version.Path + If String.IsNullOrWhiteSpace(NewPath) OrElse NewPath = PathMcFolder Then NewPath = PageVersionLeft.Version.Path + If Not NewPath.EndsWithF("\") Then NewPath &= "\" Dim tb As TextBlock = PanFileList.Children(0) PanFileList.Children.Clear() PanFileList.Children.Add(tb) @@ -58,31 +59,37 @@ End If Dim fileCount As Integer = 0 + Dim directories = Directory.EnumerateDirectories(NewPath) + Dim files = Directory.EnumerateFiles(NewPath) + If (NewPath = PageVersionLeft.Version.Path) AndAlso PageVersionLeft.Version.PathIndie = PathMcFolder Then + '未开启版本隔离时 .minecraft 下的文件 + directories = directories.Concat(Directory.EnumerateDirectories(PathMcFolder)) + files = files.Concat(Directory.EnumerateFiles(PathMcFolder)) + End If - For Each d In Directory.EnumerateDirectories(NewPath) + For Each d In directories If Directory.EnumerateFileSystemEntries(d).Count = 0 Then Continue For - d = GetFolderNameFromPath(d) - If IsVerRedundant(NewPath & d) OrElse IsMustExport(d) Then Continue For + If IsVerRedundant(d) OrElse IsMustExport(d) Then Continue For Dim title As String = "" Dim listItem As New MyListItem - If Titles.TryGetValue(d, title) Then 'title 作为引用类型传入 + If Titles.TryGetValue(GetFolderNameFromPath(d), title) Then 'title 作为引用类型传入 listItem.Title = title - listItem.Info = d Else - listItem.Title = d + listItem.Title = GetFolderNameFromPath(d) End If + listItem.Info = d '图标按钮 Dim btnSwap As New MyIconButton btnSwap.Logo = Logo.IconButtonRight btnSwap.LogoScale = 1.0 - btnSwap.Tag = d + btnSwap.Tag = d & "\" AddHandler btnSwap.Click, AddressOf BtnSwap_Click listItem.Buttons = {btnSwap} listItem.Type = MyListItem.CheckType.CheckBox listItem.Height = 35 listItem.Logo = Logo.IconButtonOpen listItem.Tag = d & "\" - Select Case IsSelected(NewPath & d & "\") + Select Case IsSelected(d & "\") Case 1 listItem.Half = True Case 2 @@ -93,21 +100,20 @@ fileCount += 1 Next - For Each f In Directory.EnumerateFiles(NewPath) - f = GetFileNameFromPath(f) - If IsVerRedundant(NewPath & f) OrElse IsMustExport(f) Then Continue For + For Each f In files + If IsVerRedundant(f) OrElse IsMustExport(f) Then Continue For Dim title As String = "" Dim listItem As New MyListItem If Titles.TryGetValue(f, title) Then 'title 作为引用类型传入 listItem.Title = title - listItem.Info = f Else - listItem.Title = f + listItem.Title = GetFileNameFromPath(f) End If + listItem.Info = f listItem.Type = MyListItem.CheckType.CheckBox listItem.Height = 35 listItem.Tag = f - listItem.Checked = (IsSelected(NewPath & f) = 2) + listItem.Checked = (IsSelected(f) = 2) AddHandler listItem.Click, AddressOf ListItem_Click PanFileList.Children.Add(listItem) fileCount += 1 @@ -125,7 +131,7 @@ {"servers.dat", "服务器列表"} } Private Sub BtnSwap_Click(sender As MyIconButton, e As Object) - Dim actualPath As String = CurrentPath & sender.Tag & "\" + Dim actualPath As String = sender.Tag 'Dim relative As String = actualPath.Replace(PageVersionLeft.Version.Path, "") If Not Directory.Exists(actualPath) Then @@ -195,7 +201,7 @@ Exit Sub End If SelectedChange(Not sender.Checked, '非常难绷的逻辑,很难描述清楚,自己打断点看 Checked 属性值吧…… - CurrentPath & sender.Tag) + sender.Tag) End Sub 'Private ReadOnly Property Saves As List(Of String) @@ -226,7 +232,7 @@ Private Sub PanFileList_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanFileList.MouseLeftButtonUp For Each c In PanCommonFiles.Children If TypeOf c Is MyCheckBox Then - c.Checked = (IsSelected(PageVersionLeft.Version.Path & c.Tag) = 2) + c.Checked = IsSelected(PageVersionLeft.Version.Path & c.Tag) = 2 OrElse IsSelected(PathMcFolder & c.Tag) = 2 End If Next End Sub From 838cb794200bfe48e601ab88eef519b482ec0c5a Mon Sep 17 00:00:00 2001 From: youzi-3222 Date: Tue, 14 Jan 2025 16:50:51 +0800 Subject: [PATCH 40/47] =?UTF-8?q?:art:=20=E5=8F=96=E6=B6=88=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=97=B6=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 176 +++++++++--------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index d8f8da5..897f5d8 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -1016,106 +1016,106 @@ Retry: Log($"[Export] 缓存文件夹:{tempDir}") Directory.CreateDirectory(tempDir) - ' '步骤 1:从 Modrinth 获取 Mod 工程信息,得到 URL - ' Dim Mods As New List(Of McMod) - ' If Directory.Exists(Version.Path & "mods\") Then - ' For Each m In Directory.EnumerateFiles(Version.Path & "mods\") - ' If m.EndsWithF(".jar") Then Mods.Add(New McMod(m)) - ' Next - ' End If + '步骤 1:从 Modrinth 获取 Mod 工程信息,得到 URL + Dim Mods As New List(Of McMod) + If Directory.Exists(Version.Path & "mods\") Then + For Each m In Directory.EnumerateFiles(Version.Path & "mods\") + If m.EndsWithF(".jar") Then Mods.Add(New McMod(m)) + Next + End If - ' '从 Modrinth 获取信息 - ' Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList() - ' Dim ModrinthVersion = CType(GetJson(NetRequestRetry("https://api.modrinth.com/v2/version_files", "POST", - '$"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject) - ' Log($"[Export] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息") + '从 Modrinth 获取信息 + Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList() + Dim ModrinthVersion = CType(GetJson(NetRequestRetry("https://api.modrinth.com/v2/version_files", "POST", + $"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject) + Log($"[Export] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息") - ' Dim ModrinthMapping As New Dictionary(Of String, JObject) '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 - ' ModrinthFailed.Add(Entry) - ' Continue For - ' End If - ' ModrinthMapping.Add(Entry.FileName, ModrinthVersion(Entry.ModrinthHash)("files")(0)) - ' Next + Dim ModrinthMapping As New Dictionary(Of String, JObject) '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 + ModrinthFailed.Add(Entry) + Continue For + End If + ModrinthMapping.Add(Entry.FileName, ModrinthVersion(Entry.ModrinthHash)("files")(0)) + Next - ' '步骤 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 的对应信息") + '步骤 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 + 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 + 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 - ' Log($"[Export] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}") + '步骤 3:写入 Json 文件 + '获取作为检查目标的加载器和版本 + Dim ModLoaders = GetTargetModLoaders() + Dim McVersion = Version.Version.McName + Log($"[Export] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}") - ' Dim files As New JArray - ' For Each m In ModrinthMapping - ' files.Add(New JObject From { - ' {"path", $"mods/{m.Key}"}, - ' {"hashes", m.Value("hashes")}, - ' {"env", New JObject From {{"client", "required"}, {"server", "required"}}}, - ' {"downloads", New JArray From {m.Value("url")}}, - ' {"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 files As New JArray + For Each m In ModrinthMapping + files.Add(New JObject From { + {"path", $"mods/{m.Key}"}, + {"hashes", m.Value("hashes")}, + {"env", New JObject From {{"client", "required"}, {"server", "required"}}}, + {"downloads", New JArray From {m.Value("url")}}, + {"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) - ' If Version.Version.HasNeoForge Then depend.Add("neoforge", Version.Version.NeoForgeVersion) + 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) + If Version.Version.HasNeoForge Then depend.Add("neoforge", Version.Version.NeoForgeVersion) - ' Dim json As New JObject From { - ' {"game", "minecraft"}, - ' {"formatVersion", 1}, - ' {"versionId", VerID}, - ' {"name", If(String.IsNullOrEmpty(Name), Version.Name, Name)}, - ' {"summary", Version.Info}, - ' {"files", files}, - ' {"dependencies", depend} - ' } + Dim json As New JObject From { + {"game", "minecraft"}, + {"formatVersion", 1}, + {"versionId", VerID}, + {"name", If(String.IsNullOrEmpty(Name), Version.Name, Name)}, + {"summary", Version.Info}, + {"files", files}, + {"dependencies", depend} + } - ' File.WriteAllText(tempDir & "modrinth.index.json", json.ToString) + File.WriteAllText(tempDir & "modrinth.index.json", json.ToString) - ' '步骤 4:将获取不到的保存到 overrides 目录 - ' For Each m In ModrinthFailed - ' CopyFile(m.Path, tempDir & "overrides\mods\" & m.FileName) - ' Next + '步骤 4:将获取不到的保存到 overrides 目录 + For Each m In ModrinthFailed + CopyFile(m.Path, tempDir & "overrides\mods\" & m.FileName) + Next '额外文件 For Each p In Additional From e6e9ebd5dcc94fb0812097350be68f1120645205 Mon Sep 17 00:00:00 2001 From: youzi-3222 Date: Thu, 16 Jan 2025 16:26:26 +0800 Subject: [PATCH 41/47] =?UTF-8?q?:lipstick:=20:ok=5Fhand:=20=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E9=A2=84=E8=A7=88=E4=B8=8E=E4=BF=A1=E6=81=AF=E5=8D=A1?= =?UTF-8?q?=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionExport.xaml | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index e8bb0d9..66c98f6 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -8,21 +8,18 @@ - - - - - - - - + + + + + + + + - - - - - - + + From 1e5d5f0377c753d4fd941b2e10b2dd4262a34718 Mon Sep 17 00:00:00 2001 From: youzi-3222 Date: Thu, 16 Jan 2025 17:00:04 +0800 Subject: [PATCH 42/47] =?UTF-8?q?:bug:=20:ok=5Fhand:=20Mod=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=BF=9D=E7=95=99=E5=8E=9F=E5=A7=8B=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 897f5d8..47da1a6 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -1,5 +1,6 @@ Imports System.IO.Compression Imports System.Linq.Expressions +Imports NAudio.Wave.SampleProviders Public Module ModModpack @@ -1017,38 +1018,37 @@ Retry: Directory.CreateDirectory(tempDir) '步骤 1:从 Modrinth 获取 Mod 工程信息,得到 URL - Dim Mods As New List(Of McMod) + Dim Mods As New Dictionary(Of String, McMod) If Directory.Exists(Version.Path & "mods\") Then For Each m In Directory.EnumerateFiles(Version.Path & "mods\") - If m.EndsWithF(".jar") Then Mods.Add(New McMod(m)) + If m.EndsWithF(".jar") Then Mods.Add(GetFileNameFromPath(m), New McMod(m)) Next End If '从 Modrinth 获取信息 - Dim ModrinthHashes = Mods.Select(Function(m) m.ModrinthHash).ToList() + Dim ModrinthMapping As New Dictionary(Of String, JObject) 'Modrinth 获取到的 Mod + Dim CurseForgeMapping As New Dictionary(Of String, JObject) 'CurseForge 获取到的 Mod + Dim ModrinthFailed As New Dictionary(Of String, McMod) 'Modrinth 获取失败的 Mod + Dim ModrinthHashes = Mods.Select(Function(m) m.Value.ModrinthHash).ToList() + If Mods.Count = 0 Then GoTo JumpMod Dim ModrinthVersion = CType(GetJson(NetRequestRetry("https://api.modrinth.com/v2/version_files", "POST", $"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject) Log($"[Export] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息") - Dim ModrinthMapping As New Dictionary(Of String, JObject) '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 - ModrinthFailed.Add(Entry) + If (Not ModrinthVersion.ContainsKey(Entry.Value.ModrinthHash)) OrElse + (ModrinthVersion(Entry.Value.ModrinthHash)("files")(0)("hashes")("sha1") <> Entry.Value.ModrinthHash) Then + ModrinthFailed.Add(Entry.Key, Entry.Value) Continue For End If - ModrinthMapping.Add(Entry.FileName, ModrinthVersion(Entry.ModrinthHash)("files")(0)) + ModrinthMapping.Add(Entry.Key, ModrinthVersion(Entry.Value.ModrinthHash)("files")(0)) Next '步骤 2:把获取失败的 Mod 从 CurseForge 继续获取 - Dim CurseForgeHashes = ModrinthFailed.Select(Function(m) m.CurseForgeHash).ToList() + Dim CurseForgeHashes = ModrinthFailed.Select(Function(m) m.Value.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 @@ -1060,15 +1060,16 @@ Retry: 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) + If file.Value.ModrinthHash = hash Then + CurseForgeMapping.Add(file.Key, m("file")) + ModrinthFailed.Remove(file.Key) Exit For End If Next Next +JumpMod: '步骤 3:写入 Json 文件 '获取作为检查目标的加载器和版本 Dim ModLoaders = GetTargetModLoaders() @@ -1114,7 +1115,7 @@ Retry: '步骤 4:将获取不到的保存到 overrides 目录 For Each m In ModrinthFailed - CopyFile(m.Path, tempDir & "overrides\mods\" & m.FileName) + CopyFile(m.Value.Path, tempDir & "overrides\mods\" & m.Value.FileName) Next '额外文件 From 08ad8e6682eb5c2ea124ade526416e30e8c780c6 Mon Sep 17 00:00:00 2001 From: youzi-3222 Date: Thu, 16 Jan 2025 18:24:25 +0800 Subject: [PATCH 43/47] =?UTF-8?q?:sparkles:=20:ok=5Fhand:=20=E5=85=81?= =?UTF-8?q?=E8=AE=B8=E5=A4=9A=E4=B8=AA=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 47da1a6..0d4c4d9 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -1028,7 +1028,7 @@ Retry: '从 Modrinth 获取信息 Dim ModrinthMapping As New Dictionary(Of String, JObject) 'Modrinth 获取到的 Mod Dim CurseForgeMapping As New Dictionary(Of String, JObject) 'CurseForge 获取到的 Mod - Dim ModrinthFailed As New Dictionary(Of String, McMod) 'Modrinth 获取失败的 Mod + Dim Failed = Mods.ToArray().ToDictionary(Function(a) a.Key, Function(a) a.Value) '获取失败的 Mod Dim ModrinthHashes = Mods.Select(Function(m) m.Value.ModrinthHash).ToList() If Mods.Count = 0 Then GoTo JumpMod Dim ModrinthVersion = CType(GetJson(NetRequestRetry("https://api.modrinth.com/v2/version_files", "POST", @@ -1038,14 +1038,14 @@ Retry: For Each Entry In Mods If (Not ModrinthVersion.ContainsKey(Entry.Value.ModrinthHash)) OrElse (ModrinthVersion(Entry.Value.ModrinthHash)("files")(0)("hashes")("sha1") <> Entry.Value.ModrinthHash) Then - ModrinthFailed.Add(Entry.Key, Entry.Value) Continue For End If + Failed.Remove(Entry.Key) ModrinthMapping.Add(Entry.Key, ModrinthVersion(Entry.Value.ModrinthHash)("files")(0)) Next - '步骤 2:把获取失败的 Mod 从 CurseForge 继续获取 - Dim CurseForgeHashes = ModrinthFailed.Select(Function(m) m.Value.CurseForgeHash).ToList() + '步骤 2:从 CurseForge 继续获取 + Dim CurseForgeHashes = Mods.Select(Function(m) m.Value.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 的对应信息") @@ -1060,40 +1060,51 @@ Retry: If String.IsNullOrEmpty(hash) OrElse String.IsNullOrEmpty(m("file")("downloadUrl")) Then Continue For m("file")("ModrinthHash") = hash - For Each file In ModrinthFailed + Dim f = Mods.ToArray() + For Each file In f If file.Value.ModrinthHash = hash Then CurseForgeMapping.Add(file.Key, m("file")) - ModrinthFailed.Remove(file.Key) + Failed.Remove(file.Key) Exit For End If Next Next JumpMod: - '步骤 3:写入 Json 文件 + '步骤 3:合并下载链接,写入 Json 文件 '获取作为检查目标的加载器和版本 Dim ModLoaders = GetTargetModLoaders() Dim McVersion = Version.Version.McName Log($"[Export] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}") + '合并下载链接 + Dim BothUrls As New Dictionary(Of String, String()) '两个下载源都有 URL 的 Mod + For Each modrinth In ModrinthMapping + Dim curseforge As New JObject + If CurseForgeMapping.TryGetValue(modrinth.Key, curseforge) Then + BothUrls.Add(modrinth.Key, {modrinth.Value("url"), curseforge("downloadUrl")}) + End If + Next Dim files As New JArray For Each m In ModrinthMapping files.Add(New JObject From { {"path", $"mods/{m.Key}"}, {"hashes", m.Value("hashes")}, {"env", New JObject From {{"client", "required"}, {"server", "required"}}}, - {"downloads", New JArray From {m.Value("url")}}, + {"downloads", If(BothUrls.ContainsKey(m.Key), JArray.FromObject(BothUrls(m.Key)), New JArray From {m.Value("url")})}, {"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")} - }) + If Not BothUrls.ContainsKey(m.Key) Then + 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")} + }) + End If Next Dim depend As New JObject From {{"minecraft", McVersion}} @@ -1114,7 +1125,7 @@ JumpMod: File.WriteAllText(tempDir & "modrinth.index.json", json.ToString) '步骤 4:将获取不到的保存到 overrides 目录 - For Each m In ModrinthFailed + For Each m In Failed CopyFile(m.Value.Path, tempDir & "overrides\mods\" & m.Value.FileName) Next From 74a9d18fc5004559d665be656444cb735eba938c Mon Sep 17 00:00:00 2001 From: youzi-3222 Date: Fri, 17 Jan 2025 14:02:08 +0800 Subject: [PATCH 44/47] =?UTF-8?q?:wheelchair:=20:ok=5Fhand:=20=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E6=95=B4=E5=90=88=E5=8C=85=E6=94=B9=E7=94=A8=20Loader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 78 ++++++++++++------- .../PageVersion/PageVersionExport.xaml.vb | 22 +++++- 2 files changed, 68 insertions(+), 32 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 0d4c4d9..741ff4d 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -1,6 +1,7 @@ Imports System.IO.Compression Imports System.Linq.Expressions Imports NAudio.Wave.SampleProviders +Imports PCL.ModLoader Public Module ModModpack @@ -951,23 +952,11 @@ Retry: End Sub End Class ''' - ''' 导出整合包。不阻塞。 + ''' 导出整合包,返回是否成功。 ''' - Public Sub ModpackExport(Options As ExportOptions) - Hint("正在导出……") - RunInNewThread( - Sub() - If ModpackExportBlocking(Options) Then - Hint("导出成功!", HintType.Finish) - OpenExplorer($"/select,""{Options.Dest}""") - End If - End Sub, "Modpack Export") - End Sub - Private Function ModpackExportBlocking(Options As ExportOptions) As Boolean - If Options.IncludePCL Then - Return ExportCompressed(Options.Version, Options.Dest, Options.Additional, Options.Name, Options.VerID, Options.PCLSetupGlobal) - End If - Return ExportModrinth(Options.Version, Options.Dest, Options.Additional, Options.Name, Options.VerID) + Public Function ModpackExport(Task As LoaderTask(Of ExportOptions, Boolean)) As Boolean + If Task.Input.IncludePCL Then Return ExportCompressed(Task) + Return ExportModrinth(Task) End Function #Region "冗余" @@ -1007,17 +996,22 @@ Retry: Next Return False End Function -#End Region +#End Region #Region "不同类型整合包的导出方法" - Private Function ExportModrinth(Version As McVersion, DestPath As String, Additional As String(), Name As String, VerID As String) As Boolean + Private Function ExportModrinth(Task As LoaderTask(Of ExportOptions, Boolean)) As Boolean Try - Log($"[Export] 导出整合包(Modrinth):{Version.Path} -> {DestPath},额外版本文件 {If(Additional Is Nothing OrElse Not Additional.Any, "不导出", Additional.Join(", "))}") + Dim Version = Task.Input.Version + Dim DestPath = Task.Input.Dest + Dim Additional = Task.Input.Additional + Dim Name = Task.Input.Name + Dim VerID = Task.Input.VerID + Log($"[Export] 导出整合包(Modrinth):{Version.Path} -> {DestPath},额外版本文件 {Additional.Count} 个") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" Log($"[Export] 缓存文件夹:{tempDir}") Directory.CreateDirectory(tempDir) - '步骤 1:从 Modrinth 获取 Mod 工程信息,得到 URL +#Region "0.04-0.40:从 Modrinth 获取 Mod 工程信息,得到 URL" Dim Mods As New Dictionary(Of String, McMod) If Directory.Exists(Version.Path & "mods\") Then For Each m In Directory.EnumerateFiles(Version.Path & "mods\") @@ -1031,24 +1025,29 @@ Retry: Dim Failed = Mods.ToArray().ToDictionary(Function(a) a.Key, Function(a) a.Value) '获取失败的 Mod Dim ModrinthHashes = Mods.Select(Function(m) m.Value.ModrinthHash).ToList() If Mods.Count = 0 Then GoTo JumpMod - Dim ModrinthVersion = CType(GetJson(NetRequestRetry("https://api.modrinth.com/v2/version_files", "POST", + Dim ModrinthRaw = CType(GetJson(NetRequestRetry("https://api.modrinth.com/v2/version_files", "POST", $"{{""hashes"": [""{ModrinthHashes.Join(""",""")}""], ""algorithm"": ""sha1""}}", "application/json")), JObject) - Log($"[Export] 从 Modrinth 获取到 {ModrinthVersion.Count} 个本地 Mod 的对应信息") + Log($"[Export] 从 Modrinth 获取到 {ModrinthRaw.Count} 个本地 Mod 的对应信息") + Task.Progress = 0.35 For Each Entry In Mods - If (Not ModrinthVersion.ContainsKey(Entry.Value.ModrinthHash)) OrElse - (ModrinthVersion(Entry.Value.ModrinthHash)("files")(0)("hashes")("sha1") <> Entry.Value.ModrinthHash) Then + If (Not ModrinthRaw.ContainsKey(Entry.Value.ModrinthHash)) OrElse + (ModrinthRaw(Entry.Value.ModrinthHash)("files")(0)("hashes")("sha1") <> Entry.Value.ModrinthHash) Then Continue For End If Failed.Remove(Entry.Key) - ModrinthMapping.Add(Entry.Key, ModrinthVersion(Entry.Value.ModrinthHash)("files")(0)) + ModrinthMapping.Add(Entry.Key, ModrinthRaw(Entry.Value.ModrinthHash)("files")(0)) Next + Task.Progress = 0.4 +#End Region - '步骤 2:从 CurseForge 继续获取 +#Region "0.40-0.80:从 CurseForge 继续获取" Dim CurseForgeHashes = Mods.Select(Function(m) m.Value.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 的对应信息") + Task.Progress = 0.7 + For Each m In CurseForgeRaw Dim hash As String = "" For Each h In m("file")("hashes") '获取 Modrinth Hash @@ -1069,9 +1068,11 @@ Retry: End If Next Next + Task.Progress = 0.8 +#End Region JumpMod: - '步骤 3:合并下载链接,写入 Json 文件 +#Region "0.80-0.90:合并下载链接,写入 Json 文件" '获取作为检查目标的加载器和版本 Dim ModLoaders = GetTargetModLoaders() Dim McVersion = Version.Version.McName @@ -1085,6 +1086,8 @@ JumpMod: BothUrls.Add(modrinth.Key, {modrinth.Value("url"), curseforge("downloadUrl")}) End If Next + Task.Progress = 0.83 + Dim files As New JArray For Each m In ModrinthMapping files.Add(New JObject From { @@ -1106,6 +1109,7 @@ JumpMod: }) End If Next + Task.Progress = 0.87 Dim depend As New JObject From {{"minecraft", McVersion}} If Version.Version.HasForge Then depend.Add("forge", Version.Version.ForgeVersion) @@ -1123,11 +1127,14 @@ JumpMod: } File.WriteAllText(tempDir & "modrinth.index.json", json.ToString) + Task.Progress = 0.9 +#End Region - '步骤 4:将获取不到的保存到 overrides 目录 +#Region "0.90-0.99:将其余文件保存到 overrides 目录" For Each m In Failed CopyFile(m.Value.Path, tempDir & "overrides\mods\" & m.Value.FileName) Next + Task.Progress = 0.92 '额外文件 For Each p In Additional @@ -1138,6 +1145,8 @@ JumpMod: CopyFile(p, $"{tempDir}overrides\{relative}") End If Next + Task.Progress = 0.99 +#End Region If File.Exists(DestPath) Then File.Delete(DestPath) '选择文件的时候已经确认了要替换 ZipFile.CreateFromDirectory(tempDir, DestPath) @@ -1148,15 +1157,24 @@ JumpMod: Return False End Try End Function - Private Function ExportCompressed(Version As McVersion, DestPath As String, Additional As String(), Name As String, VerID As String, PCLSetupGlobal As Boolean) As Boolean + Private Function ExportCompressed(Task As LoaderTask(Of ExportOptions, Boolean)) As Boolean Try + Dim Version = Task.Input.Version + Dim DestPath = Task.Input.Dest + Dim Additional = Task.Input.Additional + Dim Name = Task.Input.Name + Dim VerID = Task.Input.VerID + Dim PCLSetupGlobal = Task.Input.PCLSetupGlobal Log($"[Export] 导出整合包(含启动器):{Version.Path} -> {DestPath},额外版本文件 {Additional.Count} 个,全局设置 {If(PCLSetupGlobal, "导出", "不导出")}") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" Log($"[Export] 最终压缩包的缓存文件夹:{tempDir}") Directory.CreateDirectory(tempDir) + Task.Progress = 0.04 + Log("[Export] 开始导出 Modrinth 整合包") - ExportModrinth(Version, $"{tempDir}modpack.mrpack", Additional, Name, VerID) + Task.Input.Dest = $"{tempDir}modpack.mrpack" + ExportModrinth(Task) Log($"[Export] 正在复制 PCL 本体") CopyFile(PathWithName, tempDir & GetFileNameFromPath(PathWithName)) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index f1c957a..c6fb5d7 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -313,8 +313,26 @@ If String.IsNullOrEmpty(c.Tag) Then Continue For 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)) + '重复任务检查 + For Each OngoingLoader In LoaderTaskbar + If OngoingLoader.Name <> $"导出整合包 {PageVersionLeft.Version.Name}" Then Continue For + Hint("正在处理中,请稍候!", HintType.Critical) + Exit Sub + Next + '启动! + Dim Loader As New LoaderTask(Of ExportOptions, Boolean)($"导出整合包 {PageVersionLeft.Version.Name}", + Sub(Task As LoaderTask(Of ExportOptions, Boolean)) + Task.Output = ModpackExport(Task) + Task.Progress = 1.0 + If Task.Output Then + Hint($"{Task.Name} 成功!", HintType.Finish) + OpenExplorer($"/select,""{Task.Input.Dest}""") + End If + End Sub) + Dim Combo = New LoaderCombo(Of ExportOptions)($"导出整合包 {PageVersionLeft.Version.Name}", {Loader}) + Combo.Start(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, contains.Distinct.ToArray, + PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text)) + LoaderTaskbarAdd(Combo) End Sub #End Region From 1b8d164061a7b984c721a6262593e60285d89909 Mon Sep 17 00:00:00 2001 From: youzi-3222 Date: Thu, 23 Jan 2025 08:00:59 +0800 Subject: [PATCH 45/47] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=B7=B2?= =?UTF-8?q?=E7=9F=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 4 +++- .../Pages/PageVersion/PageVersionExport.xaml.vb | 14 ++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 741ff4d..8d49ff3 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -998,6 +998,7 @@ Retry: End Function #End Region + #Region "不同类型整合包的导出方法" Private Function ExportModrinth(Task As LoaderTask(Of ExportOptions, Boolean)) As Boolean Try @@ -1005,6 +1006,7 @@ Retry: Dim DestPath = Task.Input.Dest Dim Additional = Task.Input.Additional Dim Name = Task.Input.Name + Dim Description = Task.Input.Desc Dim VerID = Task.Input.VerID Log($"[Export] 导出整合包(Modrinth):{Version.Path} -> {DestPath},额外版本文件 {Additional.Count} 个") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" @@ -1121,7 +1123,7 @@ JumpMod: {"formatVersion", 1}, {"versionId", VerID}, {"name", If(String.IsNullOrEmpty(Name), Version.Name, Name)}, - {"summary", Version.Info}, + {"summary", Description}, {"files", files}, {"dependencies", depend} } diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index c6fb5d7..8486bbe 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -9,10 +9,16 @@ AniControlEnabled += 1 If CurrentVer <> PageVersionLeft.Version.Path Then - '说明切换到另一个版本了,所有的绝对路径都要重置,否则爆炸 + '说明切换到另一个版本了,所有的设置都要重置 CurrentPath = "" Selected = New List(Of String) CurrentVer = PageVersionLeft.Version.Path + + TbExportName.Text = "" + TbExportVersion.Text = "" + ComboDisplayLogo.SelectedIndex = 0 + CustomLogoVal = Nothing + TbExportDesc.Text = "" End If TbExportName.ShowValidateResult = True @@ -216,11 +222,10 @@ '复选框与高级选项同步 Private Sub PanCommonFiles_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs) Handles PanCommonFiles.MouseLeftButtonUp For Each c In PanCommonFiles.Children - If TypeOf c IsNot MyCheckBox Then Continue For If String.IsNullOrEmpty(c.Tag) Then Continue For For Each l In PanFileList.Children If TypeOf l Is MyListItem Then - If l.Tag.Replace("\", "") = c.Tag Then + If If(l.Tag.EndsWith("\"), GetFolderNameFromPath(l.Tag), GetFileNameFromPath(l.Tag)) = c.Tag Then l.Checked = c.Checked SelectedChange(c.Checked, PageVersionLeft.Version.Path & c.Tag) End If @@ -331,7 +336,8 @@ End Sub) Dim Combo = New LoaderCombo(Of ExportOptions)($"导出整合包 {PageVersionLeft.Version.Name}", {Loader}) Combo.Start(New ExportOptions(PageVersionLeft.Version, savePath, CheckIncludePCL.Checked, contains.Distinct.ToArray, - PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, VerID:=TbExportVersion.Text)) + PCLSetupGlobal:=CheckIncludeSetup.Checked, Name:=TbExportName.Text, Desc:=TbExportDesc.Text, + VerID:=TbExportVersion.Text)) LoaderTaskbarAdd(Combo) End Sub From 86b0e6d459d1c0e57f5f2af96c07a60a6a28904d Mon Sep 17 00:00:00 2001 From: youzi-3222 Date: Thu, 23 Jan 2025 08:56:44 +0800 Subject: [PATCH 46/47] =?UTF-8?q?:fire:=20=E5=88=A0=E9=99=A4=20Logo=20?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 13 ++++++---- .../Pages/PageVersion/PageVersionExport.xaml | 13 +++++----- .../PageVersion/PageVersionExport.xaml.vb | 24 +++++++++---------- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 8d49ff3..9a380b0 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -1,7 +1,5 @@ Imports System.IO.Compression Imports System.Linq.Expressions -Imports NAudio.Wave.SampleProviders -Imports PCL.ModLoader Public Module ModModpack @@ -1011,6 +1009,7 @@ Retry: Log($"[Export] 导出整合包(Modrinth):{Version.Path} -> {DestPath},额外版本文件 {Additional.Count} 个") Dim tempDir As String = $"{ExpTempDir}{GetUuid()}\" Log($"[Export] 缓存文件夹:{tempDir}") + DeleteDirectory(tempDir) Directory.CreateDirectory(tempDir) #Region "0.04-0.40:从 Modrinth 获取 Mod 工程信息,得到 URL" @@ -1074,7 +1073,7 @@ Retry: #End Region JumpMod: -#Region "0.80-0.90:合并下载链接,写入 Json 文件" +#Region "0.80-0.90:合并下载链接,复制 Logo,写入 Json 文件" '获取作为检查目标的加载器和版本 Dim ModLoaders = GetTargetModLoaders() Dim McVersion = Version.Version.McName @@ -1111,7 +1110,12 @@ JumpMod: }) End If Next - Task.Progress = 0.87 + Task.Progress = 0.86 + 'If Not String.IsNullOrEmpty(Logo) Then + ' Dim LogoObj As New MyBitmap(Logo) + ' LogoObj.Save(tempDir & "Logo.png") + 'End If + 'Task.Progress = 0.88 Dim depend As New JObject From {{"minecraft", McVersion}} If Version.Version.HasForge Then depend.Add("forge", Version.Version.ForgeVersion) @@ -1127,6 +1131,7 @@ JumpMod: {"files", files}, {"dependencies", depend} } + 'If Not String.IsNullOrEmpty(Logo) Then json.Add("logo", tempDir & "Logo.png") File.WriteAllText(tempDir & "modrinth.index.json", json.ToString) Task.Progress = 0.9 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml index 66c98f6..8e1a2ab 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml @@ -7,6 +7,7 @@ PanScroll="{Binding ElementName=PanBack}"> + @@ -29,8 +30,8 @@ - - + @@ -38,7 +39,7 @@ - + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index 8486bbe..c237e84 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -16,7 +16,7 @@ TbExportName.Text = "" TbExportVersion.Text = "" - ComboDisplayLogo.SelectedIndex = 0 + 'ComboDisplayLogo.SelectedIndex = 0 CustomLogoVal = Nothing TbExportDesc.Text = "" End If @@ -270,17 +270,17 @@ End Set End Property - Private Sub ComboDisplayLogo_SelectionChanged(sender As MyComboBox, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged - If Not AniControlEnabled = 0 Then Exit Sub - '选择 自定义 时修改图片 - If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then - Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片") - If String.IsNullOrWhiteSpace(FileName) Then Exit Sub - CustomLogo = FileName - Else - CustomLogo = sender.SelectedItem.Tag - End If - End Sub + 'Private Sub ComboDisplayLogo_SelectionChanged(sender As MyComboBox, e As SelectionChangedEventArgs) Handles ComboDisplayLogo.SelectionChanged + ' If Not AniControlEnabled = 0 Then Exit Sub + ' '选择 自定义 时修改图片 + ' If ComboDisplayLogo.SelectedItem Is ItemDisplayLogoCustom Then + ' Dim FileName As String = SelectFile("常用图片文件(*.png;*.jpg;*.gif)|*.png;*.jpg;*.gif", "选择图片") + ' If String.IsNullOrWhiteSpace(FileName) Then Exit Sub + ' CustomLogo = FileName + ' Else + ' CustomLogo = sender.SelectedItem.Tag + ' End If + 'End Sub #End Region #Region "基本信息" From fc1519e9b10507aa31af1f785d71d059c864d720 Mon Sep 17 00:00:00 2001 From: youzi-3222 Date: Mon, 3 Feb 2025 21:53:49 +0800 Subject: [PATCH 47/47] =?UTF-8?q?:ok=5Fhand:=20:bug:=20:sparkles:=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=20@MoYuan-CN=20=E7=9A=84=20Review=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B7=B2=E7=9F=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 62 +++++++++++-------- .../PageVersion/PageVersionExport.xaml.vb | 4 +- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 9a380b0..614543b 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -958,39 +958,36 @@ Retry: End Function #Region "冗余" - Private VersionRedundant As String() = {"screenshots", "backups", "command_history\.txt", '个人文件 - ".*-natives", "server-resource-packs", "user.*cache\.json", "\.optifine", "\.fabric", "\.mixin\.out", '缓存 - ".*\.jar", "downloads", "realms_persistence.json", "\$\{natives_directory\}", "essential", '可联网更新 - "logs", "crash-reports", ".*\.log", "debug", '日志 - ".*\.dat_old", ".*\.old", '备份 - "\$\{quickPlayPath\}", '服务器 - "\.replay_cache", "replay_recordings", "replay_videos", 'ReplayMod - "irisUpdateInfo\.json", 'Iris - "modernfix", 'ModernFix 模组 - "modtranslations", 'Mod 翻译 - "schematics", 'schematics 模组 - ".*\.BakaCoreInfo", 'BakaXL 配置 - "hmclversion\.cfg", "log4j2\.xml", 'HMCL 配置 - "assets", "libraries", "\$natives", "launcher_profiles\.json", "versions" '开启版本隔离时排除的文件 + Private VersionRedundant As String() = {"^screenshots", "^backups", "^command_history\.txt$", '个人文件 + "^.*-natives", "^server-resource-packs", "^user.*cache\.json$", "^\.optifine", "^\.fabric", "^\.mixin\.out", '缓存 + "^.*\.jar$", "^downloads", "^realms_persistence.json$", "^\$\{natives_directory\}", "^essential", '可联网更新 + "^logs", "^crash-reports", ".*\.log$", "^debug", '日志 + ".*\.dat_old$", ".*\.old$", '备份 + "^\$\{quickPlayPath\}", '服务器 + "^\.replay_cache", "^replay_recordings", "^replay_videos", 'ReplayMod + "^irisUpdateInfo\.json$", 'Iris + "^modernfix", 'ModernFix 模组 + "^modtranslations", 'Mod 翻译 + "^schematics", 'schematics 模组 + "^journeymap\\data", 'JourneyMap 模组 + "^mods\\\.connector", '信雅互联 + "^.*\.BakaCoreInfo$", 'BakaXL 配置 + "^hmclversion\.cfg$", "^log4j2\.xml$", 'HMCL 配置 + "^assets$", "^libraries$", "^\$natives$", "^launcher_profiles\.json$", "^versions$" '开启版本隔离时排除的文件 } - Public Function IsVerRedundant(FilePath As String) As Boolean + Public Function IsVerRedundant(FilePath As String, PathIndie 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.EndsWithF("\journeymap\data\") OrElse - FilePath.EndsWithF("\journeymap\data") OrElse - FilePath.EndsWithF("\mods\.connector") Then - Return True - End If + If RegexCheck(FilePath.Replace(PathIndie, ""), regex, RegularExpressions.RegexOptions.IgnoreCase) Then Return True Next Return False End Function Private MustExport As String() = { "mods", "PCL", ".*\.json" } - Public Function IsMustExport(FilePath As String) As Boolean + Public Function IsMustExport(FilePath As String, PathIndie As String) As Boolean For Each regex In MustExport - If RegexCheck(GetFileNameFromPath(FilePath), regex, RegularExpressions.RegexOptions.IgnoreCase) Then Return True + If RegexCheck(FilePath.Replace(PathIndie, ""), regex, RegularExpressions.RegexOptions.IgnoreCase) AndAlso Not (FilePath.EndsWithF(".zip") OrElse FilePath.EndsWithF("\")) Then Return True Next Return False End Function @@ -1148,11 +1145,26 @@ JumpMod: If String.IsNullOrWhiteSpace(p) Then Continue For '传空字串进去会直接把整个版本文件夹拷过去 If Not p.StartsWithF(GetPathFromFullPath(GetPathFromFullPath(Version.Path)), IgnoreCase:=True) Then Continue For Dim relative As String = p.Replace(Version.Path, "").Replace(GetPathFromFullPath(GetPathFromFullPath(Version.Path)), "") - If File.Exists(p) AndAlso Not IsVerRedundant(p) Then + If File.Exists(p) AndAlso Not IsVerRedundant(p, Version.PathIndie) Then CopyFile(p, $"{tempDir}overrides\{relative}") End If Next - Task.Progress = 0.99 + Task.Progress = 0.96 + + '如果 resourcepacks shaderpacks 文件夹中有文件夹格式的包,则先将文件夹压缩成 Zip 文件后再打包入对应位置 + '这可以避免安装时出现路径长度限制而出错 + If Directory.Exists($"{tempDir}overrides\resourcepacks\") Then + For Each d In Directory.EnumerateDirectories($"{tempDir}overrides\resourcepacks\") + If Not File.Exists(d + ".zip") Then ZipFile.CreateFromDirectory(d, d + ".zip") + DeleteDirectory(d) + Next + End If + If Directory.Exists($"{tempDir}overrides\shaderpacks\") Then + For Each d In Directory.EnumerateDirectories($"{tempDir}overrides\shaderpacks\") + If Not File.Exists(d + ".zip") Then ZipFile.CreateFromDirectory(d, d + ".zip") + DeleteDirectory(d) + Next + End If #End Region If File.Exists(DestPath) Then File.Delete(DestPath) '选择文件的时候已经确认了要替换 diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb index c237e84..13b514e 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb @@ -75,7 +75,7 @@ For Each d In directories If Directory.EnumerateFileSystemEntries(d).Count = 0 Then Continue For - If IsVerRedundant(d) OrElse IsMustExport(d) Then Continue For + If IsVerRedundant(d, PageVersionLeft.Version.PathIndie) OrElse IsMustExport(d, PageVersionLeft.Version.PathIndie) Then Continue For Dim title As String = "" Dim listItem As New MyListItem If Titles.TryGetValue(GetFolderNameFromPath(d), title) Then 'title 作为引用类型传入 @@ -107,7 +107,7 @@ Next For Each f In files - If IsVerRedundant(f) OrElse IsMustExport(f) Then Continue For + If IsVerRedundant(f, PageVersionLeft.Version.PathIndie) OrElse IsMustExport(f, PageVersionLeft.Version.PathIndie) Then Continue For Dim title As String = "" Dim listItem As New MyListItem If Titles.TryGetValue(f, title) Then 'title 作为引用类型传入