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