Parcourir la source

ui: 添加 NeoForge 手动安装 Tab
feat: NeoForge 自动安装 Stage 1
fix: StdVersion 可能错误地包含了 "neoforge-" 前缀
fix: 自动安装选择 NeoForge 时自动生成的核心名称存在重复字符串

Pigeon0v0 il y a 2 ans
Parent
commit
0e0335e688

+ 1 - 0
Plain Craft Launcher 2/FormMain.xaml.vb

@@ -1019,6 +1019,7 @@ Install:
         DownloadClient = 4
         DownloadClient = 4
         DownloadOptiFine = 5
         DownloadOptiFine = 5
         DownloadForge = 6
         DownloadForge = 6
+        DownloadNeoForge = 13
         DownloadFabric = 7
         DownloadFabric = 7
         DownloadLiteLoader = 8
         DownloadLiteLoader = 8
         DownloadMod = 10
         DownloadMod = 10

+ 5 - 5
Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb

@@ -725,7 +725,7 @@
 
 
     Public Class DlNeoForgeVersionEntry
     Public Class DlNeoForgeVersionEntry
         ''' <summary>
         ''' <summary>
-        ''' 完整的版本名,如 “14.22.1.2478”。
+        ''' 完整的版本名,如 “neoforge-20.4.30-beta”。
         ''' </summary>
         ''' </summary>
         Public Version As String
         Public Version As String
         ''' <summary>
         ''' <summary>
@@ -753,7 +753,7 @@
         ''' </summary>
         ''' </summary>
         Public IsBeta As Boolean = False
         Public IsBeta As Boolean = False
         ''' <summary>
         ''' <summary>
-        ''' 标准的版本号
+        ''' 标准的版本号,如 “20.4.30”。
         ''' </summary>
         ''' </summary>
         Public StdVersion As String
         Public StdVersion As String
         Public Structure DlNeoForgeListResult
         Public Structure DlNeoForgeListResult
@@ -820,10 +820,10 @@
             End Get
             End Get
         End Property
         End Property
     End Class
     End Class
-
     ''' <summary>
     ''' <summary>
     ''' NeoForge 版本列表,主加载器。
     ''' NeoForge 版本列表,主加载器。
     ''' </summary>
     ''' </summary>
+    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)))
     Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)))
         Dim DlNeoForgeVersionOfficialLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Official", AddressOf DlNeoForgeVersionOfficialMain)
         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)
         Dim DlNeoForgeVersionBmclapiLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Bmclapi", AddressOf DlNeoForgeVersionBmclapiMain)
@@ -882,10 +882,10 @@
                 Dim IsBeta As Boolean
                 Dim IsBeta As Boolean
                 Dim rawVersion As String = Token("rawVersion")
                 Dim rawVersion As String = Token("rawVersion")
                 If rawVersion.Contains("-beta") Then
                 If rawVersion.Contains("-beta") Then
-                    StdVersion = Token("version").ToString().Replace("-beta", "")
+                    StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("-beta", "")
                     IsBeta = True
                     IsBeta = True
                 Else
                 Else
-                    StdVersion = Token("version").ToString()
+                    StdVersion = Token("version").ToString().Replace("neoforge-", "")
                     IsBeta = False
                     IsBeta = False
                 End If
                 End If
                 Name = rawVersion
                 Name = rawVersion

+ 1 - 0
Plain Craft Launcher 2/Modules/ModMain.vb

@@ -394,6 +394,7 @@ EndHint:
     Public FrmDownloadOptiFine As PageDownloadOptiFine
     Public FrmDownloadOptiFine As PageDownloadOptiFine
     Public FrmDownloadLiteLoader As PageDownloadLiteLoader
     Public FrmDownloadLiteLoader As PageDownloadLiteLoader
     Public FrmDownloadForge As PageDownloadForge
     Public FrmDownloadForge As PageDownloadForge
+    Public FrmDownloadNeoForge As PageDownloadNeoForge
     Public FrmDownloadFabric As PageDownloadFabric
     Public FrmDownloadFabric As PageDownloadFabric
     Public FrmDownloadMod As PageDownloadMod
     Public FrmDownloadMod As PageDownloadMod
     Public FrmDownloadPack As PageDownloadPack
     Public FrmDownloadPack As PageDownloadPack

+ 30 - 30
Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb

@@ -1829,9 +1829,9 @@ Retry:
         '添加 Java Wrapper 作为主 Jar
         '添加 Java Wrapper 作为主 Jar
         Dim Arguments As String
         Dim Arguments As String
         If UseJavaWrapper Then
         If UseJavaWrapper Then
