diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 175685e..7ae0a5b 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -929,6 +929,7 @@ Public Class FormMain DownloadPack = 12 DownloadResourcePack = 13 DownloadShader = 14 + DownloadDataPack = 15 SetupLaunch = 0 SetupUI = 1 SetupSystem = 2 @@ -965,6 +966,12 @@ Public Class FormMain Return "Mod 下载 - " & Project.TranslatedName Case CompType.ModPack Return "整合包下载 - " & Project.TranslatedName + Case CompType.DataPack + If Project.IsMix Then + Return "Mod / 数据包下载 - " & Project.TranslatedName + Else + Return "数据包下载 - " & Project.TranslatedName + End If Case CompType.ResourcePack Return "资源包下载 - " & Project.TranslatedName Case Else 'CompType.Shader diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb index bcde80f..41a68ff 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb @@ -17,6 +17,10 @@ ''' 光影包。 ''' Shader = 3 + ''' + ''' 数据包。 + ''' + DataPack = 4 End Enum Public Enum CompModLoaderType 'https://docs.curseforge.com/?http#tocS_ModLoaderType @@ -118,6 +122,10 @@ ''' Public ReadOnly Type As CompType ''' + ''' 是否为 Mod / 数据包融合工程。 + ''' + Public ReadOnly IsMix As Boolean + ''' ''' 工程的短名。例如 technical-enchant。 ''' Public ReadOnly Slug As String @@ -283,10 +291,14 @@ Type = CompType.Mod ElseIf Website.Contains("/modpacks/") Then Type = CompType.ModPack + ElseIf Website.Contains("/resourcepacks/") Then + Type = CompType.ResourcePack ElseIf Website.Contains("/texture-packs/") Then Type = CompType.ResourcePack - Else 'Website.Contains("/shaders/") + ElseIf Website.Contains("/shaders/") Type = CompType.Shader + Else + Type = CompType.DataPack End If 'Tags Tags = New List(Of String) @@ -334,6 +346,15 @@ Case 4480 : Tags.Add("基于地图") Case 4481 : Tags.Add("轻量") Case 4482 : Tags.Add("大型") + '数据包 + Case 6946 : Tags.Add("Mod 支持") + Case 6947 : Tags.Add("杂项") + Case 6948 : Tags.Add("冒险") + Case 6949 : Tags.Add("幻想") + Case 6950 : Tags.Add("支持库") + Case 6951 : Tags.Add("科技") + Case 6952 : Tags.Add("魔法") + Case 6953 : Tags.Add("实用工具") '光影包 Case 6553 : Tags.Add("写实") Case 6554 : Tags.Add("幻想") @@ -355,7 +376,6 @@ Case 4465 : Tags.Add("模组支持") Case 402 : Tags.Add("中世纪") Case 401 : Tags.Add("现代") - End Select Next If Not Tags.Any() Then Tags.Add("杂项") @@ -383,8 +403,13 @@ Case "mod" : Type = CompType.Mod Case "modpack" : Type = CompType.ModPack Case "resourcepack" : Type = CompType.ResourcePack + Case "datapack" : Type = CompType.DataPack Case "shader" : Type = CompType.Shader End Select + If Data("categories").ToArray.Contains("datapack") Then 'Modrinth 上的数据包由于未知原因,返回的 project_type 为 mod,这里做兜底处理 + Type = CompType.DataPack + IsMix = Data("categories").ToArray.Contains("forge") OrElse Data("categories").ToArray.Contains("fabric") OrElse Data("categories").ToArray.Contains("neoforge") OrElse Data("categories").ToArray.Contains("quilt") + End If 'Tags & ModLoaders Tags = New List(Of String) ModLoaders = New List(Of CompModLoaderType) @@ -432,6 +457,26 @@ Case "adventure" : Tags.Add("冒险") Case "kitchen-sink" : Tags.Add("水槽包/大杂烩") Case "lightweight" : Tags.Add("轻量") + '数据包 + Case "adventure" : Tags.Add("冒险") + Case "cursed" : Tags.Add("Cursed") + Case "decoration" : Tags.Add("装饰") + Case "economy" : Tags.Add("经济") + Case "equipment" : Tags.Add("装备") + Case "food" : Tags.Add("食物") + Case "game-mechanics" : Tags.Add("游戏机制") + Case "library" : Tags.Add("支持库") + Case "magic" : Tags.Add("魔法") + Case "management" : Tags.Add("管理") + Case "minigame" : Tags.Add("小游戏") + Case "mobs" : Tags.Add("生物") + Case "optimization" : Tags.Add("优化") + Case "social" : Tags.Add("社交") + Case "storage" : Tags.Add("存储") + Case "technology" : Tags.Add("科技") + Case "transportation" : Tags.Add("交通") + Case "utility" : Tags.Add("实用工具") + Case "worldgen" : Tags.Add("世界生成") '光影包 Case "cartoon" : Tags.Add("卡通") Case "cursed" : Tags.Add("Cursed") @@ -859,6 +904,8 @@ NoSubtitle: Address += "&classId=6" Case CompType.ModPack Address += "&classId=4471" + Case CompType.DataPack + Address += "&classId=6945" Case CompType.Shader Address += "&classId=6552" Case CompType.ResourcePack diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb b/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb index ac7611b..5f3ec5f 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb @@ -115,11 +115,12 @@ TargetLoader = PageDownloadMod.Loader.Input.ModLoader Case CompType.ModPack TargetVersion = If(PageDownloadPack.Loader.Input.GameVersion, "") + Case CompType.DataPack + TargetVersion = If(PageDownloadDataPack.Loader.Input.GameVersion, "") Case CompType.Shader TargetVersion = If(PageDownloadShader.Loader.Input.GameVersion, "") Case Else 'CompType.ResourcePack - 'FUTURE: Res - TargetVersion = "" 'If(PageDownloadResource.Loader.Input.GameVersion, "") + TargetVersion = If(PageDownloadResource.Loader.Input.GameVersion, "") End Select End If If CType(sender.Tag, CompProject).Type <> CompType.Mod Then TargetLoader = CompModLoaderType.Any diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index 697190e..2daca52 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -405,6 +405,7 @@ EndHint: Public FrmDownloadFabric As PageDownloadFabric Public FrmDownloadMod As PageDownloadMod Public FrmDownloadPack As PageDownloadPack + Public FrmDownloadDataPack As PageDownloadDataPack Public FrmDownloadShader As PageDownloadShader Public FrmDownloadResourcePack As PageDownloadResourcePack diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb index 2a1dab3..4ff13bf 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb @@ -294,6 +294,7 @@ Case CompType.ModPack : Desc = "整合包" Case CompType.Mod : Desc = "Mod " Case CompType.ResourcePack : Desc = "资源包" + Case CompType.DataPack : Desc = If(File.FileName.EndsWith(".jar"), "Mod ", "数据包") '有些项目同时包含 Mod 版本和数据包版本 Case CompType.Shader : Desc = "光影包" End Select '确认默认保存位置 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadDataPack.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadDataPack.xaml new file mode 100644 index 0000000..ea52676 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadDataPack.xaml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadDataPack.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadDataPack.xaml.vb new file mode 100644 index 0000000..3adc461 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadDataPack.xaml.vb @@ -0,0 +1,122 @@ +Public Class PageDownloadDataPack + + Public Const PageSize = 40 + + '加载器信息 + Public Shared Loader As New LoaderTask(Of CompProjectRequest, Integer)("CompProject Shader", AddressOf CompProjectsGet, AddressOf LoaderInput) With {.ReloadTimeout = 60 * 1000} + Public Shared Storage As New CompProjectStorage + Public Shared Page As Integer = 0 + Private Sub PageDownloadShader_Inited(sender As Object, e As EventArgs) Handles Me.Initialized + PageLoaderInit(Load, PanLoad, PanContent, PanAlways, Loader, AddressOf Load_OnFinish, AddressOf LoaderInput) + If McVersionHighest = -1 Then McVersionHighest = Math.Max(McVersionHighest, Integer.Parse(CType(TextSearchVersion.Items(1), MyComboBoxItem).Content.ToString.Split(".")(1))) + End Sub + Private Shared Function LoaderInput() As CompProjectRequest + Dim Request As New CompProjectRequest(CompType.DataPack, Storage, (Page + 1) * PageSize) + If FrmDownloadDataPack IsNot Nothing Then + With Request + .SearchText = FrmDownloadDataPack.TextSearchName.Text + .GameVersion = If(FrmDownloadDataPack.TextSearchVersion.Text = "全部 (也可自行输入)", Nothing, + If(FrmDownloadDataPack.TextSearchVersion.Text.Contains(".") OrElse FrmDownloadDataPack.TextSearchVersion.Text.Contains("w"), FrmDownloadDataPack.TextSearchVersion.Text, Nothing)) + .Tag = FrmDownloadDataPack.ComboSearchTag.SelectedItem.Tag + .Source = CType(Val(FrmDownloadDataPack.ComboSearchSource.SelectedItem.Tag), CompSourceType) + End With + End If + Return Request + End Function + + '结果 UI 化 + Private Sub Load_OnFinish() + Try + Log($"[Comp] 开始可视化数据包列表,已储藏 {Storage.Results.Count} 个结果,当前在第 {Page + 1} 页") + '列表项 + PanProjects.Children.Clear() + For i = Math.Min(Page * PageSize, Storage.Results.Count - 1) To Math.Min((Page + 1) * PageSize - 1, Storage.Results.Count - 1) + PanProjects.Children.Add(Storage.Results(i).ToCompItem(Loader.Input.GameVersion Is Nothing, False)) + Next + '页码 + CardPages.Visibility = If(Storage.Results.Count > 40 OrElse + Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal, + Visibility.Visible, Visibility.Collapsed) + LabPage.Text = Page + 1 + BtnPageFirst.IsEnabled = Page > 1 + BtnPageFirst.Opacity = If(BtnPageFirst.IsEnabled, 1, 0.2) + BtnPageLeft.IsEnabled = Page > 0 + BtnPageLeft.Opacity = If(BtnPageLeft.IsEnabled, 1, 0.2) + BtnPageRight.IsEnabled = Storage.Results.Count > PageSize * (Page + 1) OrElse + Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal + BtnPageRight.Opacity = If(BtnPageRight.IsEnabled, 1, 0.2) + '错误信息 + If Storage.ErrorMessage Is Nothing Then + HintError.Visibility = Visibility.Collapsed + Else + HintError.Visibility = Visibility.Visible + HintError.Text = Storage.ErrorMessage + End If + '强制返回顶部 + PanBack.ScrollToTop() + Catch ex As Exception + Log(ex, "可视化数据包列表出错", LogLevel.Feedback) + End Try + End Sub + + '自动重试 + Private Sub Load_State(sender As Object, state As MyLoading.MyLoadingState, oldState As MyLoading.MyLoadingState) Handles Load.StateChanged + Select Case Loader.State + Case LoadState.Failed + Dim ErrorMessage As String = "" + If Loader.Error IsNot Nothing Then ErrorMessage = Loader.Error.Message + If ErrorMessage.Contains("不是有效的 JSON 文件") Then + Log("[Download] 下载的数据包列表 JSON 文件损坏,已自动重试", LogLevel.Debug) + PageLoaderRestart() + End If + End Select + End Sub + + '切换页码 + + Private Sub BtnPageFirst_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageFirst.Click + ChangePage(0) + End Sub + Private Sub BtnPageLeft_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageLeft.Click + ChangePage(Page - 1) + End Sub + Private Sub BtnPageRight_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageRight.Click + ChangePage(Page + 1) + End Sub + Private Sub ChangePage(NewPage As Integer) + CardPages.IsEnabled = False + Page = NewPage + FrmMain.BackToTop() + Log($"[Download] 数据包切换到第 {Page + 1} 页") + RunInThread(Sub() + Thread.Sleep(100) '等待向上滚的动画结束 + RunInUi(Sub() CardPages.IsEnabled = True) + Loader.Start() + End Sub) + End Sub + +#Region "搜索" + + '搜索按钮 + Private Sub StartNewSearch() Handles BtnSearchRun.Click + Page = 0 + If Loader.ShouldStart(LoaderInput()) Then Storage = New CompProjectStorage '避免连续搜索两次使得 CompProjectStorage 引用丢失(#1311) + Loader.Start() + End Sub + Private Sub EnterTrigger(sender As Object, e As KeyEventArgs) Handles TextSearchName.KeyDown, TextSearchVersion.KeyDown + If e.Key = Key.Enter Then StartNewSearch() + End Sub + + '重置按钮 + Private Sub BtnSearchReset_Click(sender As Object, e As EventArgs) Handles BtnSearchReset.Click + TextSearchName.Text = "" + TextSearchVersion.Text = "全部 (也可自行输入)" + TextSearchVersion.SelectedIndex = 0 + ComboSearchSource.SelectedIndex = 0 + ComboSearchTag.SelectedIndex = 0 + Loader.LastFinishedTime = 0 '要求强制重新开始 + End Sub + +#End Region + +End Class diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml index 8b547ad..42056fd 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml @@ -117,6 +117,14 @@ + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb index dc89486..b831512 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb @@ -11,7 +11,7 @@ ''' ''' 勾选事件改变页面。 ''' - Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemInstall.Check, ItemClient.Check, ItemOptiFine.Check, ItemForge.Check, ItemNeoForge.Check, ItemLiteLoader.Check, ItemMod.Check, ItemFabric.Check, ItemPack.Check, ItemShader.Check, ItemResourcePack.Check + Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemInstall.Check, ItemClient.Check, ItemOptiFine.Check, ItemForge.Check, ItemNeoForge.Check, ItemLiteLoader.Check, ItemMod.Check, ItemFabric.Check, ItemPack.Check, ItemDataPack.Check, ItemShader.Check, ItemResourcePack.Check '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0 '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag)) @@ -47,6 +47,9 @@ Case FormMain.PageSubType.DownloadPack If FrmDownloadPack Is Nothing Then FrmDownloadPack = New PageDownloadPack Return FrmDownloadPack + Case FormMain.PageSubType.DownloadDataPack + If FrmDownloadDataPack Is Nothing Then FrmDownloadDataPack = New PageDownloadDataPack + Return FrmDownloadDataPack Case FormMain.PageSubType.DownloadShader If FrmDownloadShader Is Nothing Then FrmDownloadShader = New PageDownloadShader Return FrmDownloadShader @@ -129,6 +132,12 @@ CompFilesCache.Clear() If FrmDownloadPack IsNot Nothing Then FrmDownloadPack.PageLoaderRestart() ItemPack.Checked = True + Case FormMain.PageSubType.DownloadDataPack + PageDownloadDataPack.Storage = New CompProjectStorage + PageDownloadDataPack.Page = 0 + CompProjectCache.Clear() + If FrmDownloadDataPack IsNot Nothing Then FrmDownloadDataPack.PageLoaderRestart() + ItemDataPack.Checked = True Case FormMain.PageSubType.DownloadShader PageDownloadShader.Storage = New CompProjectStorage PageDownloadShader.Page = 0 diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index f2ea5d4..4e8c425 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -239,6 +239,9 @@ MyCompItem.xaml + + PageDownloadDataPack.xaml + PageDownloadResourcePack.xaml @@ -503,6 +506,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + MSBuild:Compile Designer