diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index b1df6c3..d5cfe70 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -721,6 +721,108 @@ #End Region +#Region "DlNeoForgeList | NeoForge Minecraft 版本列表" + + Public Structure DlNeoForgeListResult + ''' + ''' 数据来源名称,如“Official”,“BMCLAPI”。 + ''' + Public SourceName As String + ''' + ''' 是否为官方的实时数据。 + ''' + Public IsOfficial As Boolean + ''' + ''' 获取到的数据。 + ''' + Public Value As List(Of String) + End Structure + + ''' + ''' NeoForge 版本列表,主加载器。 + ''' + Public DlNeoForgeListLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Main", AddressOf DlNeoForgeListMain) + Private Sub DlNeoForgeListMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) + Select Case Setup.Get("ToolDownloadVersion") + Case 0 + DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From { + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 30), + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60) + }, Loader.IsForceRestarting) + Case 1 + DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From { + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 5), + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 35) + }, Loader.IsForceRestarting) + Case Else + DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From { + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60), + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60) + }, Loader.IsForceRestarting) + End Select + End Sub + + ''' + ''' NeoForge 版本列表,官方源。 + ''' + Public DlNeoForgeListOfficialLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Official", AddressOf DlNeoForgeListOfficialMain) + Private Sub DlNeoForgeListOfficialMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) + 'Dim Result As String = NetGetCodeByRequestRetry("https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.2.4.html", Encoding.Default, "text/html", UseBrowserUserAgent:=True) + 'If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") + ''获取所有版本信息 + 'Dim Names As List(Of String) = RegexSearch(Result, "(?<=a href=""index_)[0-9.]+(_pre[0-9]?)?(?=.html)") + 'If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")") + 'Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", .Value = Names} + Dim ResultLatest As String + Dim VersionsJArray As JArray + Try + ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) + Catch ex As Exception + If GetExceptionSummary(ex).Contains("(404)") Then + Throw New Exception("没有可用版本") + Else + Throw + End If + End Try + If ResultLatest.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") + VersionsJArray = GetJson(ResultLatest)("versions") + Dim Versions As List(Of String) = New List(Of String) + Versions.Add("1.20.1") + Try + For Each Token As String In VersionsJArray + Dim Version As String = Token.ToString().Replace("neoforge-", "") + Dim Inherit As String = "1." & Version.ToString().Split(".")(0) & "." & Token.ToString().Split(".")(1) + If Inherit.EndsWith(".0") Then + Inherit = Inherit.Replace(".0", "") + End If + If Versions.Contains(Inherit) Then + Continue For + Else + Versions.Add(Inherit) + End If + Next + Catch ex As Exception + MyMsgBox(ex.ToString(), "错误") + Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex) + End Try + If Not Versions.Any() Then Throw New Exception("没有可用版本") + Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", .Value = Versions} + End Sub + + ''' + ''' NeoForge 版本列表,BMCLAPI。 + ''' + 'Public DlNeoForgeListBmclapiLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Bmclapi", AddressOf DlNeoForgeListBmclapiMain) + 'Private Sub DlNeoForgeListBmclapiMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) + ' Dim Result As String = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/forge/minecraft", Encoding.Default) + ' If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") + ' '获取所有版本信息 + ' Dim Names As List(Of String) = RegexSearch(Result, "[0-9.]+(_pre[0-9]?)?") + ' If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")") + ' Loader.Output = New DlNeoForgeListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Names} + 'End Sub +#End Region + #Region "DlNeoForgeVersion | NeoForge 版本列表" Public Class DlNeoForgeVersionEntry @@ -811,7 +913,6 @@ ''' ''' NeoForge 版本列表,主加载器。 ''' - Public DlNeoForgeListLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeList Main", AddressOf DlNeoForgeVersionMain) Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) 'BMCLAPI 不会返回完整的 NeoForge 版本列表,而貌似也没有办法获取 NeoForge 支持的所有 Minecraft 版本 Dim DlNeoForgeVersionOfficialLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Official", AddressOf DlNeoForgeVersionOfficialMain) Dim DlNeoForgeVersionBmclapiLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Bmclapi", AddressOf DlNeoForgeVersionBmclapiMain) @@ -838,10 +939,15 @@ ''' NeoForge 版本列表,官方源。 ''' Public Sub DlNeoForgeVersionOfficialMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) - Dim Result As String - Dim ResultJson As JObject + Dim ResultLatest As String + Dim ResultLegacy As String + Dim ResultJson As String + Dim ResultLatestJson As JObject + Dim ResultLegacyJson As JObject + Dim VersionsJArray As JArray Try - Result = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) + ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) + ResultLegacy = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/forge", UseBrowserUserAgent:=True) Catch ex As Exception If GetExceptionSummary(ex).Contains("(404)") Then Throw New Exception("没有可用版本") @@ -849,10 +955,52 @@ Throw End If End Try - If Result.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") - ResultJson = GetJson(Result) - Dim VersionArray As Array = ResultJson("versions") + If ResultLatest.Length < 50 AndAlso ResultLegacy.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") + ResultLatestJson = GetJson(ResultLatest) + ResultLegacyJson = GetJson(ResultLegacy) + If Loader.Input IsNot Nothing Then + If Loader.Input Is "1.20.1" Then + VersionsJArray = ResultLegacyJson("versions") + Else + VersionsJArray = ResultLatestJson("versions") + End If + Else + VersionsJArray = ResultLatestJson("versions") + End If Dim Versions As New List(Of DlNeoForgeVersionEntry) + Try + For Each Token As String In VersionsJArray + Dim StdVersion As String + Dim IsBeta As Boolean + Dim rawVersion As String = Token.ToString() + If rawVersion.Contains("-beta") Then + StdVersion = Token.ToString().Replace("neoforge-", "").Replace("-beta", "") + IsBeta = True + Else + StdVersion = Token.ToString().Replace("neoforge-", "") + IsBeta = False + End If + Dim Inherit As String = "1." & StdVersion.ToString().Split(".")(0) & "." & StdVersion.ToString().Split(".")(1) + If Inherit.EndsWith(".0") Then + Inherit = Inherit.Replace(".0", "") + End If + Dim Entry = New DlNeoForgeVersionEntry + If Loader.Input IsNot Nothing Then + If Inherit Is Loader.Input Then + Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Versions.Add(Entry) + Continue For + Else + Continue For + End If + End If + Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Versions.Add(Entry) + Next + Catch ex As Exception + MyMsgBox(ex.ToString(), "错误") + Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex) + End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") Loader.Output = Versions End Sub @@ -865,8 +1013,7 @@ Dim Versions As New List(Of DlNeoForgeVersionEntry) Try For Each Token As JObject In Json - Dim Name As String '存储 rawVersion,貌似变化更加频繁 - Dim StdVersion As String '存储 version,相对规则 + Dim StdVersion As String Dim IsBeta As Boolean Dim rawVersion As String = Token("rawVersion") If rawVersion.Contains("-beta") Then @@ -876,9 +1023,8 @@ StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("1.20.1-", "") IsBeta = False End If - Name = rawVersion Dim Inherit As String = Token("mcversion") - Dim Entry = New DlNeoForgeVersionEntry With {.Version = Name, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Dim Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} Versions.Add(Entry) Next Catch ex As Exception diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 7f85806..f6d2f4e 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2187,16 +2187,28 @@ Retry: #Region "NeoForge 下载菜单" Public Sub NeoForgeDownloadListItemPreload(Stack As StackPanel, Entrys As List(Of DlNeoForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) - '获取最新版本 - Dim FreshVersion As DlNeoForgeVersionEntry = Nothing + '获取最新稳定版和测试版 + Dim FreshStableVersion As DlNeoForgeVersionEntry = Nothing + Dim FreshBetaVersion As DlNeoForgeVersionEntry = Nothing If Entrys.Any Then - FreshVersion = Entrys.Last() + For Each Entry In Entrys + If Entry.IsBeta Then + FreshBetaVersion = Entry + Else + FreshStableVersion = Entry + End If + Next Else Log("[System] 未找到可用的 NeoForge 版本", LogLevel.Debug) End If '显示各个版本 - If FreshVersion IsNot Nothing Then - Dim Fresh = NeoForgeDownloadListItem(FreshVersion, OnClick, IsSaveOnly) + If FreshStableVersion IsNot Nothing Then + Dim Fresh = NeoForgeDownloadListItem(FreshStableVersion, OnClick, IsSaveOnly) + Fresh.Info = "最新版" & If(Fresh.Info = "", "", "," & Fresh.Info) + Stack.Children.Add(Fresh) + End If + If FreshBetaVersion IsNot Nothing Then + Dim Fresh = NeoForgeDownloadListItem(FreshBetaVersion, OnClick, IsSaveOnly) Fresh.Info = "最新版" & If(Fresh.Info = "", "", "," & Fresh.Info) Stack.Children.Add(Fresh) End If diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml index aae4da7..f72fb9d 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml @@ -17,10 +17,11 @@ - + + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb index fcb4491..2e6f3e8 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb @@ -1,7 +1,7 @@ Public Class PageDownloadNeoForge Private Sub LoaderInit() Handles Me.Initialized - PageLoaderInit(Load, PanLoad, CardVersions, CardTip, DlNeoForgeListLoader, AddressOf Load_OnFinish) + PageLoaderInit(Load, PanLoad, PanMain, CardTip, DlNeoForgeListLoader, AddressOf Load_OnFinish) End Sub Private Sub Init() Handles Me.Loaded PanBack.ScrollToHome() @@ -10,21 +10,44 @@ Private Sub Load_OnFinish() '结果数据化 Try - Dim Versions As List(Of DlNeoForgeVersionEntry) = DlNeoForgeListLoader.Output - PanVersions.Children.Clear() - For Each Version In Versions - PanVersions.Children.Add(NeoForgeDownloadListItem(Version, AddressOf NeoForge_Selected, True)) + Dim Versions = Sort(DlNeoForgeListLoader.Output.Value, AddressOf VersionSortBoolean) + 'Dim Versions As List(Of DlNeoForgeVersionEntry) = DlNeoForgeListLoader.Output + PanMain.Children.Clear() + For Each Version As String In Versions + '增加卡片 + Dim NewCard As New MyCard With {.Title = Version.Replace("_p", " P"), .Margin = New Thickness(0, 0, 0, 15), .SwapType = 5} + Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = Version} + NewCard.Children.Add(NewStack) + NewCard.SwapControl = NewStack + NewCard.IsSwaped = True + PanMain.Children.Add(NewCard) Next - CardVersions.Title = "版本列表 (" & Versions.Count & ")" Catch ex As Exception Log(ex, "可视化 NeoForge 版本列表出错", LogLevel.Feedback) End Try End Sub + Public Sub NeoForge_StateChanged(sender As MyLoading, newState As MyLoading.MyLoadingState, oldState As MyLoading.MyLoadingState) + If newState <> MyLoading.MyLoadingState.Stop Then Exit Sub + Dim Card As MyCard = CType(sender.Parent, FrameworkElement).Parent + Dim Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)) = sender.State + '载入列表 + Card.SwapControl.Children.Clear() + Card.SwapControl.Tag = Loader.Output + Card.SwapType = 6 + Card.StackInstall() + End Sub + Public Sub NeoForge_Click(sender As MyLoading, e As MouseButtonEventArgs) + If sender.State.LoadingState = MyLoading.MyLoadingState.Error Then + CType(sender.State, LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))).Start(IsForceRestart:=True) + End If + End Sub Private Sub NeoForge_Selected(sender As MyListItem, e As EventArgs) McDownloadNeoForgeSave(sender.Tag) End Sub - + Public Sub DownloadStart(sender As MyListItem, e As Object) + McDownloadNeoForge(sender.Tag) + End Sub Private Sub BtnWeb_Click(sender As Object, e As EventArgs) Handles BtnWeb.Click OpenWebsite("https://neoforged.net/") End Sub