-            Arguments = $"-Doolloo.jlw.tmpdir=""{GetJavaWrapperDir()}"" -cp ""{PathTemp}Cache\forge_installer.jar;{Target}"" -jar ""{ExtractJavaWrapper()}"" com.bangbang93.ForgeInstaller ""{McFolder}"
+            Arguments = $"-Doolloo.jlw.tmpdir=""{GetJavaWrapperDir()}"" -cp ""{PathTemp}Cache\neoforge_installer.jar;{Target}"" -jar ""{ExtractJavaWrapper()}"" com.bangbang93.ForgeInstaller ""{McFolder}"
         Else
         Else
-            Arguments = $"-cp ""{PathTemp}Cache\forge_installer.jar;{Target}"" com.bangbang93.ForgeInstaller ""{McFolder}"
+            Arguments = $"-cp ""{PathTemp}Cache\neoforge_installer.jar;{Target}"" com.bangbang93.ForgeInstaller ""{McFolder}"
         End If
         End If
         If Java.VersionCode >= 9 Then Arguments = "--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED " & Arguments
         If Java.VersionCode >= 9 Then Arguments = "--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED " & Arguments
         '开始启动
         '开始启动
@@ -1979,7 +1979,7 @@ Retry:
         Dim Id As String = Inherit & "-forge-" & Version
         Dim Id As String = Inherit & "-forge-" & Version
         Dim InstallerAddress As String = PathTemp & "Cache\Code\NeoForgeInstall-" & Version & "_" & RandomInteger(0, 100000)
         Dim InstallerAddress As String = PathTemp & "Cache\Code\NeoForgeInstall-" & Version & "_" & RandomInteger(0, 100000)
         Dim VersionFolder As String = McFolder & "versions\" & Id & "\"
         Dim VersionFolder As String = McFolder & "versions\" & Id & "\"
-        Dim DisplayName As String = "Forge " & Inherit & " - " & Version
+        Dim DisplayName As String = "NeoForge " & Inherit & " - " & Version
         Dim Loaders As New List(Of LoaderBase)
         Dim Loaders As New List(Of LoaderBase)
         Dim LibVersionFolder As String = PathMcFolder & "versions\" & Id & "\" '作为 Lib 文件目标的版本文件夹
         Dim LibVersionFolder As String = PathMcFolder & "versions\" & Id & "\" '作为 Lib 文件目标的版本文件夹
 
 
@@ -1987,7 +1987,7 @@ Retry:
         If DownloadInfo Is Nothing Then
         If DownloadInfo Is Nothing Then
             Loaders.Add(New LoaderTask(Of String, String)("获取 Mod 加载器详细信息",
             Loaders.Add(New LoaderTask(Of String, String)("获取 Mod 加载器详细信息",
             Sub(Task As LoaderTask(Of String, String))
             Sub(Task As LoaderTask(Of String, String))
-                '获取 Forge 版本列表
+                '获取 NeoForge 版本列表
                 Dim NeoForgeLoader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadNeoForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain)
                 Dim NeoForgeLoader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadNeoForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain)
                 NeoForgeLoader.WaitForExit(Inherit)
                 NeoForgeLoader.WaitForExit(Inherit)
                 Task.Progress = 0.8
                 Task.Progress = 0.8
@@ -2001,7 +2001,7 @@ Retry:
                 Throw New Exception("未能找到 NeoForge " & Inherit & "-" & Version & " 的详细信息!")
                 Throw New Exception("未能找到 NeoForge " & Inherit & "-" & Version & " 的详细信息!")
             End Sub) With {.ProgressWeight = 3})
             End Sub) With {.ProgressWeight = 3})
         End If
         End If
-        '下载 Forge 主文件
+        '下载 NeoForge 主文件
         Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备 Mod 加载器下载",
         Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备 Mod 加载器下载",
             Sub(Task As LoaderTask(Of String, List(Of NetFile)))
             Sub(Task As LoaderTask(Of String, List(Of NetFile)))
                 '启动依赖版本的下载
                 '启动依赖版本的下载
@@ -2011,8 +2011,8 @@ Retry:
                 End If
                 End If
                 '添加主文件
                 '添加主文件
                 Dim Files As New List(Of NetFile) From {New NetFile({
                 Dim Files As New List(Of NetFile) From {New NetFile({
-                    "https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/" & Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName,
-                    "https://files.minecraftforge.net/maven/net/minecraftforge/forge/" & Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName
+                    "https://bmclapi2.bangbang93.com/maven/net/neoforged/neoforge/" & DownloadInfo.StdVersion & "/" & DownloadInfo.FileName,
+                    "https://maven.neoforged.net/releases/net/neoforged/neoforge/" & DownloadInfo.StdVersion & "/" & DownloadInfo.FileName
                 }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))}
                 }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))}
                 Task.Output = Files
                 Task.Output = Files
             End Sub) With {.ProgressWeight = 0.5, .Show = False})
             End Sub) With {.ProgressWeight = 0.5, .Show = False})
