From d8fe5997399cdad68bfab9bdfb6b54296701a29f Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 07:00:37 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20=E6=89=80=E6=9C=89=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E9=83=BD=E6=98=BE=E7=A4=BA=E4=B8=BA=E6=B5=8B=E8=AF=95=E7=89=88?= =?UTF-8?q?=20/=20=E6=AD=A3=E5=BC=8F=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb | 8 +++++--- .../Pages/PageDownload/ModDownloadLib.vb | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index ad69aa1..a81f8fa 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -880,19 +880,21 @@ Dim Name As String '存储 rawVersion,貌似变化更加频繁 Dim StdVersion As String '存储 version,相对规则 Dim IsBeta As Boolean - If Token("rawVersion").Contains("-beta") Then - StdVersion = Token("version").ToString() - "-beta" + Dim rawVersion As String = Token("rawVersion") + If rawVersion.Contains("-beta") Then + StdVersion = Token("version").ToString().Replace("-beta", "") IsBeta = True Else StdVersion = Token("version").ToString() IsBeta = False End If - Name = Token("rawVersion") + Name = rawVersion Dim Inherit As String = Token("mcversion") Dim Entry = New DlNeoForgeVersionEntry With {.Version = Name, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} Versions.Add(Entry) Next Catch ex As Exception + MyMsgBox(ex.ToString(), "错误") Throw New Exception("版本列表解析失败(" & Json.ToString & ")", ex) End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index ac13c41..f294d67 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2257,7 +2257,7 @@ Retry: Public Function NeoForgeDownloadListItem(Entry As DlNeoForgeVersionEntry, OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) As MyListItem '建立控件 Dim NewItem As New MyListItem With { - .Title = If(Entry.IsBeta, Entry.Version & "-beta", Entry.Version), .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, + .Title = Entry.Version, .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, .Info = If(Entry.IsBeta, "测试版", "稳定版") & If(Entry.ReleaseTime = "", If(ModeDebug, "种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), ""), From 0e0335e688b60e15e6e47479de365de7a5214cdb Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 08:52:45 +0800 Subject: [PATCH 2/4] =?UTF-8?q?ui:=20=E6=B7=BB=E5=8A=A0=20NeoForge=20?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E5=AE=89=E8=A3=85=20Tab=20feat:=20NeoForge?= =?UTF-8?q?=20=E8=87=AA=E5=8A=A8=E5=AE=89=E8=A3=85=20Stage=201=20fix:=20St?= =?UTF-8?q?dVersion=20=E5=8F=AF=E8=83=BD=E9=94=99=E8=AF=AF=E5=9C=B0?= =?UTF-8?q?=E5=8C=85=E5=90=AB=E4=BA=86=20"neoforge-"=20=E5=89=8D=E7=BC=80?= =?UTF-8?q?=20fix:=20=E8=87=AA=E5=8A=A8=E5=AE=89=E8=A3=85=E9=80=89?= =?UTF-8?q?=E6=8B=A9=20NeoForge=20=E6=97=B6=E8=87=AA=E5=8A=A8=E7=94=9F?= =?UTF-8?q?=E6=88=90=E7=9A=84=E6=A0=B8=E5=BF=83=E5=90=8D=E7=A7=B0=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E9=87=8D=E5=A4=8D=E5=AD=97=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/FormMain.xaml.vb | 1 + .../Modules/Minecraft/ModDownload.vb | 10 ++-- Plain Craft Launcher 2/Modules/ModMain.vb | 1 + .../Pages/PageDownload/ModDownloadLib.vb | 60 +++++++++---------- .../PageDownload/PageDownloadInstall.xaml.vb | 4 +- .../Pages/PageDownload/PageDownloadLeft.xaml | 9 +++ .../PageDownload/PageDownloadLeft.xaml.vb | 11 +++- .../PageDownload/PageDownloadNeoForge.xaml | 28 +++++++++ .../PageDownload/PageDownloadNeoForge.xaml.vb | 32 ++++++++++ .../Plain Craft Launcher 2.vbproj | 12 ++-- 10 files changed, 125 insertions(+), 43 deletions(-) create mode 100644 Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml create mode 100644 Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 5ed09e6..339404b 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -1019,6 +1019,7 @@ Install: DownloadClient = 4 DownloadOptiFine = 5 DownloadForge = 6 + DownloadNeoForge = 13 DownloadFabric = 7 DownloadLiteLoader = 8 DownloadMod = 10 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index a81f8fa..471eb1a 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -725,7 +725,7 @@ Public Class DlNeoForgeVersionEntry ''' - ''' 完整的版本名,如 “14.22.1.2478”。 + ''' 完整的版本名,如 “neoforge-20.4.30-beta”。 ''' Public Version As String ''' @@ -753,7 +753,7 @@ ''' Public IsBeta As Boolean = False ''' - ''' 标准的版本号 + ''' 标准的版本号,如 “20.4.30”。 ''' Public StdVersion As String Public Structure DlNeoForgeListResult @@ -820,10 +820,10 @@ End Get End Property End Class - ''' ''' 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))) 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) @@ -882,10 +882,10 @@ Dim IsBeta As Boolean Dim rawVersion As String = Token("rawVersion") If rawVersion.Contains("-beta") Then - StdVersion = Token("version").ToString().Replace("-beta", "") + StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("-beta", "") IsBeta = True Else - StdVersion = Token("version").ToString() + StdVersion = Token("version").ToString().Replace("neoforge-", "") IsBeta = False End If Name = rawVersion diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index e2b797c..a971886 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -394,6 +394,7 @@ EndHint: Public FrmDownloadOptiFine As PageDownloadOptiFine Public FrmDownloadLiteLoader As PageDownloadLiteLoader Public FrmDownloadForge As PageDownloadForge + Public FrmDownloadNeoForge As PageDownloadNeoForge Public FrmDownloadFabric As PageDownloadFabric Public FrmDownloadMod As PageDownloadMod Public FrmDownloadPack As PageDownloadPack diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index f294d67..881f4d6 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1829,9 +1829,9 @@ Retry: '添加 Java Wrapper 作为主 Jar Dim Arguments As String 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 - 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 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 InstallerAddress As String = PathTemp & "Cache\Code\NeoForgeInstall-" & Version & "_" & RandomInteger(0, 100000) 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 LibVersionFolder As String = PathMcFolder & "versions\" & Id & "\" '作为 Lib 文件目标的版本文件夹 @@ -1987,7 +1987,7 @@ Retry: If DownloadInfo Is Nothing Then Loaders.Add(New LoaderTask(Of String, String)("获取 Mod 加载器详细信息", Sub(Task As LoaderTask(Of String, String)) - '获取 Forge 版本列表 + '获取 NeoForge 版本列表 Dim NeoForgeLoader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadNeoForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain) NeoForgeLoader.WaitForExit(Inherit) Task.Progress = 0.8 @@ -2001,7 +2001,7 @@ Retry: Throw New Exception("未能找到 NeoForge " & Inherit & "-" & Version & " 的详细信息!") End Sub) With {.ProgressWeight = 3}) End If - '下载 Forge 主文件 + '下载 NeoForge 主文件 Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备 Mod 加载器下载", Sub(Task As LoaderTask(Of String, List(Of NetFile))) '启动依赖版本的下载 @@ -2011,8 +2011,8 @@ Retry: End If '添加主文件 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))} Task.Output = Files End Sub) With {.ProgressWeight = 0.5, .Show = False}) @@ -2050,16 +2050,16 @@ Retry: Task.Progress = 0.8 '去除其中的原始 Forge 项 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 - Log("[Download] 已从待下载 Forge 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug) + Log("[Download] 已从待下载 NeoForge 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug) Libs.RemoveAt(i) Exit For End If Next Task.Output = McLibFixFromLibToken(Libs, PathMcFolder) Catch ex As Exception - Throw New Exception("获取新版 Forge 支持库列表失败", ex) + Throw New Exception("获取新版 NeoForge 支持库列表失败", ex) Finally '释放文件 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 LoaderTask(Of List(Of NetFile), Boolean)("获取 Mod 下载器支持库文件", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) -#Region "Forge 文件" +#Region "NeoForge 文件" If IsCustomFolder Then For Each LibFile As McLibToken In Libs Dim RealPath As String = LibFile.LocalPath.Replace(PathMcFolder, McFolder) @@ -2076,7 +2076,7 @@ Retry: Directory.CreateDirectory(IO.Path.GetDirectoryName(RealPath)) CopyFile(LibFile.LocalPath, RealPath) End If - If ModeDebug Then Log("[Download] 复制的 Forge 支持库文件:" & LibFile.LocalPath) + If ModeDebug Then Log("[Download] 复制的 NeoForge 支持库文件:" & LibFile.LocalPath) Next End If #End Region @@ -2086,7 +2086,7 @@ Retry: Dim TargetLoaders As List(Of LoaderBase) = ClientDownloadLoader.GetLoaderList.Where(Function(l) l.Name = McDownloadClientLibName OrElse l.Name = McDownloadClientJsonName). 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 TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList Thread.Sleep(50) @@ -2110,7 +2110,7 @@ Retry: Sub(Task As LoaderTask(Of Boolean, Boolean)) Dim Installer As ZipArchive = Nothing Try - Log("[Download] 开始进行新版方式 Forge 安装:" & InstallerAddress) + Log("[Download] 开始进行新版方式 NeoForge 安装:" & InstallerAddress) '记录当前文件夹列表(在新建目标文件夹之前) Dim OldList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories. Select(Function(i) i.FullName).ToList() @@ -2123,23 +2123,23 @@ Retry: '释放 launcher_installer.json McFolderLauncherProfilesJsonCreate(McFolder) Task.Progress = 0.05 - '运行 Forge 安装器 + '运行 NeoForge 安装器 Dim UseJavaWrapper As Boolean = True Retry: Try - '释放 Forge 注入器 - WriteFile(PathTemp & "Cache\forge_installer.jar", GetResources("ForgeInstaller")) + '释放 NeoForge 注入器 + WriteFile(PathTemp & "Cache\neoforge_installer.jar", GetResources("ForgeInstaller")) Task.Progress = 0.06 '运行注入器 ForgeInjector(InstallerAddress, Task, McFolder, UseJavaWrapper) Task.Progress = 0.97 Catch ex As Exception If UseJavaWrapper Then - Log(ex, "使用 JavaWrapper 安装 Forge 失败,将不使用 JavaWrapper 并重试") + Log(ex, "使用 JavaWrapper 安装 NeoForge 失败,将不使用 JavaWrapper 并重试") UseJavaWrapper = False GoTo Retry Else - Throw New Exception("运行 Forge 安装器失败", ex) + Throw New Exception("运行 NeoForge 安装器失败", ex) End If End Try '拷贝新增的版本 Json @@ -2147,7 +2147,7 @@ Retry: SkipWhile(Function(i) OldList.Contains(i.FullName)).ToList() If DeltaList.Count > 1 Then '它可能和 OptiFine 安装同时运行,导致增加的文件不止一个(这导致了 #151) - '也可能是因为 Forge 安装器的 Bug,生成了一个名字错误的文件夹,所以需要检查文件夹是否为空 + '也可能是因为 NeoForge 安装器的 Bug,生成了一个名字错误的文件夹,所以需要检查文件夹是否为空 DeltaList = DeltaList.Where(Function(l) l.Name.Contains("forge") AndAlso l.EnumerateFiles.Any).ToList End If If DeltaList.Count = 1 Then '如果没有新增文件夹,那么预测的文件夹名就是正确的 @@ -2157,19 +2157,19 @@ Retry: '新建 mods 文件夹 Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\") Catch ex As Exception - Throw New Exception("安装新 Forge 版本失败", ex) + Throw New Exception("安装新 NeoForge 版本失败", ex) Finally '清理文件 Try If Installer IsNot Nothing Then Installer.Dispose() If File.Exists(InstallerAddress) Then File.Delete(InstallerAddress) Catch ex As Exception - Log(ex, "安装 Forge 清理文件时出错") + Log(ex, "安装 NeoForge 清理文件时出错") End Try End Try End Sub) With {.ProgressWeight = 10}) Else - Log("[Download] 检测为非新版 Forge:" & Version) + Log("[Download] 检测为非新版 NeoForge:" & Version) Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("安装 Mod 加载器(方式 B)", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) Dim Installer As ZipArchive = Nothing @@ -2211,7 +2211,7 @@ Retry: '新建 mods 文件夹 Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\") Catch ex As Exception - Throw New Exception("非新版方式安装 Forge 失败", ex) + Throw New Exception("非新版方式安装 NeoForge 失败", ex) Finally Try '清理文件 @@ -2219,7 +2219,7 @@ Retry: If File.Exists(InstallerAddress) Then File.Delete(InstallerAddress) If Directory.Exists(InstallerAddress & "_unrar\") Then DeleteDirectory(InstallerAddress & "_unrar\") Catch ex As Exception - Log(ex, "非新版方式安装 Forge 清理文件时出错") + Log(ex, "非新版方式安装 NeoForge 清理文件时出错") End Try End Try 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 '建立控件 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, "测试版", "稳定版") & If(Entry.ReleaseTime = "", If(ModeDebug, "种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), ""), @@ -2296,7 +2296,7 @@ Retry: sender.Buttons = {BtnInfo} End Sub Private Sub NeoForgeLog_Click(sender As Object, e As RoutedEventArgs) - Dim Version As DlForgeVersionEntry + Dim Version As DlNeoForgeVersionEntry If sender.Tag IsNot Nothing Then Version = sender.Tag ElseIf sender.Parent.Tag IsNot Nothing Then @@ -2304,10 +2304,10 @@ Retry: Else Version = sender.Parent.Parent.Tag 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 Public Sub NeoForgeSave_Click(sender As Object, e As RoutedEventArgs) - Dim Version As DlForgeVersionEntry + Dim Version As DlNeoForgeVersionEntry If sender.Tag IsNot Nothing Then Version = sender.Tag ElseIf sender.Parent.Tag IsNot Nothing Then @@ -2315,7 +2315,7 @@ Retry: Else Version = sender.Parent.Parent.Tag End If - McDownloadForgeSave(Version) + McDownloadNeoForgeSave(Version) End Sub #End Region diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 8d3808d..0c5e146 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -499,7 +499,7 @@ Name += "-Forge_" & SelectedForge.Version End If If SelectedNeoForge IsNot Nothing Then - Name += "-NeoForge_" & SelectedNeoForge.Version + Name += "-NeoForge_" & SelectedNeoForge.StdVersion & If(SelectedNeoForge.IsBeta, "-beta", "") End If If SelectedLiteLoader IsNot Nothing Then Name += "-LiteLoader" @@ -521,7 +521,7 @@ Info += ", Forge " & SelectedForge.Version End If If SelectedNeoForge IsNot Nothing Then - Info += ", NeoForge " & SelectedNeoForge.Version + Info += ", NeoForge " & SelectedNeoForge.StdVersion & If(SelectedNeoForge.IsBeta, "-beta", "") End If If SelectedLiteLoader IsNot Nothing Then Info += ", LiteLoader" diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml index da78a28..f4b7653 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml @@ -43,6 +43,15 @@ + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb index da173ad..8d1e2e2 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb @@ -10,7 +10,7 @@ ''' ''' 勾选事件改变页面。 ''' - 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 '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False) If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag)) @@ -31,6 +31,9 @@ Case FormMain.PageSubType.DownloadForge If FrmDownloadForge Is Nothing Then FrmDownloadForge = New PageDownloadForge Return FrmDownloadForge + Case FormMain.PageSubType.DownloadNeoForge + If FrmDownloadNeoForge Is Nothing Then FrmDownloadNeoForge = New PageDownloadNeoForge + Return FrmDownloadNeoForge Case FormMain.PageSubType.DownloadLiteLoader If FrmDownloadLiteLoader Is Nothing Then FrmDownloadLiteLoader = New PageDownloadLiteLoader Return FrmDownloadLiteLoader @@ -91,6 +94,7 @@ DlClientListLoader.Start(IsForceRestart:=True) DlOptiFineListLoader.Start(IsForceRestart:=True) DlForgeListLoader.Start(IsForceRestart:=True) + DlNeoForgeListLoader.Start(IsForceRestart:=True) DlLiteLoaderListLoader.Start(IsForceRestart:=True) DlFabricListLoader.Start(IsForceRestart:=True) DlFabricApiLoader.Start(IsForceRestart:=True) @@ -117,6 +121,9 @@ Case FormMain.PageSubType.DownloadForge DlForgeListLoader.Start(IsForceRestart:=True) ItemForge.Checked = True + Case FormMain.PageSubType.DownloadNeoForge + DlNeoForgeListLoader.Start(IsForceRestart:=True) + ItemNeoForge.Checked = True Case FormMain.PageSubType.DownloadLiteLoader DlLiteLoaderListLoader.Start(IsForceRestart:=True) ItemLiteLoader.Checked = True @@ -154,6 +161,7 @@ ItemOptiFine.Visibility = Visibility.Visible ItemFabric.Visibility = Visibility.Visible ItemForge.Visibility = Visibility.Visible + ItemNeoForge.Visibility = Visibility.Visible ItemLiteLoader.Visibility = Visibility.Visible RunInThread(Sub() Thread.Sleep(20) @@ -172,6 +180,7 @@ ItemOptiFine.Visibility = Visibility.Collapsed ItemFabric.Visibility = Visibility.Collapsed ItemForge.Visibility = Visibility.Collapsed + ItemNeoForge.Visibility = Visibility.Collapsed ItemLiteLoader.Visibility = Visibility.Collapsed RunInThread(Sub() Thread.Sleep(20) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml new file mode 100644 index 0000000..aae4da7 --- /dev/null +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb new file mode 100644 index 0000000..fcb4491 --- /dev/null +++ b/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 diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 72db688..48f9bfb 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -185,9 +185,6 @@ MyIconTextButton.xaml - - - @@ -232,6 +229,9 @@ MyCompItem.xaml + + PageDownloadNeoForge.xaml + PageDownloadMod.xaml @@ -469,7 +469,6 @@ FormMain.xaml Code - MSBuild:Compile Designer @@ -478,6 +477,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + Designer MSBuild:Compile @@ -921,7 +924,6 @@ - From f4b1e3ed1aea29b2cbcaa12bab084177f58b433f Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 09:44:00 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=E6=AD=A3=E5=BC=8F=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20NeoForge=20=E8=87=AA=E5=8A=A8=E5=AE=89=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 4 +- .../Pages/PageDownload/ModDownloadLib.vb | 162 ++++++++---------- .../PageDownload/PageDownloadInstall.xaml.vb | 3 +- 3 files changed, 71 insertions(+), 98 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 471eb1a..69e2308 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -804,7 +804,7 @@ ''' Public ReadOnly Property FileName As String Get - Return "neoforge-" & "-" & StdVersion & "-" & "installer" & "." & "jar" + Return "neoforge-" & StdVersion & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" End Get End Property ''' @@ -815,7 +815,7 @@ If Category = "installer" Then Return "jar" Else - Return "zip" + Return "jar" End If End Get End Property diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 881f4d6..8b5bc2f 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1779,8 +1779,8 @@ Retry: '构造步骤加载器 Dim Loaders As New List(Of LoaderBase) '获取下载地址 - Loaders.Add(New LoaderTask(Of DlForgeVersionEntry, List(Of NetFile))("获取下载地址", - Sub(Task As LoaderTask(Of DlForgeVersionEntry, List(Of NetFile))) + Loaders.Add(New LoaderTask(Of DlNeoForgeVersionEntry, List(Of NetFile))("获取下载地址", + Sub(Task As LoaderTask(Of DlNeoForgeVersionEntry, List(Of NetFile))) Dim Files As New List(Of NetFile) Files.Add(New NetFile({ "https://bmclapi2.bangbang93.com/maven/net/neoforged/neoforge/" & DownloadInfo.StdVersion & "/" & DownloadInfo.FileName, @@ -1792,7 +1792,7 @@ Retry: Loaders.Add(New LoaderDownload("下载主文件", New List(Of NetFile)) With {.ProgressWeight = 6}) '启动 - Dim Loader As New LoaderCombo(Of DlForgeVersionEntry)(DisplayName & " 下载", Loaders) With {.OnStateChanged = AddressOf DownloadStateSave} + Dim Loader As New LoaderCombo(Of DlNeoForgeVersionEntry)(DisplayName & " 下载", Loaders) With {.OnStateChanged = AddressOf DownloadStateSave} Loader.Start(DownloadInfo) LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() @@ -1880,15 +1880,15 @@ Retry: Else LastResults.Enqueue(e.Data) If LastResults.Count > 100 Then LastResults.Dequeue() - ForgeInjectorLine(e.Data, Task) + NeoForgeInjectorLine(e.Data, Task) End If Catch ex As ObjectDisposedException Catch ex As Exception - Log(ex, "读取 Forge 安装器错误信息失败") + Log(ex, "读取 NeoForge 安装器错误信息失败") End Try Try If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then - Log("[Installer] 由于任务取消,已中止 Forge 安装") + Log("[Installer] 由于任务取消,已中止 NeoForge 安装") process.Kill() End If Catch @@ -1913,7 +1913,7 @@ Retry: For i As Integer = Math.Max(0, LastResults.Count - 5) To LastResults.Count - 1 '最后 5 行 LastLines &= vbCrLf & LastResults(i) Next - Throw New Exception("Forge 安装器出错,日志结束部分为:" & LastLines) + Throw New Exception("NeoForge 安装器出错,日志结束部分为:" & LastLines) End Using End Using End SyncLock @@ -1970,13 +1970,9 @@ Retry: '参数初始化 McFolder = If(McFolder, PathMcFolder) - If Version.StartsWithF("1.") AndAlso Version.Contains("-") Then - '类似 1.19.3-41.2.8 格式,优先使用 Version 中要求的版本而非 Inherit(例如 1.19.3 却使用了 1.19 的 Forge) - Inherit = Version.Before("-") - Version = Version.After("-") - End If + Version = DownloadInfo.StdVersion Dim IsCustomFolder As Boolean = McFolder <> PathMcFolder - Dim Id As String = Inherit & "-forge-" & Version + Dim Id As String = DownloadInfo.Version Dim InstallerAddress As String = PathTemp & "Cache\Code\NeoForgeInstall-" & Version & "_" & RandomInteger(0, 100000) Dim VersionFolder As String = McFolder & "versions\" & Id & "\" Dim DisplayName As String = "NeoForge " & Inherit & " - " & Version @@ -2011,18 +2007,17 @@ Retry: End If '添加主文件 Dim Files As New List(Of NetFile) From {New NetFile({ - "https://bmclapi2.bangbang93.com/maven/net/neoforged/neoforge/" & DownloadInfo.StdVersion & "/" & DownloadInfo.FileName, - "https://maven.neoforged.net/releases/net/neoforged/neoforge/" & DownloadInfo.StdVersion & "/" & DownloadInfo.FileName + "https://bmclapi2.bangbang93.com/maven/net/neoforged/neoforge/" & DownloadInfo.StdVersion & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, + "https://maven.neoforged.net/releases/net/neoforged/neoforge/" & DownloadInfo.StdVersion & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))} Task.Output = Files End Sub) With {.ProgressWeight = 0.5, .Show = False}) Loaders.Add(New LoaderDownload("下载 Mod 加载器主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) '安装(仅在新版安装时需要原版 Jar) - If Version.Before(".") >= 20 Then - Log("[Download] 检测为新版 NeoForge:" & Version) - Dim Libs As List(Of McLibToken) = Nothing - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Mod 加载器支持库文件", + Log("[Download] 检测为新版 NeoForge:" & Version) + Dim Libs As List(Of McLibToken) = Nothing + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Mod 加载器支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = New List(Of NetFile) Dim Installer As ZipArchive = Nothing @@ -2048,7 +2043,7 @@ Retry: Log("[Download] 需要下载 Mappings:" & Address) End If Task.Progress = 0.8 - '去除其中的原始 Forge 项 + '去除其中的原始 NeoForge 项 For i = 0 To Libs.Count - 1 If Libs(i).LocalPath.EndsWithF("neoforge-" & Inherit & "-" & Version & ".jar") OrElse Libs(i).LocalPath.EndsWithF("forge-" & Inherit & "-" & Version & "-client.jar") Then @@ -2065,8 +2060,8 @@ Retry: If Installer IsNot Nothing Then Installer.Dispose() End Try End Sub) With {.ProgressWeight = 2}) - 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 LoaderDownload("下载 Mod 加载器支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12}) + Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("获取 Mod 下载器支持库文件", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) #Region "NeoForge 文件" If IsCustomFolder Then @@ -2106,7 +2101,7 @@ Retry: End SyncLock #End Region End Sub) With {.ProgressWeight = 0.1, .Show = False}) - Loaders.Add(New LoaderTask(Of Boolean, Boolean)("安装 Mod 加载器(方式 A)", + Loaders.Add(New LoaderTask(Of Boolean, Boolean)("安装 Mod 加载器(方式 A)", Sub(Task As LoaderTask(Of Boolean, Boolean)) Dim Installer As ZipArchive = Nothing Try @@ -2131,7 +2126,7 @@ Retry: WriteFile(PathTemp & "Cache\neoforge_installer.jar", GetResources("ForgeInstaller")) Task.Progress = 0.06 '运行注入器 - ForgeInjector(InstallerAddress, Task, McFolder, UseJavaWrapper) + NeoForgeInjector(InstallerAddress, Task, McFolder, UseJavaWrapper) Task.Progress = 0.97 Catch ex As Exception If UseJavaWrapper Then @@ -2148,7 +2143,7 @@ Retry: If DeltaList.Count > 1 Then '它可能和 OptiFine 安装同时运行,导致增加的文件不止一个(这导致了 #151) '也可能是因为 NeoForge 安装器的 Bug,生成了一个名字错误的文件夹,所以需要检查文件夹是否为空 - DeltaList = DeltaList.Where(Function(l) l.Name.Contains("forge") AndAlso l.EnumerateFiles.Any).ToList + DeltaList = DeltaList.Where(Function(l) l.Name.Contains("neoforge") AndAlso l.EnumerateFiles.Any).ToList End If If DeltaList.Count = 1 Then '如果没有新增文件夹,那么预测的文件夹名就是正确的 Dim JsonFile As FileInfo = DeltaList(0).EnumerateFiles.First() @@ -2168,67 +2163,6 @@ Retry: End Try End Try End Sub) With {.ProgressWeight = 10}) - Else - Log("[Download] 检测为非新版 NeoForge:" & Version) - Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("安装 Mod 加载器(方式 B)", - Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) - Dim Installer As ZipArchive = Nothing - Try - '解压并获取信息 - Installer = New ZipArchive(New FileStream(InstallerAddress, FileMode.Open)) - Task.Progress = 0.2 - Dim Json As JObject = GetJson(ReadFile(Installer.GetEntry("install_profile.json").Open)) - Task.Progress = 0.4 - '新建版本文件夹 - Directory.CreateDirectory(VersionFolder) - Task.Progress = 0.5 - If Json("install") Is Nothing Then - '中版格式 - Log("[Download] 进行中版方式安装:" & InstallerAddress) - '建立 Json 文件 - Dim JsonVersion As JObject = GetJson(ReadFile(Installer.GetEntry(Json("json").ToString.TrimStart("/")).Open)) - JsonVersion("id") = Id - WriteFile(VersionFolder & Id & ".json", JsonVersion.ToString) - Task.Progress = 0.6 - '解压支持库文件 - Installer.Dispose() - ExtractFile(InstallerAddress, InstallerAddress & "_unrar\") - CopyDirectory(InstallerAddress & "_unrar\maven\", McFolder & "libraries\") - DeleteDirectory(InstallerAddress & "_unrar\") - Else - '旧版格式 - Log("[Download] 进行旧版方式安装:" & InstallerAddress) - '解压 Jar 文件 - Dim JarAddress As String = McLibGet(Json("install")("path"), CustomMcFolder:=McFolder) - If File.Exists(JarAddress) Then File.Delete(JarAddress) - WriteFile(JarAddress, Installer.GetEntry(Json("install")("filePath")).Open) - Task.Progress = 0.9 - '建立 Json 文件 - Json("versionInfo")("id") = Id - If Json("versionInfo")("inheritsFrom") Is Nothing Then CType(Json("versionInfo"), JObject).Add("inheritsFrom", Inherit) - WriteFile(VersionFolder & Id & ".json", Json("versionInfo").ToString) - End If - '新建 mods 文件夹 - Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\") - Catch ex As Exception - Throw New Exception("非新版方式安装 NeoForge 失败", ex) - Finally - Try - '清理文件 - If Installer IsNot Nothing Then Installer.Dispose() - If File.Exists(InstallerAddress) Then File.Delete(InstallerAddress) - If Directory.Exists(InstallerAddress & "_unrar\") Then DeleteDirectory(InstallerAddress & "_unrar\") - Catch ex As Exception - Log(ex, "非新版方式安装 NeoForge 清理文件时出错") - End Try - End Try - End Sub) With {.ProgressWeight = 1}) - If FixLibrary Then - If IsCustomFolder Then Throw New Exception("若需要补全支持库,就不能自定义 MC 文件夹") - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Mod 加载器支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionFolder))) With {.ProgressWeight = 1, .Show = False}) - Loaders.Add(New LoaderDownload("下载 Mod 加载器支持库文件", New List(Of NetFile)) With {.ProgressWeight = 11}) - End If - End If Return Loaders End Function @@ -2485,6 +2419,16 @@ Retry: ''' Public ForgeEntry As DlForgeVersionEntry = Nothing + '若要下载 NeoForge,则需要在下面两项中完成至少一项 + ''' + ''' 欲下载的 NeoForge 版本名。接受例如 36.1.4 / 14.23.5.2859 / 1.19-41.1.0 的输入。 + ''' + Public NeoForgeVersion As String = Nothing + ''' + ''' 欲下载的 NeoForge。 + ''' + Public NeoForgeEntry As DlNeoForgeVersionEntry = Nothing + ''' ''' 欲下载的 Fabric Loader 版本名。 ''' @@ -2585,7 +2529,7 @@ Retry: Public Function McInstallLoader(Request As McInstallRequest, Optional DontFixLibraries As Boolean = False) As List(Of LoaderBase) '获取缓存目录 Dim PathInstallTemp As String - If PathTemp.Contains(" ") AndAlso Request.ForgeEntry IsNot Nothing Then + If PathTemp.Contains(" ") AndAlso (Request.ForgeEntry IsNot Nothing Or Request.NeoForgeEntry IsNot Nothing) Then PathInstallTemp = OsDrive & "ProgramData\PCL\Install\" Else PathInstallTemp = PathTemp & "Install\" @@ -2622,6 +2566,9 @@ Retry: Dim ForgeFolder As String = Nothing If Request.ForgeEntry IsNot Nothing Then Request.ForgeVersion = If(Request.ForgeVersion, Request.ForgeEntry.Version) If Request.ForgeVersion IsNot Nothing Then ForgeFolder = TempMcFolder & "versions\" & Request.MinecraftName & "-forge-" & Request.ForgeVersion + Dim NeoForgeFolder As String = Nothing + If Request.NeoForgeEntry IsNot Nothing Then Request.NeoForgeVersion = If(Request.NeoForgeVersion, Request.NeoForgeEntry.Version) + If Request.NeoForgeVersion IsNot Nothing Then NeoForgeFolder = TempMcFolder & "versions\" & Request.NeoForgeVersion Dim FabricFolder As String = Nothing If Request.FabricVersion IsNot Nothing Then FabricFolder = TempMcFolder & "versions\fabric-loader-" & Request.FabricVersion & "-" & Request.MinecraftName Dim LiteLoaderFolder As String = Nothing @@ -2638,6 +2585,7 @@ Retry: '记录日志 If OptiFineFolder IsNot Nothing Then Log("[Download] OptiFine 缓存:" & OptiFineFolder) If ForgeFolder IsNot Nothing Then Log("[Download] Forge 缓存:" & ForgeFolder) + If NeoForgeFolder IsNot Nothing Then Log("[Download] NeoForge 缓存:" & NeoForgeFolder) If FabricFolder IsNot Nothing Then Log("[Download] Fabric 缓存:" & FabricFolder) If LiteLoaderFolder IsNot Nothing Then Log("[Download] LiteLoader 缓存:" & LiteLoaderFolder) Log("[Download] 对应的原版版本:" & Request.MinecraftName) @@ -2672,7 +2620,11 @@ Retry: End If 'Forge If Request.ForgeVersion IsNot Nothing Then - LoaderList.Add(New LoaderCombo(Of String)("下载 Forge " & Request.ForgeVersion, McDownloadForgeLoader(Request.ForgeVersion, Request.MinecraftName, Request.ForgeEntry, TempMcFolder, ClientLoader, Request.TargetVersionFolder, False)) With {.Show = False, .ProgressWeight = 25, .Block = Request.FabricVersion Is Nothing AndAlso Request.LiteLoaderEntry Is Nothing}) + LoaderList.Add(New LoaderCombo(Of String)("下载 Forge " & Request.ForgeVersion, McDownloadForgeLoader(Request.ForgeVersion, Request.MinecraftName, Request.ForgeEntry, TempMcFolder, ClientLoader, Request.TargetVersionFolder, False)) With {.Show = False, .ProgressWeight = 25, .Block = Request.FabricVersion Is Nothing AndAlso Request.LiteLoaderEntry Is Nothing AndAlso Request.NeoForgeEntry Is Nothing}) + End If + 'NeoForge + If Request.NeoForgeVersion IsNot Nothing Then + LoaderList.Add(New LoaderCombo(Of String)("下载 NeoForge " & Request.NeoForgeVersion, McDownloadNeoForgeLoader(Request.NeoForgeVersion, Request.MinecraftName, Request.NeoForgeEntry, TempMcFolder, ClientLoader, Request.TargetVersionFolder, False)) With {.Show = False, .ProgressWeight = 25, .Block = Request.ForgeEntry Is Nothing AndAlso Request.FabricVersion Is Nothing AndAlso Request.LiteLoaderEntry Is Nothing}) End If 'LiteLoader If Request.LiteLoaderEntry IsNot Nothing Then @@ -2685,14 +2637,14 @@ Retry: '合并安装 LoaderList.Add(New LoaderTask(Of String, String)("安装游戏", Sub(Task As LoaderTask(Of String, String)) - InstallMerge(OutputFolder, OutputFolder, OptiFineFolder, OptiFineAsMod, ForgeFolder, Request.ForgeVersion, FabricFolder, LiteLoaderFolder) + InstallMerge(OutputFolder, OutputFolder, OptiFineFolder, OptiFineAsMod, ForgeFolder, Request.ForgeVersion, NeoForgeFolder, Request.NeoForgeVersion, FabricFolder, LiteLoaderFolder) Task.Progress = 0.3 If Directory.Exists(TempMcFolder & "libraries") Then CopyDirectory(TempMcFolder & "libraries", PathMcFolder & "libraries") If Directory.Exists(TempMcFolder & "mods") Then CopyDirectory(TempMcFolder & "mods", PathMcFolder & "mods") End Sub) With {.ProgressWeight = 2, .Block = True}) '补全文件 If Not DontFixLibraries AndAlso - (Request.OptiFineEntry IsNot Nothing OrElse (Request.ForgeVersion IsNot Nothing AndAlso Request.ForgeVersion.Before(".") >= 20) OrElse Request.FabricVersion IsNot Nothing OrElse Request.LiteLoaderEntry IsNot Nothing) Then + (Request.OptiFineEntry IsNot Nothing OrElse (Request.ForgeVersion IsNot Nothing AndAlso Request.ForgeVersion.Before(".") >= 20) OrElse (Request.NeoForgeVersion IsNot Nothing) OrElse Request.FabricVersion IsNot Nothing OrElse Request.LiteLoaderEntry IsNot Nothing) Then Dim LoadersLib As New List(Of LoaderBase) LoadersLib.Add(New LoaderTask(Of String, List(Of NetFile))("分析游戏支持库文件(副加载器)", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(OutputFolder))) With {.ProgressWeight = 1, .Show = False}) LoadersLib.Add(New LoaderDownload("下载游戏支持库文件(副加载器)", New List(Of NetFile)) With {.ProgressWeight = 7, .Show = False}) @@ -2708,17 +2660,18 @@ Retry: ''' ''' 将多个版本 Json 进行合并,如果目标已存在则直接覆盖。失败会抛出异常。 ''' - Private Sub InstallMerge(OutputFolder As String, MinecraftFolder As String, Optional OptiFineFolder As String = Nothing, Optional OptiFineAsMod As Boolean = False, Optional ForgeFolder As String = Nothing, Optional ForgeVersion As String = Nothing, Optional FabricFolder As String = Nothing, Optional LiteLoaderFolder As String = Nothing) + Private Sub InstallMerge(OutputFolder As String, MinecraftFolder As String, Optional OptiFineFolder As String = Nothing, Optional OptiFineAsMod As Boolean = False, Optional ForgeFolder As String = Nothing, Optional ForgeVersion As String = Nothing, Optional NeoForgeFolder As String = Nothing, Optional NeoForgeVersion As String = Nothing, Optional FabricFolder As String = Nothing, Optional LiteLoaderFolder As String = Nothing) Log("[Download] 开始进行版本合并,输出:" & OutputFolder & ",Minecraft:" & MinecraftFolder & If(OptiFineFolder IsNot Nothing, ",OptiFine:" & OptiFineFolder, "") & If(ForgeFolder IsNot Nothing, ",Forge:" & ForgeFolder, "") & + If(NeoForgeFolder IsNot Nothing, ",NeoForge:" & NeoForgeFolder, "") & If(LiteLoaderFolder IsNot Nothing, ",LiteLoader:" & LiteLoaderFolder, "") & If(FabricFolder IsNot Nothing, ",Fabric:" & FabricFolder, "")) Directory.CreateDirectory(OutputFolder) - Dim HasOptiFine As Boolean = OptiFineFolder IsNot Nothing AndAlso Not OptiFineAsMod, HasForge As Boolean = ForgeFolder IsNot Nothing, HasLiteLoader As Boolean = LiteLoaderFolder IsNot Nothing, HasFabric As Boolean = FabricFolder IsNot Nothing - Dim OutputName As String, MinecraftName As String, OptiFineName As String, ForgeName As String, LiteLoaderName As String, FabricName As String - Dim OutputJsonPath As String, MinecraftJsonPath As String, OptiFineJsonPath As String = Nothing, ForgeJsonPath As String = Nothing, LiteLoaderJsonPath As String = Nothing, FabricJsonPath As String = Nothing + Dim HasOptiFine As Boolean = OptiFineFolder IsNot Nothing AndAlso Not OptiFineAsMod, HasForge As Boolean = ForgeFolder IsNot Nothing, HasNeoForge As Boolean = NeoForgeFolder IsNot Nothing, HasLiteLoader As Boolean = LiteLoaderFolder IsNot Nothing, HasFabric As Boolean = FabricFolder IsNot Nothing + Dim OutputName As String, MinecraftName As String, OptiFineName As String, ForgeName As String, NeoForgeName As String, LiteLoaderName As String, FabricName As String + Dim OutputJsonPath As String, MinecraftJsonPath As String, OptiFineJsonPath As String = Nothing, ForgeJsonPath As String = Nothing, NeoForgeJsonPath As String = Nothing, LiteLoaderJsonPath As String = Nothing, FabricJsonPath As String = Nothing Dim OutputJar As String, MinecraftJar As String #Region "初始化路径信息" If Not OutputFolder.EndsWithF("\") Then OutputFolder += "\" @@ -2743,6 +2696,12 @@ Retry: ForgeJsonPath = ForgeFolder & ForgeName & ".json" End If + If HasNeoForge Then + If Not NeoForgeFolder.EndsWithF("\") Then NeoForgeFolder += "\" + NeoForgeName = GetFolderNameFromPath(NeoForgeFolder) + NeoForgeJsonPath = NeoForgeFolder & NeoForgeName & ".json" + End If + If HasLiteLoader Then If Not LiteLoaderFolder.EndsWithF("\") Then LiteLoaderFolder += "\" LiteLoaderName = GetFolderNameFromPath(LiteLoaderFolder) @@ -2756,7 +2715,7 @@ Retry: End If #End Region - Dim OutputJson As JObject, MinecraftJson As JObject, OptiFineJson As JObject = Nothing, ForgeJson As JObject = Nothing, LiteLoaderJson As JObject = Nothing, FabricJson As JObject = Nothing + Dim OutputJson As JObject, MinecraftJson As JObject, OptiFineJson As JObject = Nothing, ForgeJson As JObject = Nothing, NeoForgeJson As JObject = Nothing, LiteLoaderJson As JObject = Nothing, FabricJson As JObject = Nothing #Region "读取文件并检查文件是否合规" Dim MinecraftJsonText As String = ReadFile(MinecraftJsonPath) If Not MinecraftJsonText.StartsWithF("{") Then Throw New Exception("Minecraft json 有误,地址:" & MinecraftJsonPath & ",前段内容:" & MinecraftJsonText.Substring(0, Math.Min(MinecraftJsonText.Length, 1000))) @@ -2774,6 +2733,12 @@ Retry: ForgeJson = GetJson(ForgeJsonText) End If + If HasNeoForge Then + Dim NeoForgeJsonText As String = ReadFile(NeoForgeJsonPath) + If Not NeoForgeJsonText.StartsWithF("{") Then Throw New Exception("NeoForge json 有误,地址:" & NeoForgeJsonPath & ",前段内容:" & NeoForgeJsonText.Substring(0, Math.Min(NeoForgeJsonText.Length, 1000))) + NeoForgeJson = GetJson(NeoForgeJsonText) + End If + If HasLiteLoader Then Dim LiteLoaderJsonText As String = ReadFile(LiteLoaderJsonPath) If Not LiteLoaderJsonText.StartsWithF("{") Then Throw New Exception("LiteLoader json 有误,地址:" & LiteLoaderJsonPath & ",前段内容:" & LiteLoaderJsonText.Substring(0, Math.Min(LiteLoaderJsonText.Length, 1000))) @@ -2793,6 +2758,7 @@ Retry: If(MinecraftJson("minecraftArguments"), " ").ToString & " " & If(OptiFineJson IsNot Nothing, If(OptiFineJson("minecraftArguments"), " ").ToString, " ") & " " & If(ForgeJson IsNot Nothing, If(ForgeJson("minecraftArguments"), " ").ToString, " ") & " " & + If(NeoForgeJson IsNot Nothing, If(NeoForgeJson("minecraftArguments"), " ").ToString, " ") & " " & If(LiteLoaderJson IsNot Nothing, If(LiteLoaderJson("minecraftArguments"), " ").ToString, " ") '分割参数字符串 Dim RawArguments As List(Of String) = AllArguments.Split(" ").Where(Function(l) l <> "").Select(Function(l) l.Trim).ToList @@ -2822,6 +2788,12 @@ Retry: ForgeJson.Remove("time") OutputJson.Merge(ForgeJson) End If + If HasNeoForge Then + '合并 NeoForge + NeoForgeJson.Remove("releaseTime") + NeoForgeJson.Remove("time") + OutputJson.Merge(NeoForgeJson) + End If If HasLiteLoader Then '合并 LiteLoader LiteLoaderJson.Remove("releaseTime") diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 0c5e146..17ded34 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -1279,7 +1279,7 @@ End Sub Private Sub BtnSelectStart_Click() Handles BtnSelectStart.Click '确认版本隔离 - If (SelectedForge IsNot Nothing OrElse SelectedFabric IsNot Nothing) AndAlso + If (SelectedForge IsNot Nothing OrElse SelectedFabric IsNot Nothing OrElse SelectedNeoForge IsNot Nothing) AndAlso (Setup.Get("LaunchArgumentIndie") = 0 OrElse Setup.Get("LaunchArgumentIndie") = 2) Then If MyMsgBox("你尚未开启版本隔离,这会导致多个 MC 共用同一个 Mod 文件夹。" & vbCrLf & "因此在切换 MC 版本时,MC 会因为读取到与当前版本不符的 Mod 而崩溃。" & vbCrLf & @@ -1295,6 +1295,7 @@ .MinecraftName = SelectedMinecraftId, .OptiFineEntry = SelectedOptiFine, .ForgeEntry = SelectedForge, + .NeoForgeEntry = SelectedNeoForge, .FabricVersion = SelectedFabric, .FabricApi = SelectedFabricApi, .OptiFabric = SelectedOptiFabric, From d305dd3e430207359dd1e34db6df70e0c6e915f8 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 13:19:17 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20=E7=89=88=E6=9C=AC=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E6=AD=A3=E5=B8=B8=E6=98=BE=E7=A4=BA=E6=A0=B8?= =?UTF-8?q?=E5=BF=83=20NeoForge=20=E7=89=88=E6=9C=AC=20fix:=20=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=AE=89=E8=A3=85=E9=A1=B5=20NeoForge=20=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E5=A4=9A=E4=BD=99=E7=9A=84=E6=8F=8F=E8=BF=B0=20chores?= =?UTF-8?q?:=20NeoForge=20Icon=20=E6=98=BE=E7=A4=BA=EF=BC=8C=E4=BD=86?= =?UTF-8?q?=E7=9B=AE=E5=89=8D=E6=9C=89=E7=82=B9=E5=B0=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Images/Icons/NeoForged.png | Bin 0 -> 4395 bytes .../Images/Icons/NeoForgedLarge.png | Bin 0 -> 1123 bytes .../Modules/Minecraft/ModMinecraft.vb | 49 ++++++++++++++++-- .../Pages/PageDownload/ModDownloadLib.vb | 4 +- .../PageDownload/PageDownloadInstall.xaml | 2 +- .../PageDownload/PageDownloadInstall.xaml.vb | 2 +- .../Pages/PageVersion/PageVersionOverall.xaml | 1 + Plain Craft Launcher 2/Resources/Custom.xaml | 2 + 8 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 Plain Craft Launcher 2/Images/Icons/NeoForged.png create mode 100644 Plain Craft Launcher 2/Images/Icons/NeoForgedLarge.png diff --git a/Plain Craft Launcher 2/Images/Icons/NeoForged.png b/Plain Craft Launcher 2/Images/Icons/NeoForged.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f8076f3d25782eb7fc55f0ef491ecba1c13eed GIT binary patch literal 4395 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 literal 0 HcmV?d00001 diff --git a/Plain Craft Launcher 2/Images/Icons/NeoForgedLarge.png b/Plain Craft Launcher 2/Images/Icons/NeoForgedLarge.png new file mode 100644 index 0000000000000000000000000000000000000000..55848a69dfab001562da00828f41574339f6910f GIT binary patch literal 1123 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU=i?iaSW-L^JcES$CN^e3<0}fkT0hsRLrzJF^SY&)I(cI=d$AZkF-tHEUvWa_bAfKf1Z#HQ)UGDQU*W#%bRk zoO-(8xOKrU>leE;Hp$!1p80)N^#ycG?-+hKyZUz8$D~GK2-l#p#C!Fq(uzFRAMYF+9yUetiCwpdAE)Kooc3yh@t$tba&D?jtReXIH z)Bbyg+SBajtey3bcg=Lom2f`pk{|rSksaz^B(L8&&$uV@{^97K?`F&{TK`sl`(}P; zVaMm!uKg*HzieZiJ^$s^M{AcYo>#ANZ&k&czcXfH1l}FP4FX$2eP`Xwxi4v)oi)dJ zv*^jL1yPe`MjD^C*t#Y3X8N+tr<<}mn@SB>8c~8%=ck0k)|uYdZaj`L6bzsHdE=Zc zXLKiart;|Qy_uO7_&C@(>%y63mlvmf`+Du5YuI=7`*V8dA3wGD`$zpW+U$vnByQg?WI$BiGU_BZ!S`>0%- z;d$jn>cd<;P@D;D<&`bV%ijIRg#8J!X_yn-Im(jY!O$C zZlYhOc-43QrvL5p=1uu&cNs0|Go->ickVo}RQUg2nCrH|IoBl$9a4C2)i1Kvxb6Mw<&;$S!O7GzS literal 0 HcmV?d00001 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index 458a42a..efb1dfb 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -1,4 +1,5 @@ Imports System.IO.Compression +Imports MS.Internal Public Module ModMinecraft @@ -345,7 +346,7 @@ Public Module ModMinecraft End If Next End If - '从 Forge Arguments 中获取版本号 + '从 Forge / NeoForge Arguments 中获取版本号 If JsonObject("arguments") IsNot Nothing AndAlso JsonObject("arguments")("game") IsNot Nothing Then Dim Mark As Boolean = False For Each Argument In JsonObject("arguments")("game") @@ -729,12 +730,20 @@ Recheck: State = McVersionState.Fabric Version.FabricVersion = If(RegexSeek(RealJson, "(?<=(net.fabricmc:fabric-loader:)|(org.quiltmc:quilt-loader:))[0-9\.]+(\+build.[0-9]+)?"), "未知版本").Replace("+build", "") Version.HasFabric = True - ElseIf RealJson.Contains("minecraftforge") Then + ElseIf RealJson.Contains("minecraftforge") AndAlso Not RealJson.Contains("neoforge") Then State = McVersionState.Forge Version.ForgeVersion = RegexSeek(RealJson, "(?<=forge:[0-9\.]+(_pre[0-9]*)?\-)[0-9\.]+") If Version.ForgeVersion Is Nothing Then Version.ForgeVersion = RegexSeek(RealJson, "(?<=net\.minecraftforge:minecraftforge:)[0-9\.]+") If Version.ForgeVersion Is Nothing Then Version.ForgeVersion = If(RegexSeek(RealJson, "(?<=net\.minecraftforge:fmlloader:[0-9\.]+-)[0-9\.]+"), "未知版本") Version.HasForge = True + ElseIf RealJson.Contains("neoforge") Then + State = McVersionState.NeoForge + Dim JsonStr1() As String = RealJson.Replace(" ", "").Split("""--fml.neoForgeVersion""," & vbCrLf & """") '这里的实现比较抽象,正则我写不会 + Dim JsonStr2() As String = JsonStr1(1).Split("""") + Version.NeoForgeVersion = JsonStr2(0) + If Version.NeoForgeVersion Is Nothing Then Version.NeoForgeVersion = RegexSeek(RealJson, "(?<=""--fml.neoForgeVersion"",)[0-9\.]+") + If Version.NeoForgeVersion Is Nothing Then Version.NeoForgeVersion = If(RegexSeek(RealJson, "(?<=net\.minecraftforge:fmlloader:[0-9\.]+-)[0-9\.]+"), "未知版本") + Version.HasNeoForge = True End If Version.IsApiLoaded = True End Select @@ -752,6 +761,8 @@ ExitDataLoad: Logo = PathImage & "Blocks/CobbleStone.png" Case McVersionState.Forge Logo = PathImage & "Blocks/Anvil.png" + Case McVersionState.NeoForge + Logo = PathImage & "Icons/NeoForged.png" Case McVersionState.Fabric Logo = PathImage & "Blocks/Fabric.png" Case McVersionState.OptiFine @@ -780,7 +791,7 @@ ExitDataLoad: End If Case McVersionState.Old Info = "远古版本" - Case McVersionState.Original, McVersionState.Forge, McVersionState.Fabric, McVersionState.OptiFine, McVersionState.LiteLoader + Case McVersionState.Original, McVersionState.Forge, McVersionState.NeoForge, McVersionState.Fabric, McVersionState.OptiFine, McVersionState.LiteLoader Info = Version.ToString Case McVersionState.Fool Info = GetMcFoolName(Version.McName) @@ -813,6 +824,7 @@ ExitDataLoad: WriteIni(Path & "PCL\Setup.ini", "VersionOptiFine", Version.OptiFineVersion) WriteIni(Path & "PCL\Setup.ini", "VersionLiteLoader", Version.HasLiteLoader) WriteIni(Path & "PCL\Setup.ini", "VersionForge", Version.ForgeVersion) + WriteIni(Path & "PCL\Setup.ini", "VersionNeoForge", Version.NeoForgeVersion) WriteIni(Path & "PCL\Setup.ini", "VersionApiCode", Version.SortCode) WriteIni(Path & "PCL\Setup.ini", "VersionOriginal", Version.McName) WriteIni(Path & "PCL\Setup.ini", "VersionOriginalMain", Version.McCodeMain) @@ -852,6 +864,7 @@ ExitDataLoad: OptiFine Old Forge + NeoForge LiteLoader Fabric End Enum @@ -903,6 +916,17 @@ ExitDataLoad: ''' Public ForgeVersion As String = "" + 'NeoForge + + ''' + ''' 该版本是否安装了 NeoForge。 + ''' + Public HasNeoForge As Boolean = False + ''' + ''' NeoForge 版本号,如 31.1.2、14.23.5.2847。 + ''' + Public NeoForgeVersion As String = "" + 'Fabric ''' @@ -929,6 +953,7 @@ ExitDataLoad: Public Overrides Function ToString() As String ToString = "" If HasForge Then ToString += ", Forge" & If(ForgeVersion = "未知版本", "", " " & ForgeVersion) + If HasNeoForge Then ToString += ", NeoForge" & If(NeoForgeVersion = "未知版本", "", " " & NeoForgeVersion) If HasFabric Then ToString += ", Fabric" & If(FabricVersion = "未知版本", "", " " & FabricVersion) If HasOptiFine Then ToString += ", OptiFine" & If(OptiFineVersion = "未知版本", "", " " & OptiFineVersion) If HasLiteLoader Then ToString += ", LiteLoader" @@ -965,6 +990,16 @@ ExitDataLoad: Else Throw New Exception("无效的 Forge 版本:" & ForgeVersion) End If + ElseIf HasNeoForge Then + If NeoForgeVersion = "未知版本" Then Return 0 + Dim SubVersions = NeoForgeVersion.Split(".") + If SubVersions.Length = 4 Then + _SortCode = Val(SubVersions(0)) * 1000000 + Val(SubVersions(1)) * 10000 + Val(SubVersions(3)) + ElseIf SubVersions.Length = 3 Then + _SortCode = Val(SubVersions(0)) * 1000000 + Val(SubVersions(1)) * 10000 + Val(SubVersions(2)) + Else + Throw New Exception("无效的 NeoForge 版本:" & NeoForgeVersion) + End If ElseIf HasOptiFine Then If OptiFineVersion = "未知版本" Then Return 0 '由对应原版次级版本号(2 位)、字母(2 位)、末尾数字(2 位)、测试标记(2 位,正式版为 99,Pre[x] 为 50+x,Beta[x] 为 x)组成 @@ -1175,6 +1210,7 @@ OnLoaded: Dim VersionInfo As New McVersionInfo With { .FabricVersion = ReadIni(Version.Path & "PCL\Setup.ini", "VersionFabric", ""), .ForgeVersion = ReadIni(Version.Path & "PCL\Setup.ini", "VersionForge", ""), + .NeoForgeVersion = ReadIni(Version.Path & "PCL\Setup.ini", "VersionNeoForge", ""), .OptiFineVersion = ReadIni(Version.Path & "PCL\Setup.ini", "VersionOptiFine", ""), .HasLiteLoader = ReadIni(Version.Path & "PCL\Setup.ini", "VersionLiteLoader", False), .SortCode = ReadIni(Version.Path & "PCL\Setup.ini", "VersionApiCode", -1), @@ -1185,6 +1221,7 @@ OnLoaded: } VersionInfo.HasFabric = VersionInfo.FabricVersion.Count > 1 VersionInfo.HasForge = VersionInfo.ForgeVersion.Count > 1 + VersionInfo.HasNeoForge = VersionInfo.NeoForgeVersion.Count > 1 VersionInfo.HasOptiFine = VersionInfo.OptiFineVersion.Count > 1 Version.Version = VersionInfo End If @@ -1273,7 +1310,7 @@ OnLoaded: McVersionFilter(VersionList, VersionListOriginal, {McVersionState.Fool}, McVersionCardType.Fool) '筛选 API 版本 - McVersionFilter(VersionList, VersionListOriginal, {McVersionState.Forge, McVersionState.LiteLoader, McVersionState.Fabric}, McVersionCardType.API) + McVersionFilter(VersionList, VersionListOriginal, {McVersionState.Forge, McVersionState.NeoForge, McVersionState.LiteLoader, McVersionState.Fabric}, McVersionCardType.API) '将老版本预先分类入不常用,只剩余原版、快照、OptiFine Dim VersionUseful As New List(Of McVersion) @@ -1407,7 +1444,7 @@ OnLoaded: End Function) End If - 'API 版本:优先按版本排序,此后【先放 Fabric,再放 Forge(按版本号从高到低排序),最后放 LiteLoader(按名称排序)】 + 'API 版本:优先按版本排序,此后【先放 Fabric,再放 Forge,再放 NeoForge(按版本号从高到低排序),最后放 LiteLoader(按名称排序)】 If ResultVersionList.ContainsKey(McVersionCardType.API) Then ResultVersionList(McVersionCardType.API) = Sort(ResultVersionList(McVersionCardType.API), Function(Left As McVersion, Right As McVersion) @@ -1419,6 +1456,8 @@ OnLoaded: Return Left.Version.HasFabric ElseIf Left.Version.HasForge Xor Right.Version.HasForge Then Return Left.Version.HasForge + ElseIf Left.Version.HasNeoForge Xor Right.Version.HasNeoForge Then + Return Left.Version.HasNeoForge ElseIf Not Left.Version.SortCode <> Right.Version.SortCode Then Return Left.Version.SortCode > Right.Version.SortCode Else diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 8b5bc2f..a8ca4d7 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2194,9 +2194,9 @@ Retry: .Title = If(Entry.IsBeta, Entry.StdVersion & "-beta", Entry.StdVersion), .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, .Info = If(Entry.IsBeta, "测试版", "稳定版") & If(Entry.ReleaseTime = "", - If(ModeDebug, "种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), ""), + If(ModeDebug, If(Entry.Category IsNot Nothing, "种类:" & Entry.Category, "") & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), ""), "发布于 " & Entry.ReleaseTime & If(ModeDebug, ",种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), "")), - .Logo = PathImage & "Blocks/Anvil.png" + .Logo = PathImage & "Icons/NeoForged.png" } AddHandler NewItem.Click, OnClick '建立菜单 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml index 69c47f3..b16b864 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml @@ -89,7 +89,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 17ded34..ef6a2f9 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -541,7 +541,7 @@ ElseIf SelectedForge IsNot Nothing Then Return "pack://application:,,,/images/Blocks/Anvil.png" ElseIf SelectedNeoForge IsNot Nothing Then - Return "pack://application:,,,/images/Blocks/Anvil.png" + Return "pack://application:,,,/images/Icons/NeoForged.png" ElseIf SelectedLiteLoader IsNot Nothing Then Return "pack://application:,,,/images/Blocks/Egg.png" ElseIf SelectedOptiFine IsNot Nothing Then diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml index 3452357..50b7b9f 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml @@ -37,6 +37,7 @@ + diff --git a/Plain Craft Launcher 2/Resources/Custom.xaml b/Plain Craft Launcher 2/Resources/Custom.xaml index f35be1d..f0236e4 100644 --- a/Plain Craft Launcher 2/Resources/Custom.xaml +++ b/Plain Craft Launcher 2/Resources/Custom.xaml @@ -202,6 +202,8 @@ + +