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