@@ -2050,16 +2050,16 @@ Retry:
                     Task.Progress = 0.8
                     Task.Progress = 0.8
                     '去除其中的原始 Forge 项
                     '去除其中的原始 Forge 项
                     For i = 0 To Libs.Count - 1
                     For i = 0 To Libs.Count - 1
-                        If Libs(i).LocalPath.EndsWithF("forge-" & Inherit & "-" & Version & ".jar") OrElse
+                        If Libs(i).LocalPath.EndsWithF("neoforge-" & Inherit & "-" & Version & ".jar") OrElse
                                                                                                       Libs(i).LocalPath.EndsWithF("forge-" & Inherit & "-" & Version & "-client.jar") Then
                                                                                                       Libs(i).LocalPath.EndsWithF("forge-" & Inherit & "-" & Version & "-client.jar") Then
-                            Log("[Download] 已从待下载 Forge 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug)
+                            Log("[Download] 已从待下载 NeoForge 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug)
                             Libs.RemoveAt(i)
                             Libs.RemoveAt(i)
                             Exit For
                             Exit For
                         End If
                         End If
                     Next
                     Next
                     Task.Output = McLibFixFromLibToken(Libs, PathMcFolder)
                     Task.Output = McLibFixFromLibToken(Libs, PathMcFolder)
                 Catch ex As Exception
                 Catch ex As Exception
-                    Throw New Exception("获取新版 Forge 支持库列表失败", ex)
+                    Throw New Exception("获取新版 NeoForge 支持库列表失败", ex)
                 Finally
                 Finally
                     '释放文件
                     '释放文件
                     If Installer IsNot Nothing Then Installer.Dispose()
                     If Installer IsNot Nothing Then Installer.Dispose()
@@ -2068,7 +2068,7 @@ Retry:
             Loaders.Add(New LoaderDownload("下载 Mod 加载器支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12})
             Loaders.Add(New LoaderDownload("下载 Mod 加载器支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12})
             Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("获取 Mod 下载器支持库文件",
             Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("获取 Mod 下载器支持库文件",
             Sub(Task As LoaderTask(Of List(Of NetFile), Boolean))
             Sub(Task As LoaderTask(Of List(Of NetFile), Boolean))
-#Region "Forge 文件"
+#Region "NeoForge 文件"
                 If IsCustomFolder Then
                 If IsCustomFolder Then
                     For Each LibFile As McLibToken In Libs
                     For Each LibFile As McLibToken In Libs
                         Dim RealPath As String = LibFile.LocalPath.Replace(PathMcFolder, McFolder)
                         Dim RealPath As String = LibFile.LocalPath.Replace(PathMcFolder, McFolder)
@@ -2076,7 +2076,7 @@ Retry:
                             Directory.CreateDirectory(IO.Path.GetDirectoryName(RealPath))
                             Directory.CreateDirectory(IO.Path.GetDirectoryName(RealPath))
                             CopyFile(LibFile.LocalPath, RealPath)
                             CopyFile(LibFile.LocalPath, RealPath)
                         End If
                         End If
-                        If ModeDebug Then Log("[Download] 复制的 Forge 支持库文件:" & LibFile.LocalPath)
+                        If ModeDebug Then Log("[Download] 复制的 NeoForge 支持库文件:" & LibFile.LocalPath)
                     Next
                     Next
                 End If
                 End If
 #End Region
 #End Region
@@ -2086,7 +2086,7 @@ Retry:
                 Dim TargetLoaders As List(Of LoaderBase) =
                 Dim TargetLoaders As List(Of LoaderBase) =
                                                                                 ClientDownloadLoader.GetLoaderList.Where(Function(l) l.Name = McDownloadClientLibName OrElse l.Name = McDownloadClientJsonName).
                                                                                 ClientDownloadLoader.GetLoaderList.Where(Function(l) l.Name = McDownloadClientLibName OrElse l.Name = McDownloadClientJsonName).
                                                                                 Where(Function(l) l.State <> LoadState.Finished).ToList
                                                                                 Where(Function(l) l.State <> LoadState.Finished).ToList
-                If TargetLoaders.Any Then Log("[Download] Forge 安装正在等待原版文件下载完成")
+                If TargetLoaders.Any Then Log("[Download] NeoForge 安装正在等待原版文件下载完成")
                 Do While TargetLoaders.Any AndAlso Not Task.IsAborted
                 Do While TargetLoaders.Any AndAlso Not Task.IsAborted
                     TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList
                     TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList
                     Thread.Sleep(50)
                     Thread.Sleep(50)
@@ -2110,7 +2110,7 @@ Retry:
             Sub(Task As LoaderTask(Of Boolean, Boolean))
             Sub(Task As LoaderTask(Of Boolean, Boolean))
                 Dim Installer As ZipArchive = Nothing
                 Dim Installer As ZipArchive = Nothing
                 Try
                 Try
-                    Log("[Download] 开始进行新版方式 Forge 安装:" & InstallerAddress)
+                    Log("[Download] 开始进行新版方式 NeoForge 安装:" & InstallerAddress)
                     '记录当前文件夹列表(在新建目标文件夹之前)
                     '记录当前文件夹列表(在新建目标文件夹之前)
                     Dim OldList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories.
                     Dim OldList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories.
                                                                         Select(Function(i) i.FullName).ToList()
                                                                         Select(Function(i) i.FullName).ToList()
@@ -2123,23 +2123,23 @@ Retry:
                     '释放 launcher_installer.json
                     '释放 launcher_installer.json
                     McFolderLauncherProfilesJsonCreate(McFolder)
                     McFolderLauncherProfilesJsonCreate(McFolder)
                     Task.Progress = 0.05
                     Task.Progress = 0.05
-                    '运行 Forge 安装器
+                    '运行 NeoForge 安装器
                     Dim UseJavaWrapper As Boolean = True
                     Dim UseJavaWrapper As Boolean = True
 Retry:
 Retry:
                     Try
                     Try
-                        '释放 Forge 注入器
-                        WriteFile(PathTemp & "Cache\forge_installer.jar", GetResources("ForgeInstaller"))
+                        '释放 NeoForge 注入器
+                        WriteFile(PathTemp & "Cache\neoforge_installer.jar", GetResources("ForgeInstaller"))
                         Task.Progress = 0.06
                         Task.Progress = 0.06
                         '运行注入器
                         '运行注入器
                         ForgeInjector(InstallerAddress, Task, McFolder, UseJavaWrapper)
                         ForgeInjector(InstallerAddress, Task, McFolder, UseJavaWrapper)
                         Task.Progress = 0.97
                         Task.Progress = 0.97
                     Catch ex As Exception
                     Catch ex As Exception
                         If UseJavaWrapper Then
                         If UseJavaWrapper Then
-                            Log(ex, "使用 JavaWrapper 安装 Forge 失败,将不使用 JavaWrapper 并重试")
+                            Log(ex, "使用 JavaWrapper 安装 NeoForge 失败,将不使用 JavaWrapper 并重试")
                             UseJavaWrapper = False
                             UseJavaWrapper = False
                             GoTo Retry
                             GoTo Retry
                         Else
                         Else
-                            Throw New Exception("运行 Forge 安装器失败", ex)
+                            Throw New Exception("运行 NeoForge 安装器失败", ex)
                         End If
                         End If
                     End Try
                     End Try
                     '拷贝新增的版本 Json
                     '拷贝新增的版本 Json
@@ -2147,7 +2147,7 @@ Retry:
                         SkipWhile(Function(i) OldList.Contains(i.FullName)).ToList()
                         SkipWhile(Function(i) OldList.Contains(i.FullName)).ToList()
                     If DeltaList.Count > 1 Then
                     If DeltaList.Count > 1 Then
                         '它可能和 OptiFine 安装同时运行,导致增加的文件不止一个(这导致了 #151)
                         '它可能和 OptiFine 安装同时运行,导致增加的文件不止一个(这导致了 #151)
-                        '也可能是因为 Forge 安装器的 Bug,生成了一个名字错误的文件夹,所以需要检查文件夹是否为空
+                        '也可能是因为 NeoForge 安装器的 Bug,生成了一个名字错误的文件夹,所以需要检查文件夹是否为空
                         DeltaList = DeltaList.Where(Function(l) l.Name.Contains("forge") AndAlso l.EnumerateFiles.Any).ToList
                         DeltaList = DeltaList.Where(Function(l) l.Name.Contains("forge") AndAlso l.EnumerateFiles.Any).ToList
                     End If
                     End If
                     If DeltaList.Count = 1 Then '如果没有新增文件夹,那么预测的文件夹名就是正确的
                     If DeltaList.Count = 1 Then '如果没有新增文件夹,那么预测的文件夹名就是正确的
@@ -2157,19 +2157,19 @@ Retry:
                     '新建 mods 文件夹
                     '新建 mods 文件夹
                     Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\")
                     Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\")
                 Catch ex As Exception
                 Catch ex As Exception
-                    Throw New Exception("安装新 Forge 版本失败", ex)
+                    Throw New Exception("安装新 NeoForge 版本失败", ex)
                 Finally
                 Finally
                     '清理文件
                     '清理文件
                     Try
                     Try
                         If Installer IsNot Nothing Then Installer.Dispose()
                         If Installer IsNot Nothing Then Installer.Dispose()
                         If File.Exists(InstallerAddress) Then File.Delete(InstallerAddress)
                         If File.Exists(InstallerAddress) Then File.Delete(InstallerAddress)
                     Catch ex As Exception
                     Catch ex As Exception
-                        Log(ex, "安装 Forge 清理文件时出错")
+                        Log(ex, "安装 NeoForge 清理文件时出错")
                     End Try
                     End Try
                 End Try
                 End Try
             End Sub) With {.ProgressWeight = 10})
             End Sub) With {.ProgressWeight = 10})
         Else
         Else
-            Log("[Download] 检测为非新版 Forge:" & Version)
+            Log("[Download] 检测为非新版 NeoForge:" & Version)
             Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("安装 Mod 加载器(方式 B)",
             Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("安装 Mod 加载器(方式 B)",
             Sub(Task As LoaderTask(Of List(Of NetFile), Boolean))
             Sub(Task As LoaderTask(Of List(Of NetFile), Boolean))
                 Dim Installer As ZipArchive = Nothing
                 Dim Installer As ZipArchive = Nothing
@@ -2211,7 +2211,7 @@ Retry:
                     '新建 mods 文件夹
                     '新建 mods 文件夹
                     Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\")
                     Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\")
                 Catch ex As Exception
                 Catch ex As Exception
-                    Throw New Exception("非新版方式安装 Forge 失败", ex)
+                    Throw New Exception("非新版方式安装 NeoForge 失败", ex)
                 Finally
                 Finally
                     Try
                     Try
                         '清理文件
                         '清理文件
@@ -2219,7 +2219,7 @@ Retry:
                         If File.Exists(InstallerAddress) Then File.Delete(InstallerAddress)
                         If File.Exists(InstallerAddress) Then File.Delete(InstallerAddress)
                         If Directory.Exists(InstallerAddress & "_unrar\") Then DeleteDirectory(InstallerAddress & "_unrar\")
                         If Directory.Exists(InstallerAddress & "_unrar\") Then DeleteDirectory(InstallerAddress & "_unrar\")
                     Catch ex As Exception
                     Catch ex As Exception
-                        Log(ex, "非新版方式安装 Forge 清理文件时出错")
+                        Log(ex, "非新版方式安装 NeoForge 清理文件时出错")
                     End Try
                     End Try
                 End Try
                 End Try
             End Sub) With {.ProgressWeight = 1})
             End Sub) With {.ProgressWeight = 1})
@@ -2257,7 +2257,7 @@ Retry:
     Public Function NeoForgeDownloadListItem(Entry As DlNeoForgeVersionEntry, OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) As MyListItem
     Public Function NeoForgeDownloadListItem(Entry As DlNeoForgeVersionEntry, OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) As MyListItem
         '建立控件
         '建立控件
         Dim NewItem As New MyListItem With {
         Dim NewItem As New MyListItem With {
-            .Title = Entry.Version, .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry,
+            .Title = If(Entry.IsBeta, Entry.StdVersion & "-beta", Entry.StdVersion), .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry,
             .Info = If(Entry.IsBeta, "测试版", "稳定版") &
             .Info = If(Entry.IsBeta, "测试版", "稳定版") &
                 If(Entry.ReleaseTime = "",
                 If(Entry.ReleaseTime = "",
                 If(ModeDebug, "种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), ""),
                 If(ModeDebug, "种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), ""),
@@ -2296,7 +2296,7 @@ Retry:
         sender.Buttons = {BtnInfo}
         sender.Buttons = {BtnInfo}
     End Sub
     End Sub
     Private Sub NeoForgeLog_Click(sender As Object, e As RoutedEventArgs)
     Private Sub NeoForgeLog_Click(sender As Object, e As RoutedEventArgs)
-        Dim Version As DlForgeVersionEntry
+        Dim Version As DlNeoForgeVersionEntry
         If sender.Tag IsNot Nothing Then
         If sender.Tag IsNot Nothing Then
             Version = sender.Tag
             Version = sender.Tag
         ElseIf sender.Parent.Tag IsNot Nothing Then
         ElseIf sender.Parent.Tag IsNot Nothing Then
@@ -2304,10 +2304,10 @@ Retry:
         Else
         Else
             Version = sender.Parent.Parent.Tag
             Version = sender.Parent.Parent.Tag
         End If
         End If
-        OpenWebsite("https://files.minecraftforge.net/maven/net/minecraftforge/forge/" & Version.Inherit & "-" & Version.Version & "/forge-" & Version.Inherit & "-" & Version.Version & "-changelog.txt")
+        OpenWebsite("https://maven.neoforged.net/releases/net/neoforged/neoforge/" & Version.StdVersion & "/" & Version.Version & "-changelog.txt")
     End Sub
     End Sub
     Public Sub NeoForgeSave_Click(sender As Object, e As RoutedEventArgs)
     Public Sub NeoForgeSave_Click(sender As Object, e As RoutedEventArgs)
-        Dim Version As DlForgeVersionEntry
+        Dim Version As DlNeoForgeVersionEntry
         If sender.Tag IsNot Nothing Then
         If sender.Tag IsNot Nothing Then
             Version = sender.Tag
             Version = sender.Tag
         ElseIf sender.Parent.Tag IsNot Nothing Then
         ElseIf sender.Parent.Tag IsNot Nothing Then
@@ -2315,7 +2315,7 @@ Retry:
         Else
         Else
             Version = sender.Parent.Parent.Tag
             Version = sender.Parent.Parent.Tag
         End If
         End If
-        McDownloadForgeSave(Version)
+        McDownloadNeoForgeSave(Version)
     End Sub
     End Sub
 
 
 #End Region
 #End Region

+ 2 - 2
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb

@@ -499,7 +499,7 @@
             Name += "-Forge_" & SelectedForge.Version
             Name += "-Forge_" & SelectedForge.Version
         End If
         End If
         If SelectedNeoForge IsNot Nothing Then
         If SelectedNeoForge IsNot Nothing Then
-            Name += "-NeoForge_" & SelectedNeoForge.Version
+            Name += "-NeoForge_" & SelectedNeoForge.StdVersion & If(SelectedNeoForge.IsBeta, "-beta", "")
         End If
         End If
         If SelectedLiteLoader IsNot Nothing Then
         If SelectedLiteLoader IsNot Nothing Then
             Name += "-LiteLoader"
             Name += "-LiteLoader"
@@ -521,7 +521,7 @@
             Info += ", Forge " & SelectedForge.Version
             Info += ", Forge " & SelectedForge.Version
         End If
         End If
         If SelectedNeoForge IsNot Nothing Then
         If SelectedNeoForge IsNot Nothing Then
-            Info += ", NeoForge " & SelectedNeoForge.Version
+            Info += ", NeoForge " & SelectedNeoForge.StdVersion & If(SelectedNeoForge.IsBeta, "-beta", "")
         End If
         End If
         If SelectedLiteLoader IsNot Nothing Then
         If SelectedLiteLoader IsNot Nothing Then
             Info += ", LiteLoader"
             Info += ", LiteLoader"

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml


+ 10 - 1
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb

@@ -10,7 +10,7 @@
     ''' <summary>
     ''' <summary>
     ''' 勾选事件改变页面。
     ''' 勾选事件改变页面。
     ''' </summary>
     ''' </summary>
-    Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemInstall.Check, ItemClient.Check, ItemOptiFine.Check, ItemForge.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
         '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0
         '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0
         '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False)
         '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False)
         If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag))
         If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag))
@@ -31,6 +31,9 @@
             Case FormMain.PageSubType.DownloadForge
             Case FormMain.PageSubType.DownloadForge
                 If FrmDownloadForge Is Nothing Then FrmDownloadForge = New PageDownloadForge
                 If FrmDownloadForge Is Nothing Then FrmDownloadForge = New PageDownloadForge
                 Return FrmDownloadForge
                 Return FrmDownloadForge
+            Case FormMain.PageSubType.DownloadNeoForge
+                If FrmDownloadNeoForge Is Nothing Then FrmDownloadNeoForge = New PageDownloadNeoForge
+                Return FrmDownloadNeoForge
             Case FormMain.PageSubType.DownloadLiteLoader
             Case FormMain.PageSubType.DownloadLiteLoader
                 If FrmDownloadLiteLoader Is Nothing Then FrmDownloadLiteLoader = New PageDownloadLiteLoader
                 If FrmDownloadLiteLoader Is Nothing Then FrmDownloadLiteLoader = New PageDownloadLiteLoader
                 Return FrmDownloadLiteLoader
                 Return FrmDownloadLiteLoader
@@ -91,6 +94,7 @@
                 DlClientListLoader.Start(IsForceRestart:=True)
                 DlClientListLoader.Start(IsForceRestart:=True)
                 DlOptiFineListLoader.Start(IsForceRestart:=True)
                 DlOptiFineListLoader.Start(IsForceRestart:=True)
                 DlForgeListLoader.Start(IsForceRestart:=True)
                 DlForgeListLoader.Start(IsForceRestart:=True)
+                DlNeoForgeListLoader.Start(IsForceRestart:=True)
                 DlLiteLoaderListLoader.Start(IsForceRestart:=True)
                 DlLiteLoaderListLoader.Start(IsForceRestart:=True)
                 DlFabricListLoader.Start(IsForceRestart:=True)
                 DlFabricListLoader.Start(IsForceRestart:=True)
                 DlFabricApiLoader.Start(IsForceRestart:=True)
                 DlFabricApiLoader.Start(IsForceRestart:=True)
@@ -117,6 +121,9 @@
             Case FormMain.PageSubType.DownloadForge
             Case FormMain.PageSubType.DownloadForge
                 DlForgeListLoader.Start(IsForceRestart:=True)
                 DlForgeListLoader.Start(IsForceRestart:=True)
                 ItemForge.Checked = True
                 ItemForge.Checked = True
+            Case FormMain.PageSubType.DownloadNeoForge
+                DlNeoForgeListLoader.Start(IsForceRestart:=True)
+                ItemNeoForge.Checked = True
             Case FormMain.PageSubType.DownloadLiteLoader
             Case FormMain.PageSubType.DownloadLiteLoader
                 DlLiteLoaderListLoader.Start(IsForceRestart:=True)
                 DlLiteLoaderListLoader.Start(IsForceRestart:=True)
                 ItemLiteLoader.Checked = True
                 ItemLiteLoader.Checked = True
@@ -154,6 +161,7 @@
         ItemOptiFine.Visibility = Visibility.Visible
         ItemOptiFine.Visibility = Visibility.Visible
         ItemFabric.Visibility = Visibility.Visible
         ItemFabric.Visibility = Visibility.Visible
         ItemForge.Visibility = Visibility.Visible
         ItemForge.Visibility = Visibility.Visible
+        ItemNeoForge.Visibility = Visibility.Visible
         ItemLiteLoader.Visibility = Visibility.Visible
         ItemLiteLoader.Visibility = Visibility.Visible
         RunInThread(Sub()
         RunInThread(Sub()
                         Thread.Sleep(20)
                         Thread.Sleep(20)
@@ -172,6 +180,7 @@
         ItemOptiFine.Visibility = Visibility.Collapsed
         ItemOptiFine.Visibility = Visibility.Collapsed
         ItemFabric.Visibility = Visibility.Collapsed
         ItemFabric.Visibility = Visibility.Collapsed
         ItemForge.Visibility = Visibility.Collapsed
         ItemForge.Visibility = Visibility.Collapsed
+        ItemNeoForge.Visibility = Visibility.Collapsed
         ItemLiteLoader.Visibility = Visibility.Collapsed
         ItemLiteLoader.Visibility = Visibility.Collapsed
         RunInThread(Sub()
         RunInThread(Sub()
                         Thread.Sleep(20)
                         Thread.Sleep(20)

+ 28 - 0
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml

@@ -0,0 +1,28 @@
+<local:MyPageRight
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:local="clr-namespace:PCL" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+    mc:Ignorable="d" x:Class="PageDownloadNeoForge"
+    PanScroll="{Binding ElementName=PanBack}">
+    <local:MyScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" x:Name="PanBack">
+        <StackPanel Orientation="Vertical" Margin="5">
+            <local:MyCard Margin="20,20,20,0" Grid.IsSharedSizeScope="True" Title="NeoForge 简介" x:Name="CardTip">
+                <StackPanel Margin="25,40,15,20">
+                    <TextBlock Margin="0,0,0,11" Text="NeoForge 是新版 Minecraft 下的 Mod 加载器,你需要先安装它才能安装各种 NeoForge 模组。&#xa;本页面提供 NeoForge 安装器下载,在下载后你需要手动打开安装器进行安装。" TextWrapping="Wrap" />
+                    <Grid Height="35">
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
+                        </Grid.ColumnDefinitions>
+                        <local:MyButton x:Name="BtnWeb" Grid.Column="0" MinWidth="140" Text="打开官网" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" ColorType="Highlight" />
+                    </Grid>
+                </StackPanel>
+            </local:MyCard>
+            <local:MyCard x:Name="CardVersions" Margin="20,15,20,20" Title="版本列表">
+                <StackPanel x:Name="PanVersions" Margin="20,40,18,20" />
+            </local:MyCard>
+            <local:MyCard HorizontalAlignment="Center" SnapsToDevicePixels="True" x:Name="PanLoad" UseAnimation="False" Margin="40,50">
+                <local:MyLoading Text="正在获取 NeoForge 列表" Margin="20,20,20,17" x:Name="Load" HorizontalAlignment="Center" VerticalAlignment="Center" />
+            </local:MyCard>
+        </StackPanel>
+    </local:MyScrollViewer>
+</local:MyPageRight>

+ 32 - 0
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb

@@ -0,0 +1,32 @@
+Public Class PageDownloadNeoForge
+
+    Private Sub LoaderInit() Handles Me.Initialized
+        PageLoaderInit(Load, PanLoad, CardVersions, CardTip, DlNeoForgeListLoader, AddressOf Load_OnFinish)
+    End Sub
+    Private Sub Init() Handles Me.Loaded
+        PanBack.ScrollToHome()
+    End Sub
+
+    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))
+            Next
+            CardVersions.Title = "版本列表 (" & Versions.Count & ")"
+        Catch ex As Exception
+            Log(ex, "可视化 NeoForge 版本列表出错", LogLevel.Feedback)
+        End Try
+    End Sub
+
+    Private Sub NeoForge_Selected(sender As MyListItem, e As EventArgs)
+        McDownloadNeoForgeSave(sender.Tag)
+    End Sub
+
+    Private Sub BtnWeb_Click(sender As Object, e As EventArgs) Handles BtnWeb.Click
+        OpenWebsite("https://neoforged.net/")
+    End Sub
+
+End Class

+ 7 - 5
Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj

@@ -185,9 +185,6 @@
     <Compile Include="Controls\MyIconTextButton.xaml.vb">
     <Compile Include="Controls\MyIconTextButton.xaml.vb">
       <DependentUpon>MyIconTextButton.xaml</DependentUpon>
       <DependentUpon>MyIconTextButton.xaml</DependentUpon>
     </Compile>
     </Compile>
-
-
-
     <Compile Include="Modules\Minecraft\ModComp.vb" />
     <Compile Include="Modules\Minecraft\ModComp.vb" />
     <Compile Include="Modules\Minecraft\ModJava.vb" />
     <Compile Include="Modules\Minecraft\ModJava.vb" />
     <Compile Include="Modules\Minecraft\ModMod.vb" />
     <Compile Include="Modules\Minecraft\ModMod.vb" />
@@ -232,6 +229,9 @@
     <Compile Include="Modules\Minecraft\MyCompItem.xaml.vb">
     <Compile Include="Modules\Minecraft\MyCompItem.xaml.vb">
       <DependentUpon>MyCompItem.xaml</DependentUpon>
       <DependentUpon>MyCompItem.xaml</DependentUpon>
     </Compile>
     </Compile>
+    <Compile Include="Pages\PageDownload\PageDownloadNeoForge.xaml.vb">
+      <DependentUpon>PageDownloadNeoForge.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Pages\PageDownload\PageDownloadMod.xaml.vb">
     <Compile Include="Pages\PageDownload\PageDownloadMod.xaml.vb">
       <DependentUpon>PageDownloadMod.xaml</DependentUpon>
       <DependentUpon>PageDownloadMod.xaml</DependentUpon>
     </Compile>
     </Compile>
@@ -469,7 +469,6 @@
       <DependentUpon>FormMain.xaml</DependentUpon>
       <DependentUpon>FormMain.xaml</DependentUpon>
       <SubType>Code</SubType>
       <SubType>Code</SubType>
     </Compile>
     </Compile>
-
     <Page Include="Modules\Minecraft\MyLocalModItem.xaml">
     <Page Include="Modules\Minecraft\MyLocalModItem.xaml">
       <Generator>MSBuild:Compile</Generator>
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
       <SubType>Designer</SubType>
@@ -478,6 +477,10 @@
       <Generator>MSBuild:Compile</Generator>
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
       <SubType>Designer</SubType>
     </Page>
     </Page>
+    <Page Include="Pages\PageDownload\PageDownloadNeoForge.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="Pages\PageDownload\PageDownloadMod.xaml">
     <Page Include="Pages\PageDownload\PageDownloadMod.xaml">
       <SubType>Designer</SubType>
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
       <Generator>MSBuild:Compile</Generator>
@@ -921,7 +924,6 @@
     <Resource Include="Images\Heads\MCBBS.png" />
     <Resource Include="Images\Heads\MCBBS.png" />
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
-
   </ItemGroup>
   </ItemGroup>
   <ItemGroup />
   <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
   <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff