diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb
index fa1e8741a..7ae0a5b1d 100644
--- a/Plain Craft Launcher 2/FormMain.xaml.vb
+++ b/Plain Craft Launcher 2/FormMain.xaml.vb
@@ -927,6 +927,9 @@ Public Class FormMain
DownloadLiteLoader = 9
DownloadMod = 11
DownloadPack = 12
+ DownloadResourcePack = 13
+ DownloadShader = 14
+ DownloadDataPack = 15
SetupLaunch = 0
SetupUI = 1
SetupSystem = 2
@@ -963,8 +966,16 @@ Public Class FormMain
Return "Mod 下载 - " & Project.TranslatedName
Case CompType.ModPack
Return "整合包下载 - " & Project.TranslatedName
- Case Else 'CompType.ResourcePack
+ 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
+ Return "光影包下载 - " & Project.TranslatedName
End Select
Case PageType.HelpDetail
Dim Entry As HelpEntry = Stack.Additional(0)
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb
index 59ad53e15..41a68ff54 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb
@@ -13,6 +13,14 @@
''' 资源包。
'''
ResourcePack = 2
+ '''
+ ''' 光影包。
+ '''
+ Shader = 3
+ '''
+ ''' 数据包。
+ '''
+ DataPack = 4
End Enum
Public Enum CompModLoaderType
'https://docs.curseforge.com/?http#tocS_ModLoaderType
@@ -114,6 +122,10 @@
'''
Public ReadOnly Type As CompType
'''
+ ''' 是否为 Mod / 数据包融合工程。
+ '''
+ Public ReadOnly IsMix As Boolean
+ '''
''' 工程的短名。例如 technical-enchant。
'''
Public ReadOnly Slug As String
@@ -279,8 +291,14 @@
Type = CompType.Mod
ElseIf Website.Contains("/modpacks/") Then
Type = CompType.ModPack
- Else
+ ElseIf Website.Contains("/resourcepacks/") Then
+ Type = CompType.ResourcePack
+ ElseIf Website.Contains("/texture-packs/") Then
Type = CompType.ResourcePack
+ ElseIf Website.Contains("/shaders/")
+ Type = CompType.Shader
+ Else
+ Type = CompType.DataPack
End If
'Tags
Tags = New List(Of String)
@@ -328,7 +346,36 @@
Case 4480 : Tags.Add("基于地图")
Case 4481 : Tags.Add("轻量")
Case 4482 : Tags.Add("大型")
- 'FUTURE: Res
+ '数据包
+ 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("幻想")
+ Case 6555 : Tags.Add("原版风")
+ '资源包
+ Case 5244 : Tags.Add("字体包")
+ Case 5193 : Tags.Add("数据包")
+ Case 399 : Tags.Add("蒸汽朋克")
+ Case 396 : Tags.Add("128x")
+ Case 398 : Tags.Add("512x 或更高")
+ Case 397 : Tags.Add("256x")
+ Case 405 : Tags.Add("其他")
+ Case 395 : Tags.Add("64x")
+ Case 400 : Tags.Add("仿真")
+ Case 393 : Tags.Add("16x")
+ Case 403 : Tags.Add("传统")
+ Case 394 : Tags.Add("32x")
+ Case 404 : Tags.Add("动态效果")
+ Case 4465 : Tags.Add("模组支持")
+ Case 402 : Tags.Add("中世纪")
+ Case 401 : Tags.Add("现代")
End Select
Next
If Not Tags.Any() Then Tags.Add("杂项")
@@ -356,7 +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)
@@ -404,7 +457,83 @@
Case "adventure" : Tags.Add("冒险")
Case "kitchen-sink" : Tags.Add("水槽包/大杂烩")
Case "lightweight" : Tags.Add("轻量")
- 'FUTURE: Res
+ '数据包
+ 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")
+ Case "fantasy" : Tags.Add("幻想")
+ Case "realistic" : Tags.Add("写实")
+ Case "semi-realistic" : Tags.Add("半写实")
+ Case "vanilla-like" : Tags.Add("原版风")
+
+ Case "atmosphere" : Tags.Add("大气环境")
+ Case "bloom" : Tags.Add("植被")
+ Case "colored-lighting" : Tags.Add("光源着色")
+ Case "foliage" : Tags.Add("树叶")
+ Case "path-tracing" : Tags.Add("路径追踪")
+ Case "pbr" : Tags.Add("PBR")
+ Case "reflections" : Tags.Add("反射")
+ Case "shadows" : Tags.Add("阴影")
+
+ Case "potato" : Tags.Add("土豆画质")
+ Case "low" : Tags.Add("低性能影响")
+ Case "medium" : Tags.Add("中性能影响")
+ Case "high" : Tags.Add("高性能影响")
+ Case "screenshot" : Tags.Add("极致画质")
+
+ Case "canvas" : Tags.Add("Canvas")
+ Case "iris" : Tags.Add("Iris")
+ Case "optifine" : Tags.Add("OptiFine")
+ Case "vanilla" : Tags.Add("原版光影")
+ '资源包
+ Case "8x-" : Tags.Add("8x-")
+ Case "16x" : Tags.Add("16x")
+ Case "32x" : Tags.Add("32x")
+ Case "48x" : Tags.Add("48x")
+ Case "64x" : Tags.Add("64x")
+ Case "128x" : Tags.Add("128x")
+ Case "256x" : Tags.Add("256x")
+ Case "512x+" : Tags.Add("512x+")
+ Case "audio" : Tags.Add("声音")
+ Case "blocks" : Tags.Add("方块")
+ Case "combat" : Tags.Add("战斗")
+ Case "core-shaders" : Tags.Add("核心着色器")
+ Case "cursed" : Tags.Add("Cursed")
+ Case "decoration" : Tags.Add("装饰")
+ Case "entities" : Tags.Add("实体")
+ Case "environment" : Tags.Add("环境")
+ Case "equipment" : Tags.Add("装备")
+ Case "fonts" : Tags.Add("字体")
+ Case "gui" : Tags.Add("GUI")
+ Case "items" : Tags.Add("物品")
+ Case "locale" : Tags.Add("本地化")
+ Case "modded" : Tags.Add("Modded")
+ Case "models" : Tags.Add("模型")
+ Case "realistic" : Tags.Add("写实")
+ Case "simplistic" : Tags.Add("扁平")
+ Case "themed" : Tags.Add("主题")
+ Case "tweaks" : Tags.Add("优化")
+ Case "utility" : Tags.Add("实用")
+ Case "vanilla-like" : Tags.Add("类原生")
End Select
Next
If Not Tags.Any() Then Tags.Add("杂项")
@@ -775,8 +904,12 @@ 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
- 'FUTURE: Res
+ Address += "&classId=12"
End Select
Address += "&categoryId=" & If(Tag = "", "0", Tag.BeforeFirst("/"))
If ModLoader <> CompModLoaderType.Any Then Address += "&modLoaderType=" & CType(ModLoader, Integer)
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb b/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb
index 34e7ab2b5..872ff8912 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb
@@ -115,9 +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(PageDownloadResourcePack.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 5eda3e17a..2daca5220 100644
--- a/Plain Craft Launcher 2/Modules/ModMain.vb
+++ b/Plain Craft Launcher 2/Modules/ModMain.vb
@@ -405,6 +405,9 @@ 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
'设置页面声明
Public FrmSetupLeft As PageSetupLeft
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb
index c8557a8f4..4ff13bfae 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb
@@ -289,7 +289,14 @@
RunInNewThread(
Sub()
Try
- Dim Desc As String = If(Project.Type = CompType.ModPack, "整合包", If(Project.Type = CompType.Mod, "Mod ", "资源包"))
+ Dim Desc As String = "资源"
+ Select Case Project.Type
+ 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
'确认默认保存位置
Dim DefaultFolder As String = Nothing
If Project.Type = CompType.Mod Then
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 000000000..ea526766e
--- /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 000000000..3adc461dd
--- /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 86c9ef2d0..9ab650c19 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml
@@ -71,21 +71,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb
index f2eb250e1..b831512e4 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
+ 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,15 @@
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
+ Case FormMain.PageSubType.DownloadResourcePack
+ If FrmDownloadResourcePack Is Nothing Then FrmDownloadResourcePack = New PageDownloadResourcePack
+ Return FrmDownloadResourcePack
Case Else
Throw New Exception("未知的下载子页面种类:" & ID)
End Select
@@ -123,6 +132,24 @@
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
+ CompProjectCache.Clear()
+ If FrmDownloadShader IsNot Nothing Then FrmDownloadShader.PageLoaderRestart()
+ ItemShader.Checked = True
+ Case FormMain.PageSubType.DownloadResourcePack
+ PageDownloadResourcePack.Storage = New CompProjectStorage
+ PageDownloadResourcePack.Page = 0
+ CompProjectCache.Clear()
+ If FrmDownloadResourcePack IsNot Nothing Then FrmDownloadResourcePack.PageLoaderRestart()
+ ItemResourcePack.Checked = True
Case FormMain.PageSubType.DownloadClient
DlClientListLoader.Start(IsForceRestart:=True)
ItemClient.Checked = True
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadResourcePack.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadResourcePack.xaml
new file mode 100644
index 000000000..6ce439f21
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadResourcePack.xaml
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadResourcePack.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadResourcePack.xaml.vb
new file mode 100644
index 000000000..41c5c7bcb
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadResourcePack.xaml.vb
@@ -0,0 +1,124 @@
+Public Class PageDownloadResourcePack
+
+ Public Const PageSize = 40
+
+ '加载器信息
+ Public Shared Loader As New LoaderTask(Of CompProjectRequest, Integer)("CompProject ResourcePack", AddressOf CompProjectsGet, AddressOf LoaderInput) With {.ReloadTimeout = 60 * 1000}
+ Public Shared Storage As New CompProjectStorage
+ Public Shared Page As Integer = 0
+ Private Sub PageDownloadResourcePack_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.ResourcePack, Storage, (Page + 1) * PageSize)
+ If FrmDownloadResourcePack IsNot Nothing Then
+ With Request
+ .SearchText = FrmDownloadResourcePack.TextSearchName.Text
+ .GameVersion = If(FrmDownloadResourcePack.TextSearchVersion.Text = "全部 (也可自行输入)", Nothing,
+ If(FrmDownloadResourcePack.TextSearchVersion.Text.Contains(".") OrElse FrmDownloadResourcePack.TextSearchVersion.Text.Contains("w"), FrmDownloadResourcePack.TextSearchVersion.Text, Nothing))
+ .Tag = FrmDownloadResourcePack.ComboSearchTag.SelectedItem.Tag
+ .Source = CType(Val(FrmDownloadResourcePack.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(Page > 1, 1, 0.2)
+ BtnPageLeft.IsEnabled = Page > 0
+ BtnPageLeft.Opacity = If(Page > 0, 1, 0.2)
+ Dim IsRightEnabled As Boolean = '由于 WPF 的未知 bug,读取到的 IsEnabled 可能是错误的值(#3319)
+ Storage.Results.Count > PageSize * (Page + 1) OrElse
+ Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal
+ BtnPageRight.IsEnabled = IsRightEnabled
+ BtnPageRight.Opacity = If(IsRightEnabled, 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/PageDownloadShader.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadShader.xaml
new file mode 100644
index 000000000..67b3a07ac
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadShader.xaml
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadShader.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadShader.xaml.vb
new file mode 100644
index 000000000..13a58c9f4
--- /dev/null
+++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadShader.xaml.vb
@@ -0,0 +1,122 @@
+Public Class PageDownloadShader
+
+ 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.Shader, Storage, (Page + 1) * PageSize)
+ If FrmDownloadShader IsNot Nothing Then
+ With Request
+ .SearchText = FrmDownloadShader.TextSearchName.Text
+ .GameVersion = If(FrmDownloadShader.TextSearchVersion.Text = "全部 (也可自行输入)", Nothing,
+ If(FrmDownloadShader.TextSearchVersion.Text.Contains(".") OrElse FrmDownloadShader.TextSearchVersion.Text.Contains("w"), FrmDownloadShader.TextSearchVersion.Text, Nothing))
+ .Tag = FrmDownloadShader.ComboSearchTag.SelectedItem.Tag
+ .Source = CType(Val(FrmDownloadShader.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/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj
index 5cd0ffce5..0edfa1fc0 100644
--- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj
+++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj
@@ -195,9 +195,6 @@
MyIconTextButton.xaml
-
-
-
@@ -242,6 +239,12 @@
MyCompItem.xaml
+
+ PageDownloadDataPack.xaml
+
+
+ PageDownloadResourcePack.xaml
+
PageDownloadMod.xaml
@@ -260,6 +263,9 @@
PageDownloadPack.xaml
+
+ PageDownloadShader.xaml
+
MyMsgLogin.xaml
@@ -489,7 +495,6 @@
FormMain.xaml
Code
-
MSBuild:Compile
Designer
@@ -498,6 +503,14 @@
MSBuild:Compile
Designer
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
Designer
MSBuild:Compile
@@ -522,6 +535,10 @@
Designer
MSBuild:Compile
+
+ MSBuild:Compile
+ Designer
+
MSBuild:Compile
Designer
@@ -929,7 +946,6 @@
-
@@ -942,4 +958,4 @@
-
\ No newline at end of file
+