From 18955687948f61b2bfd7b72f132ad5ef6b652e6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=AF=E5=B0=8F=E8=83=96=E5=91=8026?= <122529705+wuyuncheng-26@users.noreply.github.com> Date: Thu, 23 May 2024 19:58:44 +0800 Subject: [PATCH 01/87] Update MySkin.xaml.vb --- Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index 692bf17..b76047f 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -241,7 +241,7 @@ Retry: {"Translator-Chinese", "Crowdin 中文翻译者披风"}, {"Translator", "Crowdin 翻译者披风"}, {"Cobalt", "Cobalt 披风"}, {"Vanilla", "原版披风"}, {"Minecon2011", "Minecon 2011 参与者披风"}, {"Minecon2012", "Minecon 2012 参与者披风"}, {"Minecon2013", "Minecon 2013 参与者披风"}, {"Minecon2015", "Minecon 2015 参与者披风"}, {"Minecon2016", "Minecon 2016 参与者披风"}, - {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"} + {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower's Cape","追随者披风"} } Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}} For Each Cape In SkinData("capes") From fe35f794050a000cdc7af99bb438669e6979bfd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=AF=E5=B0=8F=E8=83=96=E5=91=8026?= <122529705+wuyuncheng-26@users.noreply.github.com> Date: Sat, 25 May 2024 13:22:28 +0800 Subject: [PATCH 02/87] Update MySkin.xaml.vb --- Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index b76047f..6256c5e 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -241,7 +241,7 @@ Retry: {"Translator-Chinese", "Crowdin 中文翻译者披风"}, {"Translator", "Crowdin 翻译者披风"}, {"Cobalt", "Cobalt 披风"}, {"Vanilla", "原版披风"}, {"Minecon2011", "Minecon 2011 参与者披风"}, {"Minecon2012", "Minecon 2012 参与者披风"}, {"Minecon2013", "Minecon 2013 参与者披风"}, {"Minecon2015", "Minecon 2015 参与者披风"}, {"Minecon2016", "Minecon 2016 参与者披风"}, - {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower's Cape","追随者披风"} + {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower","追随者披风"} } Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}} For Each Cape In SkinData("capes") From a18ccf78d117b438f5832e54a9f0d8c7999706fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=87=8C=E4=BA=91?= Date: Mon, 10 Jun 2024 11:48:55 +0800 Subject: [PATCH 03/87] fix #3985 --- Plain Craft Launcher 2/Modules/Base/ModBase.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 57a27cd..95af7aa 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -2186,7 +2186,7 @@ NextElement: ''' Public Sub OpenWebsite(Url As String) Try - If Not Url.StartsWithF("http", True) Then Throw New Exception(Url & " 不是一个有效的网址,它必须以 http 开头!") + If Not Url.StartsWithF("http", True) Or Url = "minecraft://" Then Throw New Exception(Url & " 不是一个有效的网址,它必须以 http 开头!") Log("[System] 正在打开网页:" & Url) Process.Start(Url) Catch ex As Exception @@ -2713,4 +2713,4 @@ Retry: #End Region -End Module \ No newline at end of file +End Module From aa5ff163e6c95a696f505c8b0f54e63594b3223f Mon Sep 17 00:00:00 2001 From: JingHai-Lingyun Date: Mon, 10 Jun 2024 12:04:52 +0800 Subject: [PATCH 04/87] fix #3985 --- .../Modules/Base/ModBase.vb | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 95af7aa..5e96327 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -2185,16 +2185,22 @@ NextElement: ''' 打开网页。 ''' Public Sub OpenWebsite(Url As String) - Try - If Not Url.StartsWithF("http", True) Or Url = "minecraft://" Then Throw New Exception(Url & " 不是一个有效的网址,它必须以 http 开头!") - Log("[System] 正在打开网页:" & Url) - Process.Start(Url) - Catch ex As Exception - Log(ex, "无法打开网页(" & Url & ")") - ClipboardSet(Url, False) - MyMsgBox("可能由于浏览器未正确配置,PCL 无法为你打开网页。" & vbCrLf & "网址已经复制到剪贴板,若有需要可以手动粘贴访问。" & vbCrLf & - $"网址:{Url}", "无法打开网页") - End Try + ' 允许 Minecraft 基岩版的 URLScheme (#3985) + If Url.StartsWithF("minecraft", True) Then + ' 一定会被捕捉到错误,单独拎出来 + Process.Start("minecraft://") + Else + Try + If Not Url.StartsWithF("http", True) Then Throw New Exception(Url & " 不是一个有效的网址,它必须以 http 开头!") + Log("[System] 正在打开网页:" & Url) + Process.Start(Url) + Catch ex As Exception + Log(ex, "无法打开网页(" & Url & ")") + ClipboardSet(Url, False) + MyMsgBox("可能由于浏览器未正确配置,PCL 无法为你打开网页。" & vbCrLf & "网址已经复制到剪贴板,若有需要可以手动粘贴访问。" & vbCrLf & + $"网址:{Url}", "无法打开网页") + End Try + End If End Sub ''' ''' 打开 explorer。注意参数中的路径要尽量加上双引号! From 657b5efc2e45ba4f969db42a8b0841f62e807937 Mon Sep 17 00:00:00 2001 From: JingHai-Lingyun Date: Mon, 10 Jun 2024 12:14:35 +0800 Subject: [PATCH 05/87] =?UTF-8?q?=E5=86=99=E6=AD=BB=E4=BA=86=E5=8D=95?= =?UTF-8?q?=E7=8B=AC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 避免有人传了点别的东西进去,现在只有 `minecraft://` 会单独处理 --- Plain Craft Launcher 2/Modules/Base/ModBase.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 5e96327..4be0874 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -2186,9 +2186,9 @@ NextElement: ''' Public Sub OpenWebsite(Url As String) ' 允许 Minecraft 基岩版的 URLScheme (#3985) - If Url.StartsWithF("minecraft", True) Then + If Url = "minecraft://" Then ' 一定会被捕捉到错误,单独拎出来 - Process.Start("minecraft://") + Process.Start(Url) Else Try If Not Url.StartsWithF("http", True) Then Throw New Exception(Url & " 不是一个有效的网址,它必须以 http 开头!") From eefb8b50a7aeb0d17f064e2662668bdda25efbfe Mon Sep 17 00:00:00 2001 From: JingHai-Lingyun Date: Mon, 10 Jun 2024 13:46:28 +0800 Subject: [PATCH 06/87] =?UTF-8?q?=E5=8F=88=E6=94=B9=E4=BA=86=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现在如果给 URL Scheme 传参也能接受了 --- Plain Craft Launcher 2/Modules/Base/ModBase.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 4be0874..3351b3f 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -2186,8 +2186,8 @@ NextElement: ''' Public Sub OpenWebsite(Url As String) ' 允许 Minecraft 基岩版的 URLScheme (#3985) - If Url = "minecraft://" Then - ' 一定会被捕捉到错误,单独拎出来 + If Url.StartsWithF("minecraft://") Then + ' 一定会被捕捉到错误,要单独拎出来 Process.Start(Url) Else Try From 6b719a45c5fda364c74c7eb1acc06d6909da2f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=AF=E5=B0=8F=E8=83=96=E5=91=8026?= <122529705+wuyuncheng-26@users.noreply.github.com> Date: Tue, 11 Jun 2024 23:33:23 +0800 Subject: [PATCH 07/87] Update MySkin.xaml.vb --- Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index 6256c5e..c0d838b 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -241,7 +241,7 @@ Retry: {"Translator-Chinese", "Crowdin 中文翻译者披风"}, {"Translator", "Crowdin 翻译者披风"}, {"Cobalt", "Cobalt 披风"}, {"Vanilla", "原版披风"}, {"Minecon2011", "Minecon 2011 参与者披风"}, {"Minecon2012", "Minecon 2012 参与者披风"}, {"Minecon2013", "Minecon 2013 参与者披风"}, {"Minecon2015", "Minecon 2015 参与者披风"}, {"Minecon2016", "Minecon 2016 参与者披风"}, - {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower","追随者披风"} + {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower's","追随者披风"} } Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}} For Each Cape In SkinData("capes") From 1d9c6d8aab3e472ffae9fba0c22719df3f47d436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=AF=E5=B0=8F=E8=83=96=E5=91=8026?= <122529705+wuyuncheng-26@users.noreply.github.com> Date: Wed, 12 Jun 2024 07:33:39 +0800 Subject: [PATCH 08/87] Update Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb Co-authored-by: allMagic <116283787+allMagicNB@users.noreply.github.com> --- Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index c0d838b..a0d6ad8 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -241,7 +241,7 @@ Retry: {"Translator-Chinese", "Crowdin 中文翻译者披风"}, {"Translator", "Crowdin 翻译者披风"}, {"Cobalt", "Cobalt 披风"}, {"Vanilla", "原版披风"}, {"Minecon2011", "Minecon 2011 参与者披风"}, {"Minecon2012", "Minecon 2012 参与者披风"}, {"Minecon2013", "Minecon 2013 参与者披风"}, {"Minecon2015", "Minecon 2015 参与者披风"}, {"Minecon2016", "Minecon 2016 参与者披风"}, - {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower's","追随者披风"} + {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower’s","追随者披风"} } Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}} For Each Cape In SkinData("capes") From ac2f29910b1d774bb05319586ce3183bcf06ecec Mon Sep 17 00:00:00 2001 From: JingHai-Lingyun Date: Fri, 14 Jun 2024 19:47:13 +0800 Subject: [PATCH 09/87] =?UTF-8?q?=E5=A5=BD=E5=90=A7=EF=BC=8C=E8=BF=99?= =?UTF-8?q?=E5=B9=B6=E4=B8=8D=E4=BC=9A=E5=87=BA=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Base/ModBase.vb | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 3351b3f..e346f24 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -2185,22 +2185,18 @@ NextElement: ''' 打开网页。 ''' Public Sub OpenWebsite(Url As String) - ' 允许 Minecraft 基岩版的 URLScheme (#3985) - If Url.StartsWithF("minecraft://") Then - ' 一定会被捕捉到错误,要单独拎出来 + Try + ' 允许 Minecraft 基岩版的 URLScheme (#3985) + If Not Url.StartsWithF("http", True) Or Not Url.StartsWithF("minecraft://") Then Throw New Exception(Url & " 不是一个有效的网址,它必须以 http 开头!") + Log("[System] 正在打开网页:" & Url) Process.Start(Url) - Else - Try - If Not Url.StartsWithF("http", True) Then Throw New Exception(Url & " 不是一个有效的网址,它必须以 http 开头!") - Log("[System] 正在打开网页:" & Url) - Process.Start(Url) - Catch ex As Exception - Log(ex, "无法打开网页(" & Url & ")") - ClipboardSet(Url, False) - MyMsgBox("可能由于浏览器未正确配置,PCL 无法为你打开网页。" & vbCrLf & "网址已经复制到剪贴板,若有需要可以手动粘贴访问。" & vbCrLf & - $"网址:{Url}", "无法打开网页") - End Try - End If + Catch ex As Exception + Log(ex, "无法打开网页(" & Url & ")") + ClipboardSet(Url, False) + MyMsgBox("可能由于浏览器未正确配置,PCL 无法为你打开网页。" & vbCrLf & "网址已经复制到剪贴板,若有需要可以手动粘贴访问。" & vbCrLf & + $"网址:{Url}", "无法打开网页") + End Try + ' End If End Sub ''' ''' 打开 explorer。注意参数中的路径要尽量加上双引号! From bb1b9d193f106ccb6efd88a21a41dda4e53588f0 Mon Sep 17 00:00:00 2001 From: JingHai-Lingyun Date: Fri, 14 Jun 2024 20:48:54 +0800 Subject: [PATCH 10/87] Update ModBase.vb --- Plain Craft Launcher 2/Modules/Base/ModBase.vb | 1 - 1 file changed, 1 deletion(-) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index e346f24..00e4bcc 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -2196,7 +2196,6 @@ NextElement: MyMsgBox("可能由于浏览器未正确配置,PCL 无法为你打开网页。" & vbCrLf & "网址已经复制到剪贴板,若有需要可以手动粘贴访问。" & vbCrLf & $"网址:{Url}", "无法打开网页") End Try - ' End If End Sub ''' ''' 打开 explorer。注意参数中的路径要尽量加上双引号! From d34a28a50314ad2a02dc55e246d25edeb4b1a99c Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 16:11:52 +0800 Subject: [PATCH 11/87] Add Set Hash --- .github/workflows/build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e0b81da..e729251 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,6 +26,12 @@ jobs: with: fetch-depth: 0 + - name: Set Hash + shell: bash + run: | + Hash=`git rev-parse --short HEAD` + echo "Describe=$Describe" >> $GITHUB_ENV + - name: Set Describe shell: bash run: | From 0a2c01d773d20b7d50f78aed1c8a25895bf65789 Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 16:21:28 +0800 Subject: [PATCH 12/87] Add workflow_dispatch --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e729251..8a906a1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,7 @@ on: paths: - 'Plain Craft Launcher 2/**' - '.github/workflows/**' + workflow_dispatch jobs: From e70e90403380d3486fabf50281c17b840d813929 Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 16:24:21 +0800 Subject: [PATCH 13/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8a906a1..bf9e754 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,7 +9,7 @@ on: paths: - 'Plain Craft Launcher 2/**' - '.github/workflows/**' - workflow_dispatch + workflow_dispatch: jobs: From 695fdc9068f32c6dd70d1569a7450f2ddec0d105 Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 16:32:15 +0800 Subject: [PATCH 14/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bf9e754..ed04985 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,15 +27,11 @@ jobs: with: fetch-depth: 0 - - name: Set Hash - shell: bash - run: | - Hash=`git rev-parse --short HEAD` - echo "Describe=$Describe" >> $GITHUB_ENV - - name: Set Describe shell: bash run: | + Hash=`git rev-parse --short HEAD` + echo echo "Describe=$Hash" >> $GITHUB_ENV Describe=`git describe --tags` echo "Describe=$Describe" >> $GITHUB_ENV From a8ea33b3b215c01dd5899f3f795953284a89dd3f Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 16:35:37 +0800 Subject: [PATCH 15/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ed04985..c4d5958 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,7 @@ jobs: fetch-depth: 0 - name: Set Describe + continue-on-error: true shell: bash run: | Hash=`git rev-parse --short HEAD` From 5994b38a4baa20a534491de62fa2352d7861f9ad Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 16:43:27 +0800 Subject: [PATCH 16/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c4d5958..37a178d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,11 +31,16 @@ jobs: continue-on-error: true shell: bash run: | - Hash=`git rev-parse --short HEAD` - echo echo "Describe=$Hash" >> $GITHUB_ENV Describe=`git describe --tags` echo "Describe=$Describe" >> $GITHUB_ENV + - name: Set Hash when Describe is `` + if: ${{ env.Describe}}=`` + shell: bash + run: | + Hash=`git rev-parse --short HEAD` + echo "Describe=$Hash" >> $GITHUB_ENV + - name: Setup MSBuild.exe uses: microsoft/setup-msbuild@v2 with: From adbcb3399cdd26e714428a835e2bd464f5af6b4b Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 16:45:04 +0800 Subject: [PATCH 17/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 37a178d..1719d6f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,7 +34,7 @@ jobs: Describe=`git describe --tags` echo "Describe=$Describe" >> $GITHUB_ENV - - name: Set Hash when Describe is `` + - name: Set Hash when Describe is Blank if: ${{ env.Describe}}=`` shell: bash run: | From 786f172425157cf614ba66a651df819e61acdfb5 Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 16:59:26 +0800 Subject: [PATCH 18/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1719d6f..8e07221 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,8 +34,8 @@ jobs: Describe=`git describe --tags` echo "Describe=$Describe" >> $GITHUB_ENV - - name: Set Hash when Describe is Blank - if: ${{ env.Describe}}=`` + - name: Set Hash as Describe when Describe is Blank + if: ${{ env.Describe }} shell: bash run: | Hash=`git rev-parse --short HEAD` From 7348a6be94e61466afa2ee5be29f8a715336b690 Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 17:08:04 +0800 Subject: [PATCH 19/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8e07221..1e876ac 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -35,7 +35,7 @@ jobs: echo "Describe=$Describe" >> $GITHUB_ENV - name: Set Hash as Describe when Describe is Blank - if: ${{ env.Describe }} + if: ${{ ! env.Describe }} shell: bash run: | Hash=`git rev-parse --short HEAD` From 2c0ecc8100234e34ad1e651c58f4b98efaafd899 Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 18:06:52 +0800 Subject: [PATCH 20/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e876ac..2d91edf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,6 +33,7 @@ jobs: run: | Describe=`git describe --tags` echo "Describe=$Describe" >> $GITHUB_ENV + exit 0 - name: Set Hash as Describe when Describe is Blank if: ${{ ! env.Describe }} From 1b186dc6ae27e41fe482b42ace9f456b19b449a5 Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 18:15:14 +0800 Subject: [PATCH 21/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2d91edf..a95c600 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,6 +32,9 @@ jobs: shell: bash run: | Describe=`git describe --tags` + if %errorlevel% neq 0 ( + exit /b 0 + ) echo "Describe=$Describe" >> $GITHUB_ENV exit 0 From f223ebfed92dd89cd6c414fddc76f628f3382982 Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 18:24:29 +0800 Subject: [PATCH 22/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a95c600..baba50a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,10 +31,7 @@ jobs: continue-on-error: true shell: bash run: | - Describe=`git describe --tags` - if %errorlevel% neq 0 ( - exit /b 0 - ) + Describe=`git describe --tags --always` echo "Describe=$Describe" >> $GITHUB_ENV exit 0 From b2e9a4486e60c9db99270ea684856c9b76561bd9 Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 18:26:47 +0800 Subject: [PATCH 23/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index baba50a..1a56a52 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,14 +33,6 @@ jobs: run: | Describe=`git describe --tags --always` echo "Describe=$Describe" >> $GITHUB_ENV - exit 0 - - - name: Set Hash as Describe when Describe is Blank - if: ${{ ! env.Describe }} - shell: bash - run: | - Hash=`git rev-parse --short HEAD` - echo "Describe=$Hash" >> $GITHUB_ENV - name: Setup MSBuild.exe uses: microsoft/setup-msbuild@v2 From fcc1afff3d5f7d4cc21abe8b04705130f20c75a5 Mon Sep 17 00:00:00 2001 From: allMagic <116283787+allMagicNB@users.noreply.github.com> Date: Sat, 15 Jun 2024 18:27:36 +0800 Subject: [PATCH 24/87] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20build.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1a56a52..f2c4927 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,7 +28,6 @@ jobs: fetch-depth: 0 - name: Set Describe - continue-on-error: true shell: bash run: | Describe=`git describe --tags --always` From 7ba79db82c59332dccc9f1f638c121800fc5d206 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sat, 15 Jun 2024 21:34:02 +0800 Subject: [PATCH 25/87] =?UTF-8?q?feat(neoforge):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=20NeoForge=20=E7=9A=84=E5=AE=89=E8=A3=85=E9=80=89?= =?UTF-8?q?=E9=A1=B9=EF=BC=8C=E5=B9=B6=E6=94=AF=E6=8C=81=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 226 +++++++ .../Pages/PageDownload/ModDownloadLib.vb | 624 ++++++++++++++++++ .../PageDownload/PageDownloadInstall.xaml | 19 + .../PageDownload/PageDownloadInstall.xaml.vb | 134 +++- 4 files changed, 1002 insertions(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 10cfdbb..9e9ea6a 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -721,6 +721,232 @@ #End Region +#Region "DlNeoForgeVersion | NeoForge 版本列表" + + Public Class DlNeoForgeVersionEntry + ''' + ''' 完整的版本名,如 “14.22.1.2478”。 + ''' + Public Version As String + ''' + ''' 对应的 Minecraft 版本,如“1.12.2”。 + ''' + Public Inherit As String + ''' + ''' 发布时间,格式为“yyyy/MM/dd HH:mm”。 + ''' + Public ReleaseTime As String + ''' + ''' 文件的 MD5 或 SHA1(BMCLAPI 的老版本是 MD5,新版本是 SHA1;官方源总是 MD5)。 + ''' + Public Hash As String = Nothing + ''' + ''' 安装类型。有 installer、client、universal 三种。 + ''' + Public Category As String + ''' + ''' 版本分支。若无分支则为 Nothing。 + ''' + Public Branch As String = Nothing + Public Structure DlNeoForgeListResult + ''' + ''' 数据来源名称,如“Official”,“BMCLAPI”。 + ''' + Public SourceName As String + ''' + ''' 是否为官方的实时数据。 + ''' + Public IsOfficial As Boolean + ''' + ''' 获取到的数据。 + ''' + Public Value As JObject + End Structure + ''' + ''' 是否为新版 Forge。(即为 Minecraft 1.13+) + ''' + Public ReadOnly Property IsNewType As Boolean + Get + Return Version.Split(".")(0) >= 20 + End Get + End Property + ''' + ''' 构建数。 + ''' + Public ReadOnly Property Build As Integer + Get + Dim Version = Me.Version.Split(".") + If Version(0) < 15 Then + Return Version(Version.Count - 1) + Else + Return Version(Version.Count - 1) + 10000 + End If + End Get + End Property + ''' + ''' 用于下载的文件版本名。可能在 Version 的基础上添加了分支。 + ''' + Public ReadOnly Property FileVersion As String + Get + Return Version & If(Branch Is Nothing, "", "-" & Branch) + End Get + End Property + ''' + ''' 即将下载的文件全名。 + ''' + Public ReadOnly Property FileName As String + Get + Return "forge-" & Inherit & "-" & FileVersion & "-" & Category & "." & FileSuffix + End Get + End Property + ''' + ''' 文件扩展名。 + ''' + Public ReadOnly Property FileSuffix As String + Get + If Category = "installer" Then + Return "jar" + Else + Return "zip" + End If + End Get + End Property + End Class + + ''' + ''' NeoForge 版本列表,主加载器。 + ''' + 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) + Select Case Setup.Get("ToolDownloadVersion") + Case 0 + DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 30), + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 60) + }, Loader.IsForceRestarting) + Case 1 + DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 5), + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 35) + }, Loader.IsForceRestarting) + Case Else + DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 60), + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 60) + }, Loader.IsForceRestarting) + End Select + End Sub + + ''' + ''' NeoForge 版本列表,官方源。 + ''' + Public Sub DlNeoForgeVersionOfficialMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) + Dim Result As String + Dim ResultJson As JObject + Try + Result = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) + Catch ex As Exception + If GetExceptionSummary(ex).Contains("(404)") Then + Throw New Exception("没有可用版本") + Else + Throw + End If + End Try + If Result.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") + ResultJson = GetJson(Result) + Dim Versions As New List(Of DlNeoForgeVersionEntry) + Dim VersionList As String = ResultJson("versions") + MyMsgBox(VersionList, "VersionList 获取测试") + 'Try + ' Try + ' '基础信息获取 + ' Dim Name As String = RegexSeek(VersionCode, "(?<=[^(0-9)]+)[0-9\.]+") + ' Dim IsRecommended As Boolean = VersionCode.Contains("fa promo-recommended") + ' Dim Inherit As String = Loader.Input + ' '分支获取 + ' Dim Branch As String = RegexSeek(VersionCode, $"(?<=-{Name}-)[^-""]+(?=-[a-z]+.[a-z]{{3}})") + ' If String.IsNullOrWhiteSpace(Branch) Then Branch = Nothing + ' '发布时间获取 + ' Dim ReleaseTimeOriginal = RegexSeek(VersionCode, "(?<=""download-time"" title="")[^""]+") + ' Dim ReleaseTimeSplit = ReleaseTimeOriginal.Split(" -:".ToCharArray) '原格式:"2021-02-15 03:24:02" + ' Dim ReleaseDate As New Date(ReleaseTimeSplit(0), ReleaseTimeSplit(1), ReleaseTimeSplit(2), '年月日 + ' ReleaseTimeSplit(3), ReleaseTimeSplit(4), ReleaseTimeSplit(5), '时分秒 + ' 0, DateTimeKind.Utc) '以 UTC 时间作为标准 + ' Dim ReleaseTime As String = ReleaseDate.ToLocalTime.ToString("yyyy'/'MM'/'dd HH':'mm") '时区与格式转换 + ' '添加进列表 + ' Versions.Add(New DlNeoForgeVersionEntry With {.Category = Category, .Version = Name, .Hash = MD5.Trim(vbCr, vbLf), .Inherit = Inherit, .ReleaseTime = ReleaseTime, .Branch = Branch}) + ' Catch ex As Exception + ' Throw New Exception("版本信息提取失败(" & VersionCode & ")", ex) + ' End Try + 'Catch ex As Exception + ' Throw New Exception("版本列表解析失败(" & Result & ")", ex) + 'End Try + If Not Versions.Any() Then Throw New Exception("没有可用版本") + Loader.Output = Versions + End Sub + + ''' + ''' NeoForge 版本列表,BMCLAPI。 + ''' + Public Sub DlNeoForgeVersionBmclapiMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) + Dim Json As JArray = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/neoforge/list/" & Loader.Input, IsJson:=True) + Dim Versions As New List(Of DlNeoForgeVersionEntry) + Try + For Each Token As JObject In Json + Dim Name As String = Token("version") + Dim Inherit As String = Token("mcversion") + Dim Entry = New DlNeoForgeVersionEntry With {.Version = Name, .Inherit = Inherit} + Versions.Add(Entry) + Next + 'For Each Token As JObject In Json + ' '分类与 Hash 获取 + ' Dim Hash As String = Nothing, Category As String = "unknown", Proi As Integer = -1 + ' For Each File As JObject In Token("files") + ' Select Case File("category").ToString + ' Case "installer" + ' If File("format").ToString = "jar" Then + ' '类型为 installer.jar,支持范围 ~753 (~ 1.6.1 部分), 738~684 (1.5.2 全部) + ' Hash = File("hash") + ' Category = "installer" + ' Proi = 2 + ' End If + ' Case "universal" + ' If Proi <= 1 AndAlso File("format").ToString = "zip" Then + ' '类型为 universal.zip,支持范围 751~449 (1.6.1 部分), 682~183 (1.5.1 ~ 1.3.2 部分) + ' Hash = File("hash") + ' Category = "universal" + ' Proi = 1 + ' End If + ' Case "client" + ' If Proi <= 0 AndAlso File("format").ToString = "zip" Then + ' '类型为 client.zip,支持范围 182~ (1.3.2 部分 ~) + ' Hash = File("hash") + ' Category = "client" + ' Proi = 0 + ' End If + ' End Select + ' Next + ' '获取 Entry + ' Dim Inherit As String = Loader.Input + ' Dim Branch As String = Token("branch") + ' Dim Name As String = Token("version") + ' '基础信息获取 + ' Dim Entry = New DlNeoForgeVersionEntry With {.Hash = Hash, .Category = Category, .Version = Name, .Branch = Branch, .Inherit = Inherit} + ' Dim TimeSplit = Token("modified").ToString.Split("-"c, "T"c, ":"c, "."c, " "c, "/"c) + ' Entry.ReleaseTime = Token("modified").ToObject(Of Date).ToLocalTime.ToString("yyyy'/'MM'/'dd HH':'mm") + ' '添加项 + ' Versions.Add(Entry) + 'Next + Catch ex As Exception + Throw New Exception("版本列表解析失败(" & Json.ToString & ")", ex) + End Try + If Not Versions.Any() Then Throw New Exception("没有可用版本") + Loader.Output = Versions + End Sub + +#End Region + #Region "DlLiteLoaderList | LiteLoader 版本列表" Public Structure DlLiteLoaderListResult diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 3b02dc6..6f6a331 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1696,6 +1696,630 @@ Retry: #End Region +#Region "NeoForge 下载" + + Public Sub McDownloadNeoForge(DownloadInfo As DlNeoForgeVersionEntry) + '老版本提示 + If DownloadInfo.Category = "client" Then + If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & + "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", + "版本过老", "继续", "取消") = 1 Then + McDownloadNeoForgeSave(DownloadInfo) + End If + Exit Sub + End If + If DownloadInfo.Category = "universal" OrElse DownloadInfo.Inherit.StartsWithF("1.5") Then '对该版本自动安装的支持将在之后加入 + If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & + "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", + "版本过老", "继续", "取消") = 1 Then + McDownloadNeoForgeSave(DownloadInfo) + End If + Exit Sub + End If + '初始化参数 + Dim Id As String = DownloadInfo.Inherit & "-neoforge-" & DownloadInfo.Version + Dim Target As String = PathTemp & "Cache\Code\NeoForgeInstall-" & DownloadInfo.Version & "_" & GetUuid() & "." & DownloadInfo.FileSuffix + Dim VersionFolder As String = PathMcFolder & "versions\" & Id & "\" + Dim DisplayName As String = "Forge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version + Try + + '重复任务检查 + SyncLock LoaderTaskbarLock + For i = 0 To LoaderTaskbar.Count - 1 + If LoaderTaskbar(i).Name = DisplayName & " 下载" Then + Hint("该版本正在下载中!", HintType.Critical) + Exit Sub + End If + Next + End SyncLock + + '已有版本检查 + If File.Exists(VersionFolder & Id & ".json") Then + If MyMsgBox("版本 " & Id & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 json 和 jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then + File.Delete(VersionFolder & Id & ".jar") + File.Delete(VersionFolder & Id & ".json") + Else + Exit Sub + End If + End If + + '启动 + Dim Loader As New LoaderCombo(Of String)(DisplayName & " 下载", McDownloadNeoForgeLoader(DownloadInfo.Version, DownloadInfo.Inherit, DownloadInfo)) With {.OnStateChanged = AddressOf McInstallState} + Loader.Start(VersionFolder) + LoaderTaskbarAdd(Loader) + FrmMain.BtnExtraDownload.ShowRefresh() + FrmMain.BtnExtraDownload.Ribble() + + Catch ex As Exception + Log(ex, "开始 NeoForge 下载失败", LogLevel.Feedback) + Finally + '删除安装包 + Try + If File.Exists(Target) Then File.Delete(Target) + Catch + End Try + End Try + End Sub + Public Sub McDownloadNeoForgeSave(DownloadInfo As DlNeoForgeVersionEntry) + Try + Dim Target As String = SelectAs("选择保存位置", DownloadInfo.FileName, "NeoForge 文件 (*." & DownloadInfo.FileSuffix & ")|*." & DownloadInfo.FileSuffix) + Dim DisplayName As String = "Forge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version + If Not Target.Contains("\") Then Exit Sub + + '重复任务检查 + SyncLock LoaderTaskbarLock + For i = 0 To LoaderTaskbar.Count - 1 + If LoaderTaskbar(i).Name = DisplayName & " 下载" Then + Hint("该版本正在下载中!", HintType.Critical) + Exit Sub + End If + Next + End SyncLock + + '构造步骤加载器 + 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))) + Dim Files As New List(Of NetFile) + Files.Add(New NetFile({ + "https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName, + "https://files.minecraftforge.net/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName + }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) + Task.Output = Files + End Sub) With {.ProgressWeight = 0.1, .Show = False}) + '下载 + Loaders.Add(New LoaderDownload("下载主文件", New List(Of NetFile)) With {.ProgressWeight = 6}) + + '启动 + Dim Loader As New LoaderCombo(Of DlForgeVersionEntry)(DisplayName & " 下载", Loaders) With {.OnStateChanged = AddressOf DownloadStateSave} + Loader.Start(DownloadInfo) + LoaderTaskbarAdd(Loader) + FrmMain.BtnExtraDownload.ShowRefresh() + FrmMain.BtnExtraDownload.Ribble() + + Catch ex As Exception + Log(ex, "开始 NeoForge 下载失败", LogLevel.Feedback) + End Try + End Sub + + Private Sub NeoForgeInjector(Target As String, Task As LoaderTask(Of Boolean, Boolean), McFolder As String, UseJavaWrapper As Boolean) + '选择 Java + Dim Java As JavaEntry + SyncLock JavaLock + Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 60)) + If Java Is Nothing Then + If Not JavaDownloadConfirm("Java 8 或更高版本") Then Throw New Exception("由于未找到 Java,已取消安装。") + '开始自动下载 + Dim JavaLoader = JavaFixLoaders(17) + Try + JavaLoader.Start(17, IsForceRestart:=True) + Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted + Thread.Sleep(10) + Loop + Finally + JavaLoader.Abort() '确保取消时中止 Java 下载 + End Try + '检查下载结果 + Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 60)) + If Task.IsAborted Then Exit Sub + If Java Is Nothing Then Throw New Exception("由于未找到 Java,已取消安装。") + End If + End SyncLock + '添加 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}" + Else + Arguments = $"-cp ""{PathTemp}Cache\forge_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 + '开始启动 + SyncLock InstallSyncLock + Dim Info = New ProcessStartInfo With { + .FileName = Java.PathJavaw, + .Arguments = Arguments, + .UseShellExecute = False, + .CreateNoWindow = True, + .RedirectStandardError = True, + .RedirectStandardOutput = True + } + Log("[Download] 开始安装 NeoForge:" & Arguments) + Dim process As New Process With {.StartInfo = Info} + Dim LastResults As New Queue(Of String) + Using outputWaitHandle As New AutoResetEvent(False) + Using errorWaitHandle As New AutoResetEvent(False) + AddHandler process.OutputDataReceived, + Function(sender, e) + Try + If e.Data Is Nothing Then + outputWaitHandle.[Set]() + Else + LastResults.Enqueue(e.Data) + If LastResults.Count > 100 Then LastResults.Dequeue() + NeoForgeInjectorLine(e.Data, Task) + End If + Catch ex As ObjectDisposedException + Catch ex As Exception + Log(ex, "读取 NeoForge 安装器信息失败") + End Try + Try + If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then + Log("[Installer] 由于任务取消,已中止 NeoForge 安装") + process.Kill() + End If + Catch + End Try + Return Nothing + End Function + AddHandler process.ErrorDataReceived, + Function(sender, e) + Try + If e.Data Is Nothing Then + errorWaitHandle.[Set]() + Else + LastResults.Enqueue(e.Data) + If LastResults.Count > 100 Then LastResults.Dequeue() + ForgeInjectorLine(e.Data, Task) + End If + Catch ex As ObjectDisposedException + Catch ex As Exception + Log(ex, "读取 Forge 安装器错误信息失败") + End Try + Try + If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then + Log("[Installer] 由于任务取消,已中止 Forge 安装") + process.Kill() + End If + Catch + End Try + Return Nothing + End Function + process.Start() + process.BeginOutputReadLine() + process.BeginErrorReadLine() + '等待 + Do Until process.HasExited + Thread.Sleep(10) + Loop + '输出 + outputWaitHandle.WaitOne(10000) + errorWaitHandle.WaitOne(10000) + process.Dispose() + '检查是否安装成功:最后两行中是否有 true(true 可能在倒数第二行,见 #832) + If LastResults.Last = "true" OrElse (LastResults.Count >= 2 AndAlso LastResults(LastResults.Count - 2) = "true") Then Exit Sub + Log(Join(LastResults, vbCrLf)) + Dim LastLines As String = "" + 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) + End Using + End Using + End SyncLock + End Sub + Private Sub NeoForgeInjectorLine(Content As String, Task As LoaderTask(Of Boolean, Boolean)) + If Content.StartsWithF(" Data") OrElse Content.StartsWithF(" Slim") Then + If ModeDebug Then Log("[Installer] " & Content) + ElseIf Content.StartsWithF(" Reading patch ") Then + If ModeDebug Then Log("[Installer] " & Content) + Task.Progress = 0.86 + Else + Select Case Content + Case "Extracting json" + Log("[Installer] " & Content) + Task.Progress = 0.07 + Case "Downloading libraries" + Log("[Installer] " & Content) + Task.Progress = 0.08 + Case " File exists: Checksum validated." + If ModeDebug Then Log("[Installer] " & Content) + Task.Progress += 0.003 + Case "Building Processors" + Task.Progress = 0.38 + Case "Task: DOWNLOAD_MOJMAPS" 'B + Task.Progress = 0.4 + Case "Task: MERGE_MAPPING" 'B + Task.Progress = 0.6 + Case "Splitting: " + Task.Progress = 0.62 + Case "Parameter Annotations" 'B + Task.Progress = 0.66 + Case "Processing Complete" 'B + Task.Progress = 0.7 + Case "Remapping final jar" 'A + Task.Progress = 0.72 + Case "Remapping jar... 50%" 'A + Task.Progress = 0.76 + Case "Remapping jar... 100%" 'A + Task.Progress = 0.81 + Case "Injecting profile" + Task.Progress = 0.91 + Case Else + If ModeDebug Then Log("[Installer] " & Content) + Exit Sub + End Select + Log("[Installer] " & Content) + End If + End Sub + + ''' + ''' 获取下载某个 NeoForge 版本的加载器列表。 + ''' + Private Function McDownloadNeoForgeLoader(Version As String, Inherit As String, Optional DownloadInfo As DlNeoForgeVersionEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) + + '参数初始化 + 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 + Dim IsCustomFolder As Boolean = McFolder <> PathMcFolder + 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 Loaders As New List(Of LoaderBase) + Dim LibVersionFolder As String = PathMcFolder & "versions\" & Id & "\" '作为 Lib 文件目标的版本文件夹 + + '获取下载信息 + If DownloadInfo Is Nothing Then + Loaders.Add(New LoaderTask(Of String, String)("获取 Mod 加载器详细信息", + Sub(Task As LoaderTask(Of String, String)) + '获取 Forge 版本列表 + Dim NeoForgeLoader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadNeoForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain) + NeoForgeLoader.WaitForExit(Inherit) + Task.Progress = 0.8 + '查找对应版本 + For Each NeoForgeVersion In NeoForgeLoader.Output + If NeoForgeVersion.Version = Version Then + DownloadInfo = NeoForgeVersion + Exit Sub + End If + Next + Throw New Exception("未能找到 NeoForge " & Inherit & "-" & Version & " 的详细信息!") + End Sub) With {.ProgressWeight = 3}) + End If + '下载 Forge 主文件 + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备 Mod 加载器下载", + Sub(Task As LoaderTask(Of String, List(Of NetFile))) + '启动依赖版本的下载 + If ClientDownloadLoader Is Nothing Then + If IsCustomFolder Then Throw New Exception("如果没有指定原版下载器,则不能指定 MC 安装文件夹") + ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, Inherit) + 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 + }, 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 加载器支持库文件", + Sub(Task As LoaderTask(Of String, List(Of NetFile))) + Task.Output = New List(Of NetFile) + Dim Installer As ZipArchive = Nothing + Try + '解压并获取、合并两个 Json 的信息 + Installer = New ZipArchive(New FileStream(InstallerAddress, FileMode.Open)) + Task.Progress = 0.2 + Dim Json As JObject = GetJson(ReadFile(Installer.GetEntry("install_profile.json").Open)) + Dim Json2 As JObject = GetJson(ReadFile(Installer.GetEntry("version.json").Open)) + Json.Merge(Json2) + '获取 Lib 下载信息 + Libs = McLibListGetWithJson(Json, True) + '添加 Mappings 下载信息 + If Json("data") IsNot Nothing AndAlso Json("data")("MOJMAPS") IsNot Nothing Then + '下载原版 Json 文件 + Task.Progress = 0.4 + Dim RawJson As JObject = GetJson(NetGetCodeByDownload(DlSourceLauncherOrMetaGet(DlClientListGet(Inherit)), IsJson:=True)) + '[net.minecraft:client:1.17.1-20210706.113038:mappings@txt] 或 @tsrg] + Dim OriginalName As String = Json("data")("MOJMAPS")("client").ToString.Trim("[]".ToCharArray()).Before("@") + Dim Address = McLibGet(OriginalName).Replace(".jar", "-mappings." & Json("data")("MOJMAPS")("client").ToString.Trim("[]".ToCharArray()).Split("@")(1)) + Libs.Add(New McLibToken With {.IsJumpLoader = False, .IsNatives = False, .LocalPath = Address, .OriginalName = OriginalName, + .Url = RawJson("downloads")("client_mappings")("url"), .Size = RawJson("downloads")("client_mappings")("size"), .SHA1 = RawJson("downloads")("client_mappings")("sha1")}) + Log("[Download] 需要下载 Mappings:" & Address) + End If + Task.Progress = 0.8 + '去除其中的原始 Forge 项 + For i = 0 To Libs.Count - 1 + If Libs(i).LocalPath.EndsWithF("forge-" & Inherit & "-" & Version & ".jar") OrElse + Libs(i).LocalPath.EndsWithF("forge-" & Inherit & "-" & Version & "-client.jar") Then + Log("[Download] 已从待下载 Forge 支持库中移除:" & 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) + Finally + '释放文件 + 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 下载器支持库文件", + Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) +#Region "Forge 文件" + If IsCustomFolder Then + For Each LibFile As McLibToken In Libs + Dim RealPath As String = LibFile.LocalPath.Replace(PathMcFolder, McFolder) + If Not File.Exists(RealPath) Then + Directory.CreateDirectory(IO.Path.GetDirectoryName(RealPath)) + CopyFile(LibFile.LocalPath, RealPath) + End If + If ModeDebug Then Log("[Download] 复制的 Forge 支持库文件:" & LibFile.LocalPath) + Next + End If +#End Region +#Region "原版文件" + '等待原版文件下载完成 + If ClientDownloadLoader Is Nothing Then Exit Sub + 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 安装正在等待原版文件下载完成") + Do While TargetLoaders.Any AndAlso Not Task.IsAborted + TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList + Thread.Sleep(50) + Loop + If Task.IsAborted Then Exit Sub + '拷贝原版文件 + If Not IsCustomFolder Then Exit Sub + SyncLock VanillaSyncLock + Dim ClientName As String = GetFolderNameFromPath(ClientFolder) + Directory.CreateDirectory(McFolder & "versions\" & Inherit) + If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".json") Then + CopyFile(ClientFolder & ClientName & ".json", McFolder & "versions\" & Inherit & "\" & Inherit & ".json") + End If + If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".jar") Then + CopyFile(ClientFolder & ClientName & ".jar", McFolder & "versions\" & Inherit & "\" & Inherit & ".jar") + End If + End SyncLock +#End Region + End Sub) With {.ProgressWeight = 0.1, .Show = False}) + Loaders.Add(New LoaderTask(Of Boolean, Boolean)("安装 Mod 加载器(方式 A)", + Sub(Task As LoaderTask(Of Boolean, Boolean)) + Dim Installer As ZipArchive = Nothing + Try + Log("[Download] 开始进行新版方式 Forge 安装:" & InstallerAddress) + '记录当前文件夹列表(在新建目标文件夹之前) + Dim OldList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories. + Select(Function(i) i.FullName).ToList() + '解压并获取信息 + Installer = New ZipArchive(New FileStream(InstallerAddress, FileMode.Open)) + Dim Json As JObject = GetJson(ReadFile(Installer.GetEntry("install_profile.json").Open)) + '新建目标版本文件夹 + Directory.CreateDirectory(VersionFolder) + Task.Progress = 0.04 + '释放 launcher_installer.json + McFolderLauncherProfilesJsonCreate(McFolder) + Task.Progress = 0.05 + '运行 Forge 安装器 + Dim UseJavaWrapper As Boolean = True +Retry: + Try + '释放 Forge 注入器 + WriteFile(PathTemp & "Cache\forge_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 并重试") + UseJavaWrapper = False + GoTo Retry + Else + Throw New Exception("运行 Forge 安装器失败", ex) + End If + End Try + '拷贝新增的版本 Json + Dim DeltaList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories. + SkipWhile(Function(i) OldList.Contains(i.FullName)).ToList() + If DeltaList.Count > 1 Then + '它可能和 OptiFine 安装同时运行,导致增加的文件不止一个(这导致了 #151) + '也可能是因为 Forge 安装器的 Bug,生成了一个名字错误的文件夹,所以需要检查文件夹是否为空 + DeltaList = DeltaList.Where(Function(l) l.Name.Contains("forge") AndAlso l.EnumerateFiles.Any).ToList + End If + If DeltaList.Count = 1 Then '如果没有新增文件夹,那么预测的文件夹名就是正确的 + Dim JsonFile As FileInfo = DeltaList(0).EnumerateFiles.First() + WriteFile(VersionFolder & Id & ".json", ReadFile(JsonFile.FullName)) + End If + '新建 mods 文件夹 + Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\") + Catch ex As Exception + Throw New Exception("安装新 Forge 版本失败", 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 清理文件时出错") + End Try + End Try + End Sub) With {.ProgressWeight = 10}) + Else + Log("[Download] 检测为非新版 Forge:" & 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("非新版方式安装 Forge 失败", 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, "非新版方式安装 Forge 清理文件时出错") + 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 + +#End Region + +#Region "NeoForge 下载菜单" + + Public Sub NeoForgeDownloadListItemPreload(Stack As StackPanel, Entrys As List(Of DlNeoForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) + '获取最新版本 + Dim FreshVersion As DlNeoForgeVersionEntry = Nothing + If Entrys.Any Then + FreshVersion = Entrys(0) + Else + Log("[System] 未找到可用的 NeoForge 版本", LogLevel.Debug) + End If + Dim RecommendedVersion As DlNeoForgeVersionEntry = Nothing + '显示各个版本 + If FreshVersion IsNot Nothing Then + Dim Fresh = NeoForgeDownloadListItem(FreshVersion, OnClick, IsSaveOnly) + Fresh.Info = "最新版" & If(Fresh.Info = "", "", "," & Fresh.Info) + Stack.Children.Add(Fresh) + End If + '添加间隔 + Stack.Children.Add(New TextBlock With {.Text = "全部版本 (" & Entrys.Count & ")", .HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(6, 13, 0, 4)}) + End Sub + 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, + .Info = If(Entry.ReleaseTime = "", + If(ModeDebug, "种类:" & 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" + } + AddHandler NewItem.Click, OnClick + '建立菜单 + If IsSaveOnly Then + NewItem.ContentHandler = AddressOf NeoForgeSaveContMenuBuild + Else + NewItem.ContentHandler = AddressOf NeoForgeContMenuBuild + End If + '结束 + Return NewItem + End Function + Private Sub NeoForgeContMenuBuild(sender As MyListItem, e As EventArgs) + Dim BtnSave As New MyIconButton With {.Logo = Logo.IconButtonSave, .ToolTip = "另存为"} + ToolTipService.SetPlacement(BtnSave, Primitives.PlacementMode.Center) + ToolTipService.SetVerticalOffset(BtnSave, 30) + ToolTipService.SetHorizontalOffset(BtnSave, 2) + AddHandler BtnSave.Click, AddressOf NeoForgeSave_Click + Dim BtnInfo As New MyIconButton With {.LogoScale = 1.05, .Logo = Logo.IconButtonInfo, .ToolTip = "更新日志"} + ToolTipService.SetPlacement(BtnInfo, Primitives.PlacementMode.Center) + ToolTipService.SetVerticalOffset(BtnInfo, 30) + ToolTipService.SetHorizontalOffset(BtnInfo, 2) + AddHandler BtnInfo.Click, AddressOf NeoForgeLog_Click + sender.Buttons = {BtnSave, BtnInfo} + End Sub + Private Sub NeoForgeSaveContMenuBuild(sender As MyListItem, e As EventArgs) + Dim BtnInfo As New MyIconButton With {.LogoScale = 1.05, .Logo = Logo.IconButtonInfo, .ToolTip = "更新日志"} + ToolTipService.SetPlacement(BtnInfo, Primitives.PlacementMode.Center) + ToolTipService.SetVerticalOffset(BtnInfo, 30) + ToolTipService.SetHorizontalOffset(BtnInfo, 2) + AddHandler BtnInfo.Click, AddressOf NeoForgeLog_Click + sender.Buttons = {BtnInfo} + End Sub + Private Sub NeoForgeLog_Click(sender As Object, e As RoutedEventArgs) + Dim Version As DlForgeVersionEntry + If sender.Tag IsNot Nothing Then + Version = sender.Tag + ElseIf sender.Parent.Tag IsNot Nothing Then + Version = sender.Parent.Tag + 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") + End Sub + Public Sub NeoForgeSave_Click(sender As Object, e As RoutedEventArgs) + Dim Version As DlForgeVersionEntry + If sender.Tag IsNot Nothing Then + Version = sender.Tag + ElseIf sender.Parent.Tag IsNot Nothing Then + Version = sender.Parent.Tag + Else + Version = sender.Parent.Parent.Tag + End If + McDownloadForgeSave(Version) + End Sub + +#End Region + #Region "Fabric 下载" Public Sub McDownloadFabricLoaderSave(DownloadInfo As JObject) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml index b6b6dc5..69c47f3 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml @@ -79,6 +79,24 @@ Data="F1 M2,0 L0,2 8,10 0,18 2,20 10,12 18,20 20,18 12,10 20,2 18,0 10,8 2,0Z" /> + + + + + + + + + + + + + + + + + @@ -178,6 +196,7 @@ + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index d7ef0bc..f703ef4 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -51,6 +51,7 @@ CardOptiFine.IsSwaped = True CardLiteLoader.IsSwaped = True CardForge.IsSwaped = True + CardNeoForge.IsSwaped = True CardFabric.IsSwaped = True CardFabricApi.IsSwaped = True CardOptiFabric.IsSwaped = True @@ -73,6 +74,13 @@ ForgeLoader.Start(SelectedMinecraftId) End If + '启动 NeoForge 加载 + If SelectedMinecraftId.StartsWith("1.") Then + Dim NeoForgeLoader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion " & SelectedMinecraftId, AddressOf DlNeoForgeVersionMain) + LoadNeoForge.State = NeoForgeLoader + NeoForgeLoader.Start(SelectedMinecraftId) + End If + '启动 Fabric API、OptiFabric 加载 DlFabricApiLoader.Start() DlOptiFabricLoader.Start() @@ -86,6 +94,7 @@ OptiFine_Loaded() LiteLoader_Loaded() Forge_Loaded() + NeoForge_Loaded() Fabric_Loaded() FabricApi_Loaded() OptiFabric_Loaded() @@ -102,6 +111,7 @@ BtnOptiFineClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardOptiFine.MainTextBlock, .Mode = BindingMode.OneWay}) BtnLiteLoaderClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardLiteLoader.MainTextBlock, .Mode = BindingMode.OneWay}) BtnForgeClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardForge.MainTextBlock, .Mode = BindingMode.OneWay}) + BtnNeoForgeClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardNeoForge.MainTextBlock, .Mode = BindingMode.OneWay}) BtnFabricClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardFabric.MainTextBlock, .Mode = BindingMode.OneWay}) BtnFabricApiClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardFabricApi.MainTextBlock, .Mode = BindingMode.OneWay}) BtnOptiFabricClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardOptiFabric.MainTextBlock, .Mode = BindingMode.OneWay}) @@ -213,6 +223,26 @@ End If End Sub + 'NeoForge + Private SelectedNeoForge As DlNeoForgeVersionEntry = Nothing + Private Sub SetNeoForgeInfoShow(IsShow As String) + If PanNeoForgeInfo.Tag = IsShow Then Exit Sub + PanNeoForgeInfo.Tag = IsShow + If IsShow = "True" Then + '显示信息栏 + AniStart({ + AaTranslateY(PanNeoForgeInfo, -CType(PanNeoForgeInfo.RenderTransform, TranslateTransform).Y, 270, 100, Ease:=New AniEaseOutBack), + AaOpacity(PanNeoForgeInfo, 1 - PanNeoForgeInfo.Opacity, 100, 90) + }, "SetNeoForgeInfoShow") + Else + '隐藏信息栏 + AniStart({ + AaTranslateY(PanNeoForgeInfo, 6 - CType(PanNeoForgeInfo.RenderTransform, TranslateTransform).Y, 200), + AaOpacity(PanNeoForgeInfo, -PanNeoForgeInfo.Opacity, 100) + }, "SetNeoForgeInfoShow") + End If + End Sub + 'Fabric Private SelectedFabric As String = Nothing Private Sub SetFabricInfoShow(IsShow As String) @@ -277,7 +307,7 @@ ''' ''' 重载已选择的项目的显示。 ''' - Private Sub SelectReload() Handles CardOptiFine.Swap, LoadOptiFine.StateChanged, CardForge.Swap, LoadForge.StateChanged, CardFabric.Swap, LoadFabric.StateChanged, CardFabricApi.Swap, LoadFabricApi.StateChanged, CardOptiFabric.Swap, LoadOptiFabric.StateChanged, CardLiteLoader.Swap, LoadLiteLoader.StateChanged + Private Sub SelectReload() Handles CardOptiFine.Swap, LoadOptiFine.StateChanged, CardForge.Swap, LoadForge.StateChanged, CardNeoForge.Swap, LoadNeoForge.StateChanged, CardFabric.Swap, LoadFabric.StateChanged, CardFabricApi.Swap, LoadFabricApi.StateChanged, CardOptiFabric.Swap, LoadOptiFabric.StateChanged, CardLiteLoader.Swap, LoadLiteLoader.StateChanged If SelectedMinecraftId Is Nothing OrElse IsReloading Then Exit Sub IsReloading = True '主预览 @@ -341,6 +371,22 @@ LabForge.Text = SelectedForge.Version LabForge.Foreground = ColorGray1 End If + 'NeoForge + Dim NeoForgeError As String = LoadNeoForgeGetError() + CardNeoForge.MainSwap.Visibility = If(NeoForgeError Is Nothing, Visibility.Visible, Visibility.Collapsed) + If NeoForgeError IsNot Nothing Then CardNeoForge.IsSwaped = True + SetNeoForgeInfoShow(CardNeoForge.IsSwaped) + If SelectedNeoForge Is Nothing Then + BtnNeoForgeClear.Visibility = Visibility.Collapsed + ImgNeoForge.Visibility = Visibility.Collapsed + LabNeoForge.Text = If(NeoForgeError, "点击选择") + LabNeoForge.Foreground = ColorGray4 + Else + BtnNeoForgeClear.Visibility = Visibility.Visible + ImgNeoForge.Visibility = Visibility.Visible + LabNeoForge.Text = SelectedNeoForge.Version + LabNeoForge.Foreground = ColorGray1 + End If 'Fabric If SelectedMinecraftId.Contains("1.") AndAlso Val(SelectedMinecraftId.Split(".")(1)) <= 13 Then CardFabric.Visibility = Visibility.Collapsed @@ -434,6 +480,7 @@ SelectedOptiFine = Nothing SelectedLiteLoader = Nothing SelectedForge = Nothing + SelectedNeoForge = Nothing SelectedFabric = Nothing SelectedFabricApi = Nothing SelectedOptiFabric = Nothing @@ -451,6 +498,9 @@ If SelectedForge IsNot Nothing Then Name += "-Forge_" & SelectedForge.Version End If + If SelectedNeoForge IsNot Nothing Then + Name += "-NeoForge_" & SelectedNeoForge.Version + End If If SelectedLiteLoader IsNot Nothing Then Name += "-LiteLoader" End If @@ -470,6 +520,9 @@ If SelectedForge IsNot Nothing Then Info += ", Forge " & SelectedForge.Version End If + If SelectedNeoForge IsNot Nothing Then + Info += ", NeoForge " & SelectedNeoForge.Version + End If If SelectedLiteLoader IsNot Nothing Then Info += ", LiteLoader" End If @@ -487,6 +540,8 @@ Return "pack://application:,,,/images/Blocks/Fabric.png" ElseIf SelectedForge IsNot Nothing Then Return "pack://application:,,,/images/Blocks/Anvil.png" + ElseIf SelectedNeoForge IsNot Nothing Then + Return "pack://application:,,,/images/Blocks/Anvil.png" ElseIf SelectedLiteLoader IsNot Nothing Then Return "pack://application:,,,/images/Blocks/Egg.png" ElseIf SelectedOptiFine IsNot Nothing Then @@ -706,6 +761,7 @@ If SelectedForge IsNot Nothing AndAlso Not IsOptiFineSuitForForge(SelectedOptiFine, SelectedForge) Then SelectedForge = Nothing OptiFabric_Loaded() Forge_Loaded() + NeoForge_Loaded() CardOptiFine.IsSwaped = True SelectReload() End Sub @@ -715,6 +771,7 @@ CardOptiFine.IsSwaped = True e.Handled = True Forge_Loaded() + NeoForge_Loaded() SelectReload() End Sub @@ -866,6 +923,81 @@ #End Region +#Region "NeoForge 列表" + + ''' + ''' 获取 NeoForge 的加载异常信息。若正常则返回 Nothing。 + ''' + Private Function LoadNeoForgeGetError() As String + If Not SelectedMinecraftId.StartsWith("1.") Then Return "没有可用版本" + If Not LoadNeoForge.State.IsLoader Then Return "正在获取版本列表……" + Dim Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)) = LoadNeoForge.State + If SelectedMinecraftId <> Loader.Input Then Return "正在获取版本列表……" + If Loader.State = LoadState.Loading Then Return "正在获取版本列表……" + If Loader.State = LoadState.Failed Then + Dim ErrorMessage As String = Loader.Error.Message + If ErrorMessage.Contains("没有可用版本") Then + Return "没有可用版本" + Else + Return "获取版本列表失败:" & ErrorMessage + End If + End If + If Loader.State <> LoadState.Finished Then Return "获取版本列表失败:未知错误,状态为 " & GetStringFromEnum(Loader.State) + For Each Version In Loader.Output + If Version.Category = "universal" OrElse Version.Category = "client" Then Continue For '跳过无法自动安装的版本 + If SelectedFabric IsNot Nothing Then Return "与 Fabric 不兼容" + Return Nothing + Next + Return False + End Function + + '限制展开 + Private Sub CardNeoForge_PreviewSwap(sender As Object, e As RouteEventArgs) Handles CardNeoForge.PreviewSwap + If LoadNeoForgeGetError() IsNot Nothing Then e.Handled = True + End Sub + + ''' + ''' 尝试重新可视化 NeoForge 版本列表。 + ''' + Private Sub NeoForge_Loaded() Handles LoadForge.StateChanged + Try + If Not LoadNeoForge.State.IsLoader Then Exit Sub + Dim Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)) = LoadNeoForge.State + If SelectedMinecraftId <> Loader.Input Then Exit Sub + If Loader.State <> LoadState.Finished Then Exit Sub + '获取要显示的版本 + Dim Versions As New List(Of DlNeoForgeVersionEntry) + Versions.AddRange(Loader.Output) '复制数组,以免 Output 在实例化后变空 + If Not Loader.Output.Any() Then Exit Sub + PanNeoForge.Children.Clear() + + 'Versions = Sort(Versions, Function(a, b) New Version(a.Version) > New Version(b.Version)).ToList + NeoForgeDownloadListItemPreload(PanNeoForge, Versions, AddressOf NeoForge_Selected, False) + For Each Version In Versions + PanNeoForge.Children.Add(NeoForgeDownloadListItem(Version, AddressOf NeoForge_Selected, False)) + Next + Catch ex As Exception + Log(ex, "可视化 NeoForge 安装版本列表出错", LogLevel.Feedback) + End Try + End Sub + + '选择与清除 + Private Sub NeoForge_Selected(sender As MyListItem, e As EventArgs) + SelectedNeoForge = sender.Tag + CardNeoForge.IsSwaped = True + OptiFine_Loaded() + SelectReload() + End Sub + Private Sub NeoForge_Clear(sender As Object, e As MouseButtonEventArgs) Handles BtnNeoForgeClear.MouseLeftButtonUp + SelectedNeoForge = Nothing + CardNeoForge.IsSwaped = True + e.Handled = True + OptiFine_Loaded() + SelectReload() + End Sub + +#End Region + #Region "Fabric 列表" ''' From e731ef69d4adaa344d7136741576aa8eadeaa0b9 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sat, 15 Jun 2024 22:38:39 +0800 Subject: [PATCH 26/87] =?UTF-8?q?ui:=20=E6=98=BE=E7=A4=BA=20NeoForge=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=B1=9E=E6=80=A7=EF=BC=88=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=89=88=20/=20=E7=A8=B3=E5=AE=9A=E7=89=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 17 ++++++++++++++--- .../Pages/PageDownload/ModDownloadLib.vb | 5 +++-- .../PageDownload/PageDownloadInstall.xaml.vb | 4 ++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 9e9ea6a..78907b5 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -748,6 +748,10 @@ ''' 版本分支。若无分支则为 Nothing。 ''' Public Branch As String = Nothing + ''' + ''' 是否是 Beta 版。若未提供则默认为 False。 + ''' + Public IsBeta As Boolean = False Public Structure DlNeoForgeListResult ''' ''' 数据来源名称,如“Official”,“BMCLAPI”。 @@ -857,7 +861,6 @@ ResultJson = GetJson(Result) Dim Versions As New List(Of DlNeoForgeVersionEntry) Dim VersionList As String = ResultJson("versions") - MyMsgBox(VersionList, "VersionList 获取测试") 'Try ' Try ' '基础信息获取 @@ -894,9 +897,17 @@ Dim Versions As New List(Of DlNeoForgeVersionEntry) Try For Each Token As JObject In Json - Dim Name As String = Token("version") + Dim Name As String + Dim IsBeta As Boolean + If Token("version").Contains("-beta") Then + Name = Token("version").ToString() - "-beta" + IsBeta = True + Else + Name = Token("version") + IsBeta = False + End If Dim Inherit As String = Token("mcversion") - Dim Entry = New DlNeoForgeVersionEntry With {.Version = Name, .Inherit = Inherit} + Dim Entry = New DlNeoForgeVersionEntry With {.Version = Name, .Inherit = Inherit, .IsBeta = IsBeta} Versions.Add(Entry) Next 'For Each Token As JObject In Json diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 6f6a331..97a6344 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2258,8 +2258,9 @@ 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, - .Info = If(Entry.ReleaseTime = "", + .Title = If(Entry.IsBeta, Entry.Version & "-beta", 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), ""), "发布于 " & Entry.ReleaseTime & If(ModeDebug, ",种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), "")), .Logo = PathImage & "Blocks/Anvil.png" diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index f703ef4..e93e778 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -787,6 +787,7 @@ If LoadLiteLoader Is Nothing OrElse LoadLiteLoader.State.LoadingState = MyLoading.MyLoadingState.Run Then Return "正在获取版本列表……" If LoadLiteLoader.State.LoadingState = MyLoading.MyLoadingState.Error Then Return "获取版本列表失败:" & CType(LoadLiteLoader.State, Object).Error.Message For Each Version As DlLiteLoaderListEntry In DlLiteLoaderListLoader.Output.Value + If SelectedNeoForge IsNot Nothing Then Return "与 NeoForge 不兼容" If Version.Inherit = SelectedMinecraftId Then Return Nothing Next Return "没有可用版本" @@ -857,6 +858,7 @@ Dim NotSuitForOptiFine As Boolean = False For Each Version In Loader.Output If Version.Category = "universal" OrElse Version.Category = "client" Then Continue For '跳过无法自动安装的版本 + If SelectedNeoForge IsNot Nothing Then Return "与 NeoForge 不兼容" If SelectedFabric IsNot Nothing Then Return "与 Fabric 不兼容" If SelectedOptiFine IsNot Nothing AndAlso VersionSortInteger(SelectedMinecraftId, "1.13") >= 0 AndAlso VersionSortInteger("1.14.3", SelectedMinecraftId) >= 0 Then @@ -945,6 +947,7 @@ If Loader.State <> LoadState.Finished Then Return "获取版本列表失败:未知错误,状态为 " & GetStringFromEnum(Loader.State) For Each Version In Loader.Output If Version.Category = "universal" OrElse Version.Category = "client" Then Continue For '跳过无法自动安装的版本 + If SelectedForge IsNot Nothing Then Return "与 Forge 不兼容" If SelectedFabric IsNot Nothing Then Return "与 Fabric 不兼容" Return Nothing Next @@ -1008,6 +1011,7 @@ If LoadFabric.State.LoadingState = MyLoading.MyLoadingState.Error Then Return "获取版本列表失败:" & CType(LoadFabric.State, Object).Error.Message For Each Version As JObject In DlFabricListLoader.Output.Value("game") If Version("version").ToString = SelectedMinecraftId.Replace("∞", "infinite").Replace("Combat Test 7c", "1.16_combat-3") Then + If SelectedNeoForge IsNot Nothing Then Return "与 NeoForge 不兼容" If SelectedForge IsNot Nothing Then Return "与 Forge 不兼容" 'If SelectedOptiFine IsNot Nothing Then Return "与 OptiFine 不兼容" Return Nothing From 8d9dc4712bc3f54a089d99e221348ea7dbe21555 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sat, 15 Jun 2024 23:12:42 +0800 Subject: [PATCH 27/87] =?UTF-8?q?fix:=20NeoForge=20=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8E=92=E5=BA=8F=EF=BC=8C=E4=BD=86=E6=98=AF?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 14 ++++++++++---- .../Pages/PageDownload/ModDownloadLib.vb | 3 +-- .../Pages/PageDownload/PageDownloadInstall.xaml.vb | 4 +++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 78907b5..b6db08c 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -752,6 +752,10 @@ ''' 是否是 Beta 版。若未提供则默认为 False。 ''' Public IsBeta As Boolean = False + ''' + ''' 标准的版本号 + ''' + Public StdVersion As String Public Structure DlNeoForgeListResult ''' ''' 数据来源名称,如“Official”,“BMCLAPI”。 @@ -897,17 +901,19 @@ Dim Versions As New List(Of DlNeoForgeVersionEntry) Try For Each Token As JObject In Json - Dim Name As String + Dim Name As String '存储 rawVersion,貌似变化更加频繁 + Dim StdVersion As String '存储 version,相对规则 Dim IsBeta As Boolean If Token("version").Contains("-beta") Then - Name = Token("version").ToString() - "-beta" + StdVersion = Token("version").ToString() - "-beta" IsBeta = True Else - Name = Token("version") + StdVersion = Token("version").ToString() IsBeta = False End If + Name = Token("rawVersion") Dim Inherit As String = Token("mcversion") - Dim Entry = New DlNeoForgeVersionEntry With {.Version = Name, .Inherit = Inherit, .IsBeta = IsBeta} + Dim Entry = New DlNeoForgeVersionEntry With {.Version = Name, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} Versions.Add(Entry) Next 'For Each Token As JObject In Json diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 97a6344..9a58b32 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2241,11 +2241,10 @@ Retry: '获取最新版本 Dim FreshVersion As DlNeoForgeVersionEntry = Nothing If Entrys.Any Then - FreshVersion = Entrys(0) + FreshVersion = Entrys.Last() Else Log("[System] 未找到可用的 NeoForge 版本", LogLevel.Debug) End If - Dim RecommendedVersion As DlNeoForgeVersionEntry = Nothing '显示各个版本 If FreshVersion IsNot Nothing Then Dim Fresh = NeoForgeDownloadListItem(FreshVersion, OnClick, IsSaveOnly) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index e93e778..8d3808d 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -974,9 +974,11 @@ If Not Loader.Output.Any() Then Exit Sub PanNeoForge.Children.Clear() + Dim VersionsArray As Array = Versions.ToArray() + VersionsArray.Reverse(VersionsArray) 'Versions = Sort(Versions, Function(a, b) New Version(a.Version) > New Version(b.Version)).ToList NeoForgeDownloadListItemPreload(PanNeoForge, Versions, AddressOf NeoForge_Selected, False) - For Each Version In Versions + For Each Version In VersionsArray PanNeoForge.Children.Add(NeoForgeDownloadListItem(Version, AddressOf NeoForge_Selected, False)) Next Catch ex As Exception From 655364b06a789308be699b0d3047b8f2bd961633 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sat, 15 Jun 2024 23:29:53 +0800 Subject: [PATCH 28/87] =?UTF-8?q?fix:=20=E4=B8=80=E5=A4=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=88=A4=E6=96=AD=E9=94=99=E8=AF=AF=EF=BC=8C=E4=BD=86?= =?UTF-8?q?=E6=9C=AA=E8=A7=A3=E5=86=B3=E7=89=88=E6=9C=AC=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb | 2 +- Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index b6db08c..d2d6810 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -904,7 +904,7 @@ Dim Name As String '存储 rawVersion,貌似变化更加频繁 Dim StdVersion As String '存储 version,相对规则 Dim IsBeta As Boolean - If Token("version").Contains("-beta") Then + If Token("rawVersion").Contains("-beta") Then StdVersion = Token("version").ToString() - "-beta" IsBeta = True Else diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 9a58b32..793a512 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2258,7 +2258,7 @@ Retry: '建立控件 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, - .Info = If(Entry.IsBeta, "稳定版", "测试版") & + .Info = If(Entry.IsBeta, "测试版", "稳定版") & If(Entry.ReleaseTime = "", If(ModeDebug, "种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), ""), "发布于 " & Entry.ReleaseTime & If(ModeDebug, ",种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), "")), From 65d21d4f2155f76375eeb79f1c87559fe0318098 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sat, 15 Jun 2024 23:57:29 +0800 Subject: [PATCH 29/87] =?UTF-8?q?Installer=20=E4=B8=8B=E8=BD=BD=E5=92=8C?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 65 +------------------ .../Pages/PageDownload/ModDownloadLib.vb | 4 +- 2 files changed, 3 insertions(+), 66 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index d2d6810..ad69aa1 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 "forge-" & Inherit & "-" & FileVersion & "-" & Category & "." & FileSuffix + Return "neoforge-" & "-" & StdVersion & "-" & "installer" & "." & "jar" End Get End Property ''' @@ -865,30 +865,6 @@ ResultJson = GetJson(Result) Dim Versions As New List(Of DlNeoForgeVersionEntry) Dim VersionList As String = ResultJson("versions") - 'Try - ' Try - ' '基础信息获取 - ' Dim Name As String = RegexSeek(VersionCode, "(?<=[^(0-9)]+)[0-9\.]+") - ' Dim IsRecommended As Boolean = VersionCode.Contains("fa promo-recommended") - ' Dim Inherit As String = Loader.Input - ' '分支获取 - ' Dim Branch As String = RegexSeek(VersionCode, $"(?<=-{Name}-)[^-""]+(?=-[a-z]+.[a-z]{{3}})") - ' If String.IsNullOrWhiteSpace(Branch) Then Branch = Nothing - ' '发布时间获取 - ' Dim ReleaseTimeOriginal = RegexSeek(VersionCode, "(?<=""download-time"" title="")[^""]+") - ' Dim ReleaseTimeSplit = ReleaseTimeOriginal.Split(" -:".ToCharArray) '原格式:"2021-02-15 03:24:02" - ' Dim ReleaseDate As New Date(ReleaseTimeSplit(0), ReleaseTimeSplit(1), ReleaseTimeSplit(2), '年月日 - ' ReleaseTimeSplit(3), ReleaseTimeSplit(4), ReleaseTimeSplit(5), '时分秒 - ' 0, DateTimeKind.Utc) '以 UTC 时间作为标准 - ' Dim ReleaseTime As String = ReleaseDate.ToLocalTime.ToString("yyyy'/'MM'/'dd HH':'mm") '时区与格式转换 - ' '添加进列表 - ' Versions.Add(New DlNeoForgeVersionEntry With {.Category = Category, .Version = Name, .Hash = MD5.Trim(vbCr, vbLf), .Inherit = Inherit, .ReleaseTime = ReleaseTime, .Branch = Branch}) - ' Catch ex As Exception - ' Throw New Exception("版本信息提取失败(" & VersionCode & ")", ex) - ' End Try - 'Catch ex As Exception - ' Throw New Exception("版本列表解析失败(" & Result & ")", ex) - 'End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") Loader.Output = Versions End Sub @@ -916,45 +892,6 @@ Dim Entry = New DlNeoForgeVersionEntry With {.Version = Name, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} Versions.Add(Entry) Next - 'For Each Token As JObject In Json - ' '分类与 Hash 获取 - ' Dim Hash As String = Nothing, Category As String = "unknown", Proi As Integer = -1 - ' For Each File As JObject In Token("files") - ' Select Case File("category").ToString - ' Case "installer" - ' If File("format").ToString = "jar" Then - ' '类型为 installer.jar,支持范围 ~753 (~ 1.6.1 部分), 738~684 (1.5.2 全部) - ' Hash = File("hash") - ' Category = "installer" - ' Proi = 2 - ' End If - ' Case "universal" - ' If Proi <= 1 AndAlso File("format").ToString = "zip" Then - ' '类型为 universal.zip,支持范围 751~449 (1.6.1 部分), 682~183 (1.5.1 ~ 1.3.2 部分) - ' Hash = File("hash") - ' Category = "universal" - ' Proi = 1 - ' End If - ' Case "client" - ' If Proi <= 0 AndAlso File("format").ToString = "zip" Then - ' '类型为 client.zip,支持范围 182~ (1.3.2 部分 ~) - ' Hash = File("hash") - ' Category = "client" - ' Proi = 0 - ' End If - ' End Select - ' Next - ' '获取 Entry - ' Dim Inherit As String = Loader.Input - ' Dim Branch As String = Token("branch") - ' Dim Name As String = Token("version") - ' '基础信息获取 - ' Dim Entry = New DlNeoForgeVersionEntry With {.Hash = Hash, .Category = Category, .Version = Name, .Branch = Branch, .Inherit = Inherit} - ' Dim TimeSplit = Token("modified").ToString.Split("-"c, "T"c, ":"c, "."c, " "c, "/"c) - ' Entry.ReleaseTime = Token("modified").ToObject(Of Date).ToLocalTime.ToString("yyyy'/'MM'/'dd HH':'mm") - ' '添加项 - ' Versions.Add(Entry) - 'Next Catch ex As Exception Throw New Exception("版本列表解析失败(" & Json.ToString & ")", ex) End Try diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 793a512..ac13c41 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1783,8 +1783,8 @@ Retry: Sub(Task As LoaderTask(Of DlForgeVersionEntry, List(Of NetFile))) Dim Files As New List(Of NetFile) Files.Add(New NetFile({ - "https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName, - "https://files.minecraftforge.net/maven/net/minecraftforge/forge/" & DownloadInfo.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 }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) Task.Output = Files End Sub) With {.ProgressWeight = 0.1, .Show = False}) From 31e391f87296f30798d81bbfd796f24486006deb Mon Sep 17 00:00:00 2001 From: JingHai-Lingyun Date: Sun, 16 Jun 2024 00:34:42 +0800 Subject: [PATCH 30/87] optimize: version name and icon Now, NeoForge client's info and name looks like the Forge client's behavior --- .../Pages/PageDownload/ModDownloadLib.vb | 2 +- .../Pages/PageDownload/PageDownloadInstall.xaml | 2 +- .../Pages/PageDownload/PageDownloadInstall.xaml.vb | 6 +++--- Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj | 8 +------- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index ac13c41..c053888 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2262,7 +2262,7 @@ Retry: If(Entry.ReleaseTime = "", If(ModeDebug, "种类:" & 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 & "Blocks/NeoForge.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..1cf0a2d 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 8d3808d..dee744c 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.Version.Replace("neoforge-", "").Replace("forge-", "").Replace("1.20.1-", "") 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.Version.Replace("neoforge-", "").Replace("forge-", "").Replace("1.20.1-", "") End If If SelectedLiteLoader IsNot Nothing Then Info += ", LiteLoader" @@ -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/Blocks/NeoForge.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/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 72db688..7f353ad 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 - - - @@ -469,7 +466,6 @@ FormMain.xaml Code - MSBuild:Compile Designer @@ -754,6 +750,7 @@ + @@ -919,9 +916,6 @@ - - - From d8fe5997399cdad68bfab9bdfb6b54296701a29f Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 07:00:37 +0800 Subject: [PATCH 31/87] =?UTF-8?q?fix:=20=E6=89=80=E6=9C=89=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E9=83=BD=E6=98=BE=E7=A4=BA=E4=B8=BA=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=89=88=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 32/87] =?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 33/87] =?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 27825ed1079624eb8f6e1c1e5ba09b6b332e2fc4 Mon Sep 17 00:00:00 2001 From: JingHai-Lingyun Date: Sun, 16 Jun 2024 10:32:57 +0800 Subject: [PATCH 34/87] Update PageDownloadInstall.xaml.vb Solve a conflict --- .../Pages/PageDownload/PageDownloadInstall.xaml.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index dee744c..5bfc326 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.Replace("neoforge-", "").Replace("forge-", "").Replace("1.20.1-", "") + 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.Replace("neoforge-", "").Replace("forge-", "").Replace("1.20.1-", "") + Info += ", NeoForge " & SelectedNeoForge.ohao & If(SelectedNeoForge.IsBeta, "-beta", "") End If If SelectedLiteLoader IsNot Nothing Then Info += ", LiteLoader" From d305dd3e430207359dd1e34db6df70e0c6e915f8 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 13:19:17 +0800 Subject: [PATCH 35/87] =?UTF-8?q?fix:=20=E7=89=88=E6=9C=AC=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E4=B8=8D=E8=83=BD=E6=AD=A3=E5=B8=B8=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=20NeoForge=20=E7=89=88=E6=9C=AC=20fix:=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=AE=89=E8=A3=85=E9=A1=B5=20NeoForge=20?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=A4=9A=E4=BD=99=E7=9A=84=E6=8F=8F=E8=BF=B0?= =?UTF-8?q?=20chores:=20NeoForge=20Icon=20=E6=98=BE=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E4=BD=86=E7=9B=AE=E5=89=8D=E6=9C=89=E7=82=B9=E5=B0=8F=E9=97=AE?= =?UTF-8?q?=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 @@ + + From 66182f2cd0e1f373d7eb519298504703ded03a45 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 14:41:16 +0800 Subject: [PATCH 36/87] =?UTF-8?q?fix:=20Icon=20=E6=98=BE=E7=A4=BA=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E5=AF=BC=E8=87=B4=E7=9A=84=E5=B4=A9=E6=BA=83=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20fix:=201.20.1=20NeoForge=20=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E6=8B=BC=E6=8E=A5=E9=94=99=E8=AF=AF=20fix:?= =?UTF-8?q?=20=E8=87=AA=E5=8A=A8=E5=AE=89=E8=A3=85=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E9=80=89=E6=8B=A9=20NeoForge=20=E5=90=8E=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E4=BA=86=20rawVersion=20=E4=BD=9C=E4=B8=BA=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Images/Icons/NeoForged.png | Bin 4395 -> 1412 bytes .../Images/Icons/NeoForgedLarge.png | Bin 1123 -> 0 bytes .../Modules/Minecraft/ModDownload.vb | 22 ++++++-------- .../Modules/Minecraft/ModMinecraft.vb | 8 ++--- .../Pages/PageDownload/ModDownloadLib.vb | 28 ++++++++++++++---- .../PageDownload/PageDownloadInstall.xaml | 2 +- .../PageDownload/PageDownloadInstall.xaml.vb | 4 +-- .../Plain Craft Launcher 2.vbproj | 5 ++-- 8 files changed, 41 insertions(+), 28 deletions(-) delete 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 index a9f8076f3d25782eb7fc55f0ef491ecba1c13eed..7d46d392e44d7b7007041bb213ddc4540925b33f 100644 GIT binary patch delta 1393 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 diff --git a/Plain Craft Launcher 2/Images/Icons/NeoForgedLarge.png b/Plain Craft Launcher 2/Images/Icons/NeoForgedLarge.png deleted file mode 100644 index 55848a69dfab001562da00828f41574339f6910f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 69e2308..9b4a693 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -771,7 +771,7 @@ Public Value As JObject End Structure ''' - ''' 是否为新版 Forge。(即为 Minecraft 1.13+) + ''' 是否为新版 NeoForge。(即为 Minecraft 1.13+) ''' Public ReadOnly Property IsNewType As Boolean Get @@ -804,21 +804,17 @@ ''' Public ReadOnly Property FileName As String Get - Return "neoforge-" & StdVersion & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" + If StdVersion.StartsWith("47.") Then 'NeoForge 1.20.1 的版本命名有些特殊... + Return "forge-" & Inherit & "-" & StdVersion & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" + Else + Return "neoforge-" & StdVersion & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" + End If End Get End Property ''' ''' 文件扩展名。 ''' - Public ReadOnly Property FileSuffix As String - Get - If Category = "installer" Then - Return "jar" - Else - Return "jar" - End If - End Get - End Property + Public FileSuffix As String = "jar" End Class ''' ''' NeoForge 版本列表,主加载器。 @@ -882,10 +878,10 @@ Dim IsBeta As Boolean Dim rawVersion As String = Token("rawVersion") If rawVersion.Contains("-beta") Then - StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("-beta", "") + StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") IsBeta = True Else - StdVersion = Token("version").ToString().Replace("neoforge-", "") + StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("1.20.1-", "") IsBeta = False End If Name = rawVersion diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index efb1dfb..f1cdb96 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -736,12 +736,12 @@ Recheck: 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 & """") '这里的实现比较抽象,正则我写不会 + ElseIf RealJson.Contains("neoforge") Then '1.20.1 NeoForge Json 内信息不同,为了方便直接截断 orgeVersion;这里的实现比较抽象,正则我写不会 + State = McVersionState.NeoForge '1.20.1 Json 标识:"--fml.forgeVersion" 1.20.1 以上 Json 标识:"--fml.neoForgeVersion" + Dim JsonStr1() As String = RealJson.Replace(" ", "").Split("orgeVersion""," & 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 = RegexSeek(RealJson, "(?<=orgeVersion"",)[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 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index c0e083c..0ccffe1 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1782,10 +1782,17 @@ Retry: 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, - "https://maven.neoforged.net/releases/net/neoforged/neoforge/" & DownloadInfo.StdVersion & "/" & DownloadInfo.FileName + If DownloadInfo.StdVersion.StartsWith("47.") Then '1.20.1 NeoForge 下载地址不同 + Files.Add(New NetFile({ + "https://bmclapi2.bangbang93.com/maven/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.StdVersion & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, + "https://maven.neoforged.net/releases/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.StdVersion & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) + Else + Files.Add(New NetFile({ + "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 + }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) + End If Task.Output = Files End Sub) With {.ProgressWeight = 0.1, .Show = False}) '下载 @@ -2005,11 +2012,20 @@ Retry: If IsCustomFolder Then Throw New Exception("如果没有指定原版下载器,则不能指定 MC 安装文件夹") ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, Inherit) End If - '添加主文件 - Dim Files As New List(Of NetFile) From {New NetFile({ + Dim Files + If DownloadInfo.StdVersion.StartsWith("47.") Then '1.20.1 NeoForge 下载地址不同 + Dim FilesLegacy As New List(Of NetFile) From {New NetFile({ + "https://bmclapi2.bangbang93.com/maven/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.StdVersion & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, + "https://maven.neoforged.net/releases/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.StdVersion & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName + }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))} + Files = FilesLegacy + Else + Dim FilesLatest As New List(Of NetFile) From {New NetFile({ "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))} + Files = FilesLatest + End If Task.Output = Files End Sub) With {.ProgressWeight = 0.5, .Show = False}) Loaders.Add(New LoaderDownload("下载 Mod 加载器主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) @@ -2196,7 +2212,7 @@ Retry: If(Entry.ReleaseTime = "", 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/NeoForge.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 1cf0a2d..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 326a03c..6fd4e6e 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -384,7 +384,7 @@ Else BtnNeoForgeClear.Visibility = Visibility.Visible ImgNeoForge.Visibility = Visibility.Visible - LabNeoForge.Text = SelectedNeoForge.Version + LabNeoForge.Text = SelectedNeoForge.StdVersion & If(SelectedNeoForge.IsBeta, "-beta", "") LabNeoForge.Foreground = ColorGray1 End If 'Fabric @@ -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/NeoForge.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/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 41f804e..663d1ee 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -757,7 +757,6 @@ - @@ -924,6 +923,8 @@ - + + + \ No newline at end of file From f3079dd619733eb0b3b69b3c38fc09674bb43620 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 15:29:30 +0800 Subject: [PATCH 37/87] =?UTF-8?q?feat:=20NeoForge=20=E6=95=B4=E5=90=88?= =?UTF-8?q?=E5=8C=85=E5=AE=89=E8=A3=85=20fix:=20=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=83=85=E5=86=B5=E4=B8=8B=E5=AE=89=E8=A3=85=20NeoForge=20?= =?UTF-8?q?=E4=BC=9A=E5=A4=B1=E8=B4=A5=EF=BC=88DownloadInfo=20=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 23 +++++++++++++++++++ .../Pages/PageDownload/ModDownloadLib.vb | 20 ++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index bcd878c..b11f875 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -183,6 +183,7 @@ Retry: '获取 Mod API 版本信息 Dim ForgeVersion As String = Nothing + Dim NeoForgeVersion As String = Nothing Dim FabricVersion As String = Nothing For Each Entry In If(Json("minecraft")("modLoaders"), {}) Dim Id As String = If(Entry("id"), "").ToString.ToLower @@ -199,6 +200,19 @@ Retry: Catch ex As Exception Log(ex, "读取整合包 Forge 版本失败:" & Id) End Try + ElseIf Id.StartsWithF("neoforge-") Then + 'NeoForge 指定 + If Id.Contains("recommended") Then + Log("[ModPack] 该整合包版本过老,已不支持进行安装!", LogLevel.Hint) + Exit Sub + End If + Try + Log("[ModPack] 整合包 NeoForge 版本:" & Id) + NeoForgeVersion = Id.Split("-")(1) + Exit For + Catch ex As Exception + Log(ex, "读取整合包 Forge 版本失败:" & Id) + End Try ElseIf Id.StartsWithF("fabric-") Then 'Fabric 指定 Try @@ -301,6 +315,7 @@ Retry: .TargetVersionFolder = $"{PathMcFolder}versions\{VersionName}\", .MinecraftName = Json("minecraft")("version").ToString, .ForgeVersion = ForgeVersion, + .NeoForgeVersion = NeoForgeVersion, .FabricVersion = FabricVersion } Dim MergeLoaders As List(Of LoaderBase) = McInstallLoader(Request, True) @@ -368,6 +383,7 @@ Retry: '获取 Mod API 版本信息 Dim MinecraftVersion As String = Nothing Dim ForgeVersion As String = Nothing + Dim NeoForgeVersion As String = Nothing Dim FabricVersion As String = Nothing For Each Entry As JProperty In If(Json("dependencies"), {}) Select Case Entry.Name.ToLower @@ -376,6 +392,9 @@ Retry: Case "forge" 'eg. 14.23.5.2859 / 1.19-41.1.0 ForgeVersion = Entry.Value.ToString Log("[ModPack] 整合包 Forge 版本:" & ForgeVersion) + Case "neoforge" 'eg. 20.6.98-beta + NeoForgeVersion = Entry.Value.ToString + Log("[ModPack] 整合包 NeoForge 版本:" & NeoForgeVersion) Case "fabric-loader" 'eg. 0.14.14 FabricVersion = Entry.Value.ToString Log("[ModPack] 整合包 Fabric 版本:" & FabricVersion) @@ -447,6 +466,7 @@ Retry: .TargetVersionFolder = $"{PathMcFolder}versions\{VersionName}\", .MinecraftName = MinecraftVersion, .ForgeVersion = ForgeVersion, + .NeoForgeVersion = NeoForgeVersion, .FabricVersion = FabricVersion } Dim MergeLoaders As List(Of LoaderBase) = McInstallLoader(Request, True) @@ -676,6 +696,8 @@ Retry: Request.MinecraftName = Component("version") Case "net.minecraftforge" Request.ForgeVersion = Component("version") + Case "net.neoforged" + Request.NeoForgeVersion = Component("version") Case "net.fabricmc.fabric-loader" Request.FabricVersion = Component("version") Case "org.quiltmc.quilt-loader" 'eg. 1.0.0 @@ -772,6 +794,7 @@ Retry: .MinecraftName = Addons("game"), .OptiFineVersion = If(Addons.ContainsKey("optifine"), Addons("optifine"), Nothing), .ForgeVersion = If(Addons.ContainsKey("forge"), Addons("forge"), Nothing), + .NeoForgeVersion = If(Addons.ContainsKey("neoforge"), Addons("neoforge"), Nothing), .FabricVersion = If(Addons.ContainsKey("fabric"), Addons("fabric"), Nothing) } Dim MergeLoaders As List(Of LoaderBase) = McInstallLoader(Request, True) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 0ccffe1..625b4da 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1973,11 +1973,27 @@ Retry: ''' ''' 获取下载某个 NeoForge 版本的加载器列表。 ''' - Private Function McDownloadNeoForgeLoader(Version As String, Inherit As String, Optional DownloadInfo As DlNeoForgeVersionEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) + Private Function McDownloadNeoForgeLoader(Version As String, Inherit As String, Optional DownloadRawInfo As DlNeoForgeVersionEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) '参数初始化 + Dim DownloadInfo As New DlNeoForgeVersionEntry McFolder = If(McFolder, PathMcFolder) - Version = DownloadInfo.StdVersion + If DownloadRawInfo Is Nothing Then '兜底,有的时候 DownloadInfo 可能是空的 + If Version.Contains("-beta") Then + DownloadInfo.Version = Version + Version = Version.Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") + DownloadInfo.StdVersion = Version + DownloadInfo.IsBeta = True + Else + DownloadInfo.Version = Version + Version = Version.Replace("neoforge-", "").Replace("1.20.1-", "") + DownloadInfo.StdVersion = Version + DownloadInfo.IsBeta = False + End If + Else + DownloadInfo = DownloadRawInfo + Version = DownloadInfo.StdVersion + End If Dim IsCustomFolder As Boolean = McFolder <> PathMcFolder Dim Id As String = DownloadInfo.Version Dim InstallerAddress As String = PathTemp & "Cache\Code\NeoForgeInstall-" & Version & "_" & RandomInteger(0, 100000) From 9c64dc02099074ab72e43df75157d038fffbffaf Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 15:37:00 +0800 Subject: [PATCH 38/87] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D=20Ne?= =?UTF-8?q?oForge=20=E6=89=8B=E5=8A=A8=E5=AE=89=E8=A3=85=E5=8C=85=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=8A=A0=E8=BD=BD=E4=B8=8D=E5=87=BA=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E4=BD=86=E6=98=AF=E5=A4=B1=E8=B4=A5=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 9b4a693..6f40b26 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -820,24 +820,24 @@ ''' 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))) + Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) 'BMCLAPI 不会返回完整的 NeoForge 版本列表,始终从官方源获取 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) Select Case Setup.Get("ToolDownloadVersion") Case 0 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 30), + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 30), New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 60) }, Loader.IsForceRestarting) Case 1 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 5), - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 35) + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 35) }, Loader.IsForceRestarting) Case Else DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 60), - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 60) + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 60) }, Loader.IsForceRestarting) End Select End Sub From 9dab0b8b6bee01d8393ad52df8958c30ec7b54c8 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 15:37:54 +0800 Subject: [PATCH 39/87] =?UTF-8?q?=E6=94=B9=E4=B8=80=E8=A1=8C=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 6f40b26..cbbc6a4 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -820,7 +820,7 @@ ''' NeoForge 版本列表,主加载器。 ''' Public DlNeoForgeListLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeList Main", AddressOf DlNeoForgeVersionMain) - Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) 'BMCLAPI 不会返回完整的 NeoForge 版本列表,始终从官方源获取 + Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) 'BMCLAPI 不会返回完整的 NeoForge 版本列表,而貌似也没有办法获取 NeoForge 支持的所有 Minecraft 版本,始终从官方源获取 Dim DlNeoForgeVersionOfficialLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Official", AddressOf DlNeoForgeVersionOfficialMain) 'Dim DlNeoForgeVersionBmclapiLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Bmclapi", AddressOf DlNeoForgeVersionBmclapiMain) Select Case Setup.Get("ToolDownloadVersion") From 136803f652754e08d7ac4db7e773fc55cce6ca01 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 16 Jun 2024 16:19:28 +0800 Subject: [PATCH 40/87] =?UTF-8?q?fix:=20=E5=9B=9E=E6=BB=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=8C=E4=BF=AE=E5=A4=8D=E7=89=88=E6=9C=AC=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index cbbc6a4..0b39091 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -820,24 +820,24 @@ ''' NeoForge 版本列表,主加载器。 ''' Public DlNeoForgeListLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeList Main", AddressOf DlNeoForgeVersionMain) - Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) 'BMCLAPI 不会返回完整的 NeoForge 版本列表,而貌似也没有办法获取 NeoForge 支持的所有 Minecraft 版本,始终从官方源获取 + Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) 'BMCLAPI 不会返回完整的 NeoForge 版本列表,而貌似也没有办法获取 NeoForge 支持的所有 Minecraft 版本 Dim DlNeoForgeVersionOfficialLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Official", AddressOf DlNeoForgeVersionOfficialMain) - 'Dim DlNeoForgeVersionBmclapiLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Bmclapi", AddressOf DlNeoForgeVersionBmclapiMain) + Dim DlNeoForgeVersionBmclapiLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Bmclapi", AddressOf DlNeoForgeVersionBmclapiMain) Select Case Setup.Get("ToolDownloadVersion") Case 0 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 30), + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 30), New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 60) }, Loader.IsForceRestarting) Case 1 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 5), - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 35) + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 35) }, Loader.IsForceRestarting) Case Else DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 60), - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 60) + New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 60) }, Loader.IsForceRestarting) End Select End Sub From 6e7cf7b4813a96a804c8359b3e2a32176ac5d003 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 18 Jun 2024 00:18:36 +0800 Subject: [PATCH 41/87] =?UTF-8?q?:sparkles:=20=E4=B8=BA=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E6=B7=BB=E5=8A=A0=E5=90=AF=E5=8A=A8=E5=89=8D?= =?UTF-8?q?=E5=86=85=E5=AD=98=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModLaunch.vb | 14 ++++++++++---- .../Pages/PageSetup/ModSetup.vb | 1 + .../Pages/PageVersion/PageVersionSetup.xaml | 16 ++++++++++++++++ .../Pages/PageVersion/PageVersionSetup.xaml.vb | 7 +++++++ 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index 48a8228..69a4688 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -113,10 +113,16 @@ Public Module ModLaunch New LoaderTask(Of Process, Integer)("等待游戏窗口出现", AddressOf McLaunchWait) With {.ProgressWeight = 1}, New LoaderTask(Of Integer, Integer)("结束处理", AddressOf McLaunchEnd) With {.ProgressWeight = 1} } - If Setup.Get("LaunchArgumentRam") Then - CType(Loaders(2), LoaderCombo(Of String)).Block = False - Loaders.Insert(3, New LoaderTask(Of Integer, Integer)("内存优化", AddressOf McLaunchMemoryOptimize) With {.ProgressWeight = 30}) - End If + Select Case Setup.Get("VersionRamOptimize", Version:=McVersionCurrent) + Case 0 '全局 + If Not Setup.Get("LaunchArgumentRam") Then GoTo JumpRamOptimize + Case 2 '关闭 + GoTo JumpRamOptimize + End Select + CType(Loaders(2), LoaderCombo(Of String)).Block = False + Loaders.Insert(3, New LoaderTask(Of Integer, Integer)("内存优化", AddressOf McLaunchMemoryOptimize) With {.ProgressWeight = 30}) +JumpRamOptimize: + Dim LaunchLoader As New LoaderCombo(Of Object)("Minecraft 启动", Loaders) With {.Show = False} If McLoginLoader.State = LoadState.Finished Then McLoginLoader.State = LoadState.Waiting '要求重启登录主加载器,它会自行决定是否启动副加载器 '等待加载器执行并更新 UI diff --git a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb index faef9cc..31025f3 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb @@ -163,6 +163,7 @@ {"VersionAdvanceRunWait", New SetupEntry(True, Source:=SetupSource.Version)}, {"VersionRamType", New SetupEntry(2, Source:=SetupSource.Version)}, {"VersionRamCustom", New SetupEntry(15, Source:=SetupSource.Version)}, + {"VersionRamOptimize", New SetupEntry(0, Source:=SetupSource.Version)}, {"VersionArgumentTitle", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionArgumentInfo", New SetupEntry("", Source:=SetupSource.Version)}, {"VersionArgumentIndie", New SetupEntry(-1, Source:=SetupSource.Version)}, diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml index e523d04..f5eb83f 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml @@ -106,6 +106,22 @@ + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb index ad72125..fce8945 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb @@ -51,6 +51,7 @@ '游戏内存 CType(FindName("RadioRamType" & Setup.Load("VersionRamType", Version:=PageVersionLeft.Version)), MyRadioBox).Checked = True SliderRamCustom.Value = Setup.Get("VersionRamCustom", Version:=PageVersionLeft.Version) + ComboRamOptimize.SelectedIndex = Setup.Get("VersionRamOptimize", Version:=PageVersionLeft.Version) '服务器 TextServerEnter.Text = Setup.Get("VersionServerEnter", Version:=PageVersionLeft.Version) @@ -95,6 +96,7 @@ Setup.Set("VersionArgumentIndie", 0, Version:=PageVersionLeft.Version) Setup.Reset("VersionRamType", Version:=PageVersionLeft.Version) Setup.Reset("VersionRamCustom", Version:=PageVersionLeft.Version) + Setup.Reset("VersionRamOptimize", Version:=PageVersionLeft.Version) Setup.Reset("VersionAdvanceJvm", Version:=PageVersionLeft.Version) Setup.Reset("VersionAdvanceGame", Version:=PageVersionLeft.Version) Setup.Reset("VersionAdvanceAssets", Version:=PageVersionLeft.Version) @@ -362,6 +364,11 @@ PreFin: Return RamGive End Function + Private Sub ComboRamOptimize_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboRamOptimize.SelectionChanged + If AniControlEnabled <> 0 Then Exit Sub + Setup.Set("VersionRamOptimize", ComboRamOptimize.SelectedIndex, Version:=PageVersionLeft.Version) + End Sub + #End Region #Region "服务器" From 61c0927baf56cfbecfc0ff35a136a93ca8c0365e Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 18 Jun 2024 13:07:29 +0800 Subject: [PATCH 42/87] =?UTF-8?q?:art:=20=E8=AE=A9=20`ComboChange`=20?= =?UTF-8?q?=E6=8E=A5=E7=AE=A1=E9=80=89=E6=8B=A9=E4=BA=8B=E4=BB=B6=20https:?= =?UTF-8?q?//github.com/Hex-Dragon/PCL2/pull/4058#discussion=5Fr1643295425?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageVersion/PageVersionSetup.xaml | 2 +- .../Pages/PageVersion/PageVersionSetup.xaml.vb | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml index f5eb83f..72caf3d 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml @@ -116,7 +116,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb index fce8945..8fbb4aa 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb @@ -132,7 +132,7 @@ Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderRamCustom.Change If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value, Version:=PageVersionLeft.Version) End Sub - Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndie.SelectionChanged + Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndie.SelectionChanged, ComboRamOptimize.SelectionChanged If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex, Version:=PageVersionLeft.Version) End Sub Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceRunWait.Change, CheckAdvanceAssetsV2.Change, CheckAdvanceJava.Change @@ -364,11 +364,6 @@ PreFin: Return RamGive End Function - Private Sub ComboRamOptimize_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboRamOptimize.SelectionChanged - If AniControlEnabled <> 0 Then Exit Sub - Setup.Set("VersionRamOptimize", ComboRamOptimize.SelectedIndex, Version:=PageVersionLeft.Version) - End Sub - #End Region #Region "服务器" From dc3804a96053568e98277a24cb3aec62958a765c Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 18 Jun 2024 13:28:19 +0800 Subject: [PATCH 43/87] =?UTF-8?q?:art:=20=E5=B0=86=E5=86=85=E5=AD=98?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=90=88=E5=B9=B6=E5=88=B0=20Select=20Case?= =?UTF-8?q?=20https://github.com/Hex-Dragon/PCL2/pull/4058#discussion=5Fr1?= =?UTF-8?q?643297785?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModLaunch.vb | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index 69a4688..c37bd67 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -113,15 +113,18 @@ Public Module ModLaunch New LoaderTask(Of Process, Integer)("等待游戏窗口出现", AddressOf McLaunchWait) With {.ProgressWeight = 1}, New LoaderTask(Of Integer, Integer)("结束处理", AddressOf McLaunchEnd) With {.ProgressWeight = 1} } + + '内存优化 Select Case Setup.Get("VersionRamOptimize", Version:=McVersionCurrent) Case 0 '全局 - If Not Setup.Get("LaunchArgumentRam") Then GoTo JumpRamOptimize - Case 2 '关闭 - GoTo JumpRamOptimize + If Setup.Get("LaunchArgumentRam") Then + CType(Loaders(2), LoaderCombo(Of String)).Block = False + Loaders.Insert(3, New LoaderTask(Of Integer, Integer)("内存优化", AddressOf McLaunchMemoryOptimize) With {.ProgressWeight = 30}) + End If + Case 1 '开启 + CType(Loaders(2), LoaderCombo(Of String)).Block = False + Loaders.Insert(3, New LoaderTask(Of Integer, Integer)("内存优化", AddressOf McLaunchMemoryOptimize) With {.ProgressWeight = 30}) End Select - CType(Loaders(2), LoaderCombo(Of String)).Block = False - Loaders.Insert(3, New LoaderTask(Of Integer, Integer)("内存优化", AddressOf McLaunchMemoryOptimize) With {.ProgressWeight = 30}) -JumpRamOptimize: Dim LaunchLoader As New LoaderCombo(Of Object)("Minecraft 启动", Loaders) With {.Show = False} If McLoginLoader.State = LoadState.Finished Then McLoginLoader.State = LoadState.Waiting '要求重启登录主加载器,它会自行决定是否启动副加载器 From a32bf0b79ed5822b6fe10a595ceaa77b99e47958 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Tue, 18 Jun 2024 18:13:03 +0800 Subject: [PATCH 44/87] =?UTF-8?q?:sparkles:=20=E5=AE=8C=E6=88=90=20#3997?= =?UTF-8?q?=20=E9=A1=BA=E4=BE=BF=E6=8A=8A=E6=95=99=E5=AD=A6=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B9=9F=E6=94=B9=E4=BA=86=E2=80=A6=E2=80=A6=20Discus?= =?UTF-8?q?sion:=20#4002?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/ModEvent.vb | 1 + Plain Craft Launcher 2/Modules/ModMain.vb | 1 + Plain Craft Launcher 2/Resources/Custom.xaml | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/Plain Craft Launcher 2/Modules/ModEvent.vb b/Plain Craft Launcher 2/Modules/ModEvent.vb index aa09e79..78baafc 100644 --- a/Plain Craft Launcher 2/Modules/ModEvent.vb +++ b/Plain Craft Launcher 2/Modules/ModEvent.vb @@ -43,6 +43,7 @@ End Sub) Case "启动游戏" + If Data(0) = "$mcv" Then Data(0) = McVersionCurrent.Name If McLaunchStart(New McLaunchOptions With {.ServerIp = If(Data.Length >= 2, Data(1), Nothing), .Version = New McVersion(Data(0))}) Then Hint("正在启动 " & Data(0) & "……") diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index e2b797c..d495e3a 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -665,6 +665,7 @@ NextFile: Dim Result = Xaml.Replace("{path}", EscapeXML(Path)) Result = RegexReplaceEach(Result, Function() EscapeXML(PageOtherTest.GetRandomHint()), "\{hint\}") Result = RegexReplaceEach(Result, Function() EscapeXML(PageOtherTest.GetRandomCave()), "\{cave\}") + Result = Result.Replace("{mcv}", "$mcv") '不知道为啥,实例化 {mcv} 有可能会炸掉,只能先把它换掉,再换成版本名 Return Result End Function diff --git a/Plain Craft Launcher 2/Resources/Custom.xaml b/Plain Craft Launcher 2/Resources/Custom.xaml index f35be1d..3b59e97 100644 --- a/Plain Craft Launcher 2/Resources/Custom.xaml +++ b/Plain Craft Launcher 2/Resources/Custom.xaml @@ -80,6 +80,10 @@ Text="在 EventData 后面添加一条竖线(|),竖线后填写服务器 IP,即可在启动该版本的同时自动进入服务器。" /> + + From 82dacd7eeb2676062e46d1e7663dbfaf0acf97f1 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Wed, 19 Jun 2024 13:07:32 +0800 Subject: [PATCH 45/87] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=20`{mcv}`=20?= =?UTF-8?q?=E8=A2=AB=E6=9B=BF=E6=8D=A2=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/ModEvent.vb | 2 +- Plain Craft Launcher 2/Modules/ModMain.vb | 1 - Plain Craft Launcher 2/Resources/Custom.xaml | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/ModEvent.vb b/Plain Craft Launcher 2/Modules/ModEvent.vb index 78baafc..77740d5 100644 --- a/Plain Craft Launcher 2/Modules/ModEvent.vb +++ b/Plain Craft Launcher 2/Modules/ModEvent.vb @@ -43,7 +43,7 @@ End Sub) Case "启动游戏" - If Data(0) = "$mcv" Then Data(0) = McVersionCurrent.Name + If Data(0) = "\current" Then Data(0) = McVersionCurrent.Name If McLaunchStart(New McLaunchOptions With {.ServerIp = If(Data.Length >= 2, Data(1), Nothing), .Version = New McVersion(Data(0))}) Then Hint("正在启动 " & Data(0) & "……") diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index d495e3a..e2b797c 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -665,7 +665,6 @@ NextFile: Dim Result = Xaml.Replace("{path}", EscapeXML(Path)) Result = RegexReplaceEach(Result, Function() EscapeXML(PageOtherTest.GetRandomHint()), "\{hint\}") Result = RegexReplaceEach(Result, Function() EscapeXML(PageOtherTest.GetRandomCave()), "\{cave\}") - Result = Result.Replace("{mcv}", "$mcv") '不知道为啥,实例化 {mcv} 有可能会炸掉,只能先把它换掉,再换成版本名 Return Result End Function diff --git a/Plain Craft Launcher 2/Resources/Custom.xaml b/Plain Craft Launcher 2/Resources/Custom.xaml index 3b59e97..3f103b1 100644 --- a/Plain Craft Launcher 2/Resources/Custom.xaml +++ b/Plain Craft Launcher 2/Resources/Custom.xaml @@ -81,9 +81,9 @@ + Text="使用 {mcver} 可以表示当前被选中的游戏版本,但请注意,这只在 EventData 属性中有效。" /> + Text="启动当前选中版本并进入 Hypixel" EventType="启动游戏" EventData="{mcver}|mc.hypixel.net" ToolTip="服务器 IP:mc.hypixel.net" /> From c62e0e2bd866c32fa74ce6d647903ad56b91a15d Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 20 Jun 2024 14:42:32 +0800 Subject: [PATCH 46/87] =?UTF-8?q?:bento:=20=E4=BF=AE=E6=94=B9=E6=95=99?= =?UTF-8?q?=E5=AD=A6=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Resources/Custom.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Resources/Custom.xaml b/Plain Craft Launcher 2/Resources/Custom.xaml index 3f103b1..4049be1 100644 --- a/Plain Craft Launcher 2/Resources/Custom.xaml +++ b/Plain Craft Launcher 2/Resources/Custom.xaml @@ -81,9 +81,9 @@ + Text="在 EventData 中填写 \current,表示启动当前被选中的游戏版本,同样可以在后面填写服务器 IP。" /> + Text="启动当前选中版本并进入 Hypixel" EventType="启动游戏" EventData="\current|mc.hypixel.net" ToolTip="服务器 IP:mc.hypixel.net" /> From f83afdbbc1912392fbd68c4d068663448f564241 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Fri, 21 Jun 2024 16:38:42 +0800 Subject: [PATCH 47/87] =?UTF-8?q?fix:=201.20.1=20NeoForge=20=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=9C=B0=E5=9D=80=E6=8B=BC=E6=8E=A5=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E6=9C=89=E8=AF=AF=EF=BC=88=E5=A6=82=E6=9E=9C=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E4=B8=BA=201.20.1=20=E5=88=99=E7=A1=AC=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E4=BB=A5=E9=81=BF=E5=85=8D=E9=97=AE=E9=A2=98=EF=BC=89=20fix:?= =?UTF-8?q?=20=E6=95=B4=E5=90=88=E5=8C=85=E5=AE=89=E8=A3=85=E6=97=B6?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF=E6=96=87=E6=9C=AC=E6=9C=89?= =?UTF-8?q?=E8=AF=AF=20chores:=20=E4=BB=A3=E7=A0=81=E6=B8=85=E7=90=86?= =?UTF-8?q?=EF=BC=88NeoForge=20=E4=B8=8D=E9=9C=80=E8=A6=81=E9=83=A8?= =?UTF-8?q?=E5=88=86=20Forge=20=E9=80=BB=E8=BE=91=EF=BC=89=20fix(=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90):=20=E5=AE=98=E6=96=B9=E6=BA=90=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=88=97=E8=A1=A8=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 12 ++---------- .../Modules/Minecraft/ModModpack.vb | 6 +----- .../Pages/PageDownload/ModDownloadLib.vb | 17 ----------------- 3 files changed, 3 insertions(+), 32 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 0b39091..b1df6c3 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -771,14 +771,6 @@ Public Value As JObject End Structure ''' - ''' 是否为新版 NeoForge。(即为 Minecraft 1.13+) - ''' - Public ReadOnly Property IsNewType As Boolean - Get - Return Version.Split(".")(0) >= 20 - End Get - End Property - ''' ''' 构建数。 ''' Public ReadOnly Property Build As Integer @@ -805,7 +797,7 @@ Public ReadOnly Property FileName As String Get If StdVersion.StartsWith("47.") Then 'NeoForge 1.20.1 的版本命名有些特殊... - Return "forge-" & Inherit & "-" & StdVersion & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" + Return "forge-" & "1.20.1" & "-" & StdVersion & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" Else Return "neoforge-" & StdVersion & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" End If @@ -859,8 +851,8 @@ End Try If Result.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") ResultJson = GetJson(Result) + Dim VersionArray As Array = ResultJson("versions") Dim Versions As New List(Of DlNeoForgeVersionEntry) - Dim VersionList As String = ResultJson("versions") If Not Versions.Any() Then Throw New Exception("没有可用版本") Loader.Output = Versions End Sub diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index b11f875..b9327b4 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -202,16 +202,12 @@ Retry: End Try ElseIf Id.StartsWithF("neoforge-") Then 'NeoForge 指定 - If Id.Contains("recommended") Then - Log("[ModPack] 该整合包版本过老,已不支持进行安装!", LogLevel.Hint) - Exit Sub - End If Try Log("[ModPack] 整合包 NeoForge 版本:" & Id) NeoForgeVersion = Id.Split("-")(1) Exit For Catch ex As Exception - Log(ex, "读取整合包 Forge 版本失败:" & Id) + Log(ex, "读取整合包 NeoForge 版本失败:" & Id) End Try ElseIf Id.StartsWithF("fabric-") Then 'Fabric 指定 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 625b4da..8a1b618 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1699,23 +1699,6 @@ Retry: #Region "NeoForge 下载" Public Sub McDownloadNeoForge(DownloadInfo As DlNeoForgeVersionEntry) - '老版本提示 - If DownloadInfo.Category = "client" Then - If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & - "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", - "版本过老", "继续", "取消") = 1 Then - McDownloadNeoForgeSave(DownloadInfo) - End If - Exit Sub - End If - If DownloadInfo.Category = "universal" OrElse DownloadInfo.Inherit.StartsWithF("1.5") Then '对该版本自动安装的支持将在之后加入 - If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & - "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", - "版本过老", "继续", "取消") = 1 Then - McDownloadNeoForgeSave(DownloadInfo) - End If - Exit Sub - End If '初始化参数 Dim Id As String = DownloadInfo.Inherit & "-neoforge-" & DownloadInfo.Version Dim Target As String = PathTemp & "Cache\Code\NeoForgeInstall-" & DownloadInfo.Version & "_" & GetUuid() & "." & DownloadInfo.FileSuffix From e0ae69660b94f8069bcf4882af325edd10ab658c Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Fri, 21 Jun 2024 17:00:02 +0800 Subject: [PATCH 48/87] =?UTF-8?q?chores:=20=E7=95=8C=E9=9D=A2=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E6=9B=B4=E6=94=B9=EF=BC=8C=E7=8E=B0=E5=9C=A8=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E7=9A=84=E6=98=AF=20NeoForge=20=E8=BF=98=E6=98=AF=20F?= =?UTF-8?q?orge=20=E6=9B=B4=E6=B8=85=E6=99=B0=E4=BA=86=20fix:=20=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=97=A9=E6=9C=9F=20Modrinth=20=E7=9A=84=20NeoForge?= =?UTF-8?q?=20=E6=95=B4=E5=90=88=E5=8C=85=E6=97=A0=E6=B3=95=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModModpack.vb | 3 ++ .../Pages/PageDownload/ModDownloadLib.vb | 44 +++++++++---------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index b9327b4..20ab3fc 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -391,6 +391,9 @@ Retry: Case "neoforge" 'eg. 20.6.98-beta NeoForgeVersion = Entry.Value.ToString Log("[ModPack] 整合包 NeoForge 版本:" & NeoForgeVersion) + Case "neo-forge" 'eg. 20.6.98-beta / 有些早期的 Modrinth 整合包可能会写成这样,也检测一下 + NeoForgeVersion = Entry.Value.ToString + Log("[ModPack] 整合包 NeoForge 版本:" & NeoForgeVersion) Case "fabric-loader" 'eg. 0.14.14 FabricVersion = Entry.Value.ToString Log("[ModPack] 整合包 Fabric 版本:" & FabricVersion) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 8a1b618..714dd93 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1294,7 +1294,7 @@ Retry: '获取下载信息 If DownloadInfo Is Nothing Then - Loaders.Add(New LoaderTask(Of String, String)("获取 Mod 加载器详细信息", + Loaders.Add(New LoaderTask(Of String, String)("获取 Forge 详细信息", Sub(Task As LoaderTask(Of String, String)) '获取 Forge 版本列表 Dim ForgeLoader = New LoaderTask(Of String, List(Of DlForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlForgeVersionMain) @@ -1311,7 +1311,7 @@ Retry: End Sub) With {.ProgressWeight = 3}) End If '下载 Forge 主文件 - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备 Mod 加载器下载", + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备下载 Forge", Sub(Task As LoaderTask(Of String, List(Of NetFile))) '启动依赖版本的下载 If ClientDownloadLoader Is Nothing Then @@ -1325,13 +1325,13 @@ Retry: }, 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}) + Loaders.Add(New LoaderDownload("下载 Forge 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) '安装(仅在新版安装时需要原版 Jar) If Version.Before(".") >= 20 Then Log("[Download] 检测为新版 Forge:" & Version) Dim Libs As List(Of McLibToken) = Nothing - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Mod 加载器支持库文件", + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Forge 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = New List(Of NetFile) Dim Installer As ZipArchive = Nothing @@ -1374,8 +1374,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("下载 Forge 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12}) + Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("获取 Forge 支持库文件", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) #Region "Forge 文件" If IsCustomFolder Then @@ -1415,7 +1415,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)("安装 Forge(方式 A)", Sub(Task As LoaderTask(Of Boolean, Boolean)) Dim Installer As ZipArchive = Nothing Try @@ -1479,7 +1479,7 @@ Retry: End Sub) With {.ProgressWeight = 10}) Else Log("[Download] 检测为非新版 Forge:" & Version) - Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("安装 Mod 加载器(方式 B)", + Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("安装 Forge(方式 B)", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) Dim Installer As ZipArchive = Nothing Try @@ -1534,8 +1534,8 @@ Retry: 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}) + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Forge 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionFolder))) With {.ProgressWeight = 1, .Show = False}) + Loaders.Add(New LoaderDownload("下载 Forge 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 11}) End If End If @@ -1718,7 +1718,7 @@ Retry: '已有版本检查 If File.Exists(VersionFolder & Id & ".json") Then - If MyMsgBox("版本 " & Id & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 json 和 jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then + If MyMsgBox("版本 " & Id & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 Json 和 Jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then File.Delete(VersionFolder & Id & ".jar") File.Delete(VersionFolder & Id & ".json") Else @@ -1746,7 +1746,7 @@ Retry: Public Sub McDownloadNeoForgeSave(DownloadInfo As DlNeoForgeVersionEntry) Try Dim Target As String = SelectAs("选择保存位置", DownloadInfo.FileName, "NeoForge 文件 (*." & DownloadInfo.FileSuffix & ")|*." & DownloadInfo.FileSuffix) - Dim DisplayName As String = "Forge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version + Dim DisplayName As String = "NeoForge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version If Not Target.Contains("\") Then Exit Sub '重复任务检查 @@ -1987,7 +1987,7 @@ Retry: '获取下载信息 If DownloadInfo Is Nothing Then - Loaders.Add(New LoaderTask(Of String, String)("获取 Mod 加载器详细信息", + Loaders.Add(New LoaderTask(Of String, String)("获取 NeoForge 详细信息", Sub(Task As LoaderTask(Of String, String)) '获取 NeoForge 版本列表 Dim NeoForgeLoader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadNeoForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain) @@ -2004,7 +2004,7 @@ Retry: End Sub) With {.ProgressWeight = 3}) End If '下载 NeoForge 主文件 - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备 Mod 加载器下载", + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备下载 NeoForge", Sub(Task As LoaderTask(Of String, List(Of NetFile))) '启动依赖版本的下载 If ClientDownloadLoader Is Nothing Then @@ -2027,12 +2027,12 @@ Retry: End If Task.Output = Files End Sub) With {.ProgressWeight = 0.5, .Show = False}) - Loaders.Add(New LoaderDownload("下载 Mod 加载器主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) + Loaders.Add(New LoaderDownload("下载 NeoForge 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) - '安装(仅在新版安装时需要原版 Jar) + '安装(需要原版 Jar) Log("[Download] 检测为新版 NeoForge:" & Version) Dim Libs As List(Of McLibToken) = Nothing - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Mod 加载器支持库文件", + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 NeoForge 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = New List(Of NetFile) Dim Installer As ZipArchive = Nothing @@ -2069,14 +2069,14 @@ Retry: Next Task.Output = McLibFixFromLibToken(Libs, PathMcFolder) Catch ex As Exception - Throw New Exception("获取新版 NeoForge 支持库列表失败", ex) + Throw New Exception("获取 NeoForge 支持库列表失败", ex) Finally '释放文件 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("下载 NeoForge 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12}) + Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("获取 NeoForge 支持库文件", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) #Region "NeoForge 文件" If IsCustomFolder Then @@ -2116,11 +2116,11 @@ 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)("安装 NeoForge", Sub(Task As LoaderTask(Of Boolean, Boolean)) Dim Installer As ZipArchive = Nothing Try - Log("[Download] 开始进行新版方式 NeoForge 安装:" & InstallerAddress) + Log("[Download] 开始进行 NeoForge 安装:" & InstallerAddress) '记录当前文件夹列表(在新建目标文件夹之前) Dim OldList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories. Select(Function(i) i.FullName).ToList() From 3bc34160a2d3d5b3e21f704db5ab925c12f23b41 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Fri, 21 Jun 2024 23:13:52 +0800 Subject: [PATCH 49/87] =?UTF-8?q?fix:=201.20.1=20NeoForge=20=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E5=A4=B1=E8=B4=A5=EF=BC=88Json=20=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 714dd93..866027c 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1703,7 +1703,7 @@ Retry: Dim Id As String = DownloadInfo.Inherit & "-neoforge-" & DownloadInfo.Version Dim Target As String = PathTemp & "Cache\Code\NeoForgeInstall-" & DownloadInfo.Version & "_" & GetUuid() & "." & DownloadInfo.FileSuffix Dim VersionFolder As String = PathMcFolder & "versions\" & Id & "\" - Dim DisplayName As String = "Forge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version + Dim DisplayName As String = "NeoForge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version Try '重复任务检查 @@ -2436,7 +2436,7 @@ Retry: '若要下载 NeoForge,则需要在下面两项中完成至少一项 ''' - ''' 欲下载的 NeoForge 版本名。接受例如 36.1.4 / 14.23.5.2859 / 1.19-41.1.0 的输入。 + ''' 欲下载的 NeoForge 版本名。 ''' Public NeoForgeVersion As String = Nothing ''' @@ -2583,7 +2583,7 @@ Retry: 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 + If Request.NeoForgeVersion IsNot Nothing Then NeoForgeFolder = TempMcFolder & "versions\" & If(Request.NeoForgeVersion.StartsWithF("1.20.1"), "1.20.1-forge-", "") & Request.NeoForgeVersion.Replace("1.20.1-", "") 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 From 7d50ed1ca6aae2462836fac022dc3c68a1aa381f Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sat, 22 Jun 2024 00:23:18 +0800 Subject: [PATCH 50/87] =?UTF-8?q?fix:=201.20.1=20NeoForge=20=E8=BF=91?= =?UTF-8?q?=E6=9C=9F=E7=89=88=E6=9C=AC=E6=97=A0=E6=B3=95=E5=AE=89=E8=A3=85?= =?UTF-8?q?=EF=BC=88Json=20=E8=B7=AF=E5=BE=84=E9=94=99=E8=AF=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 866027c..6d5fa43 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2583,7 +2583,7 @@ Retry: 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\" & If(Request.NeoForgeVersion.StartsWithF("1.20.1"), "1.20.1-forge-", "") & Request.NeoForgeVersion.Replace("1.20.1-", "") + If Request.NeoForgeVersion IsNot Nothing Then NeoForgeFolder = TempMcFolder & "versions\" & If(Request.NeoForgeVersion.StartsWithF("1.20.1") OrElse Request.NeoForgeVersion.StartsWithF("47."), "1.20.1-forge-", "") & Request.NeoForgeVersion.Replace("1.20.1-", "") 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 @@ -2601,6 +2601,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 Request.NeoForgeVersion IsNot Nothing Then Log("[Download] NeoForge 版本:" & Request.NeoForgeVersion) If FabricFolder IsNot Nothing Then Log("[Download] Fabric 缓存:" & FabricFolder) If LiteLoaderFolder IsNot Nothing Then Log("[Download] LiteLoader 缓存:" & LiteLoaderFolder) Log("[Download] 对应的原版版本:" & Request.MinecraftName) From 70a6b6a946482d0092388ab81e54bce835f5306e Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sat, 22 Jun 2024 00:23:53 +0800 Subject: [PATCH 51/87] =?UTF-8?q?chores:=20=E5=88=A0=E9=99=A4=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb | 1 - 1 file changed, 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 6d5fa43..1b892aa 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2601,7 +2601,6 @@ 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 Request.NeoForgeVersion IsNot Nothing Then Log("[Download] NeoForge 版本:" & Request.NeoForgeVersion) If FabricFolder IsNot Nothing Then Log("[Download] Fabric 缓存:" & FabricFolder) If LiteLoaderFolder IsNot Nothing Then Log("[Download] LiteLoader 缓存:" & LiteLoaderFolder) Log("[Download] 对应的原版版本:" & Request.MinecraftName) From 61ac6270cb2a167d10f23b490b536592e1a13c0b Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sat, 22 Jun 2024 08:46:10 +0800 Subject: [PATCH 52/87] =?UTF-8?q?fix:=201.20.1=20NeoForge=20=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E5=AE=89=E8=A3=85=EF=BC=88Json=20=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E6=8B=BC=E6=8E=A5=E9=94=99=E8=AF=AF=EF=BC=89=20fix:=20NeoForge?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC=E5=88=86=E7=B1=BB=E9=94=99=E8=AF=AF=20fix?= =?UTF-8?q?:=20=E9=94=99=E8=AF=AF=E5=9C=B0=E6=8F=90=E7=A4=BA=20NeoForge=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=B8=8D=E5=8F=AF=E4=BD=BF=E7=94=A8=20Mod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb | 4 ++-- Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb | 5 +++-- Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb | 6 +++++- .../Pages/PageVersion/PageVersionModDisabled.xaml | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index f1cdb96..930e47a 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -291,7 +291,7 @@ Public Module ModMinecraft Public ReadOnly Property Modable As Boolean Get If Not IsLoaded Then Load() - Return Version.HasFabric OrElse Version.HasForge OrElse Version.HasLiteLoader OrElse + Return Version.HasFabric OrElse Version.HasForge OrElse Version.HasLiteLoader OrElse Version.HasNeoForge OrElse DisplayType = McVersionCardType.API '#223 End Get End Property @@ -923,7 +923,7 @@ ExitDataLoad: ''' Public HasNeoForge As Boolean = False ''' - ''' NeoForge 版本号,如 31.1.2、14.23.5.2847。 + ''' NeoForge 版本号,如 21.0.2-beta、47.1.79。 ''' Public NeoForgeVersion As String = "" diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 1b892aa..7f85806 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2030,7 +2030,7 @@ Retry: Loaders.Add(New LoaderDownload("下载 NeoForge 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) '安装(需要原版 Jar) - Log("[Download] 检测为新版 NeoForge:" & Version) + Log("[Download] 检测到的 NeoForge 版本:" & Version) Dim Libs As List(Of McLibToken) = Nothing Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 NeoForge 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) @@ -2583,7 +2583,7 @@ Retry: 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\" & If(Request.NeoForgeVersion.StartsWithF("1.20.1") OrElse Request.NeoForgeVersion.StartsWithF("47."), "1.20.1-forge-", "") & Request.NeoForgeVersion.Replace("1.20.1-", "") + If Request.NeoForgeVersion IsNot Nothing Then NeoForgeFolder = TempMcFolder & "versions\" & If(Request.NeoForgeVersion.StartsWithF("1.20.1") OrElse Request.NeoForgeVersion.StartsWithF("47."), "1.20.1-forge-", "") & Request.NeoForgeVersion.Replace("1.20.1-forge-", "").Replace("1.20.1-", "") 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 @@ -2601,6 +2601,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 Request.NeoForgeVersion IsNot Nothing Then Log("[Download] NeoForge 版本:" & Request.NeoForgeVersion) If FabricFolder IsNot Nothing Then Log("[Download] Fabric 缓存:" & FabricFolder) If LiteLoaderFolder IsNot Nothing Then Log("[Download] LiteLoader 缓存:" & LiteLoaderFolder) Log("[Download] 对应的原版版本:" & Request.MinecraftName) diff --git a/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb b/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb index 1709a4a..afc5db4 100644 --- a/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb @@ -38,19 +38,23 @@ CardName = "常规版本" Case McVersionCardType.API Dim IsForgeExists As Boolean = False + Dim IsNeoExists As Boolean = False Dim IsFabricExists As Boolean = False Dim IsLiteExists As Boolean = False For Each Version As McVersion In Card.Value If Version.Version.HasFabric Then IsFabricExists = True If Version.Version.HasLiteLoader Then IsLiteExists = True If Version.Version.HasForge Then IsForgeExists = True + If Version.Version.HasNeoForge Then IsNeoExists = True Next - If If(IsLiteExists, 1, 0) + If(IsForgeExists, 1, 0) + If(IsFabricExists, 1, 0) > 1 Then + If If(IsLiteExists, 1, 0) + If(IsForgeExists, 1, 0) + If(IsFabricExists, 1, 0) + If(IsNeoExists, 1, 0) > 1 Then CardName = "可安装 Mod" ElseIf IsForgeExists Then CardName = "Forge 版本" ElseIf IsLiteExists Then CardName = "LiteLoader 版本" + ElseIf IsNeoExists Then + CardName = "NeoForge 版本" Else CardName = "Fabric 版本" End If diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml index cfbd13a..77a6099 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml @@ -22,7 +22,7 @@ - + From 4a804cf96698373598f12479f453d6a8ca1cb8e8 Mon Sep 17 00:00:00 2001 From: SALTWOOD <105980161+SALTWOOD@users.noreply.github.com> Date: Sun, 23 Jun 2024 18:27:35 +0800 Subject: [PATCH 53/87] =?UTF-8?q?refactor:=20=E7=AE=80=E5=8C=96=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=20Java=20=E6=97=B6=E7=9A=84=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E8=AF=8D=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModJava.vb | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb index 7767f6b..2bc5f59 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb @@ -1,6 +1,18 @@ Public Module ModJava Public JavaListCacheVersion As Integer = 6 + ''' + ''' 用于在搜索 Java 时进行关键词检测。 + ''' + Public ReadOnly SearchEntryWords As List(Of String) = + New List(Of String) From {"java", "jdk", "env", "环境", "run", "软件", "jre", "bin", "mc", + "soft", "cache", "temp", "corretto", "roaming", "users", "craft", "program", "世界", "net", + "游戏", "oracle", "game", "file", "data", "jvm", "服务", "server", "客户", "client", "整合", + "应用", "运行", "前置", "mojang", "官启", "新建文件夹", "eclipse", "microsoft", "hotspot", + "runtime", "x86", "x64", "forge", "原版", "optifine", "官方", "启动", "hmcl", "mod", "高清", + "download", "launch", "程序", "path", "version", "baka", "pcl", "zulu", "local", "packages", + "4297127d64ec6", "国服", "网易", "ext", "netease", "1.", "启动"} + ''' ''' 目前所有可用的 Java。 ''' @@ -670,29 +682,8 @@ Wait: Dim SearchEntry = GetFolderNameFromPath(FolderInfo.Name).ToLower '用于搜索的字符串 If IsFullSearch OrElse FolderInfo.Parent.Name.ToLower = "users" OrElse - SearchEntry.Contains("java") OrElse SearchEntry.Contains("jdk") OrElse SearchEntry.Contains("env") OrElse - SearchEntry.Contains("环境") OrElse SearchEntry.Contains("run") OrElse SearchEntry.Contains("软件") OrElse - SearchEntry.Contains("jre") OrElse SearchEntry = "bin" OrElse SearchEntry.Contains("mc") OrElse - SearchEntry.Contains("soft") OrElse SearchEntry.Contains("cache") OrElse SearchEntry.Contains("temp") OrElse - SearchEntry.Contains("corretto") OrElse SearchEntry.Contains("roaming") OrElse SearchEntry.Contains("users") OrElse - SearchEntry.Contains("craft") OrElse SearchEntry.Contains("program") OrElse SearchEntry.Contains("世界") OrElse - SearchEntry.Contains("net") OrElse SearchEntry.Contains("游戏") OrElse SearchEntry.Contains("oracle") OrElse - SearchEntry.Contains("game") OrElse SearchEntry.Contains("file") OrElse SearchEntry.Contains("data") OrElse - SearchEntry.Contains("jvm") OrElse SearchEntry.Contains("服务") OrElse SearchEntry.Contains("server") OrElse - SearchEntry.Contains("客户") OrElse SearchEntry.Contains("client") OrElse SearchEntry.Contains("整合") OrElse - SearchEntry.Contains("应用") OrElse SearchEntry.Contains("运行") OrElse SearchEntry.Contains("前置") OrElse - SearchEntry.Contains("mojang") OrElse SearchEntry.Contains("官启") OrElse SearchEntry.Contains("新建文件夹") OrElse - SearchEntry.Contains("eclipse") OrElse SearchEntry.Contains("microsoft") OrElse SearchEntry.Contains("hotspot") OrElse - SearchEntry.Contains("runtime") OrElse SearchEntry.Contains("x86") OrElse SearchEntry.Contains("x64") OrElse - SearchEntry.Contains("forge") OrElse SearchEntry.Contains("原版") OrElse SearchEntry.Contains("optifine") OrElse - SearchEntry.Contains("官方") OrElse SearchEntry.Contains("启动") OrElse SearchEntry.Contains("hmcl") OrElse - SearchEntry.Contains("mod") OrElse SearchEntry.Contains("高清") OrElse SearchEntry.Contains("download") OrElse - SearchEntry.Contains("launch") OrElse SearchEntry.Contains("程序") OrElse SearchEntry.Contains("path") OrElse - SearchEntry.Contains("version") OrElse SearchEntry.Contains("baka") OrElse SearchEntry.Contains("pcl") OrElse - SearchEntry.Contains("zulu") OrElse - SearchEntry.Contains("local") OrElse SearchEntry.Contains("packages") OrElse SearchEntry.Contains("4297127d64ec6") OrElse '官启文件夹 - SearchEntry.Contains("国服") OrElse SearchEntry.Contains("网易") OrElse SearchEntry.Contains("ext") OrElse '网易 Java 文件夹名 - SearchEntry.Contains("netease") OrElse SearchEntry.Contains("1.") OrElse SearchEntry.Contains("启动") Then + SearchEntryWords.Any(Function(word) SearchEntry.Contains(word)) OrElse '进行关键词检测 + SearchEntry = "bin" Then JavaSearchFolder(FolderInfo, Results, Source) End If Next From 3f5c29264fa212b8b8f727460a0660ee36e806fd Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Wed, 26 Jun 2024 21:27:08 +0800 Subject: [PATCH 54/87] =?UTF-8?q?feat(neoforge):=20NeoForge=20=E5=AE=98?= =?UTF-8?q?=E6=96=B9=E6=BA=90=E7=89=88=E6=9C=AC=E5=88=97=E8=A1=A8=20feat(n?= =?UTF-8?q?eoforge):=20NeoForge=20Minecraft=20=E7=89=88=E6=9C=AC=E5=88=97?= =?UTF-8?q?=E8=A1=A8=EF=BC=88=E5=AE=98=E6=96=B9=E6=BA=90=20Only=EF=BC=89?= =?UTF-8?q?=20fix:=20NeoForge=20=E6=89=8B=E5=8A=A8=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=AD=A3=E5=B8=B8=E5=8A=A0=E8=BD=BD=EF=BC=88?= =?UTF-8?q?=E5=8F=AA=E4=BF=AE=E4=BA=86=E4=B8=80=E5=8D=8A=EF=BC=89=20ui:=20?= =?UTF-8?q?=E5=9C=A8=E8=87=AA=E5=8A=A8=E5=AE=89=E8=A3=85=E7=9A=84=20NeoFor?= =?UTF-8?q?ge=20=E5=8D=A1=E7=89=87=E4=B8=AD=E6=98=BE=E7=A4=BA=E6=9C=80?= =?UTF-8?q?=E6=96=B0=E7=A8=B3=E5=AE=9A=E7=89=88=E5=92=8C=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=20chores:=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 168 ++++++++++++++++-- .../Pages/PageDownload/ModDownloadLib.vb | 22 ++- .../PageDownload/PageDownloadNeoForge.xaml | 7 +- .../PageDownload/PageDownloadNeoForge.xaml.vb | 37 +++- 4 files changed, 208 insertions(+), 26 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index b1df6c3..d5cfe70 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -721,6 +721,108 @@ #End Region +#Region "DlNeoForgeList | NeoForge Minecraft 版本列表" + + Public Structure DlNeoForgeListResult + ''' + ''' 数据来源名称,如“Official”,“BMCLAPI”。 + ''' + Public SourceName As String + ''' + ''' 是否为官方的实时数据。 + ''' + Public IsOfficial As Boolean + ''' + ''' 获取到的数据。 + ''' + Public Value As List(Of String) + End Structure + + ''' + ''' NeoForge 版本列表,主加载器。 + ''' + Public DlNeoForgeListLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Main", AddressOf DlNeoForgeListMain) + Private Sub DlNeoForgeListMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) + Select Case Setup.Get("ToolDownloadVersion") + Case 0 + DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From { + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 30), + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60) + }, Loader.IsForceRestarting) + Case 1 + DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From { + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 5), + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 35) + }, Loader.IsForceRestarting) + Case Else + DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From { + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60), + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60) + }, Loader.IsForceRestarting) + End Select + End Sub + + ''' + ''' NeoForge 版本列表,官方源。 + ''' + Public DlNeoForgeListOfficialLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Official", AddressOf DlNeoForgeListOfficialMain) + Private Sub DlNeoForgeListOfficialMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) + 'Dim Result As String = NetGetCodeByRequestRetry("https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.2.4.html", Encoding.Default, "text/html", UseBrowserUserAgent:=True) + 'If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") + ''获取所有版本信息 + 'Dim Names As List(Of String) = RegexSearch(Result, "(?<=a href=""index_)[0-9.]+(_pre[0-9]?)?(?=.html)") + 'If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")") + 'Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", .Value = Names} + Dim ResultLatest As String + Dim VersionsJArray As JArray + Try + ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) + Catch ex As Exception + If GetExceptionSummary(ex).Contains("(404)") Then + Throw New Exception("没有可用版本") + Else + Throw + End If + End Try + If ResultLatest.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") + VersionsJArray = GetJson(ResultLatest)("versions") + Dim Versions As List(Of String) = New List(Of String) + Versions.Add("1.20.1") + Try + For Each Token As String In VersionsJArray + Dim Version As String = Token.ToString().Replace("neoforge-", "") + Dim Inherit As String = "1." & Version.ToString().Split(".")(0) & "." & Token.ToString().Split(".")(1) + If Inherit.EndsWith(".0") Then + Inherit = Inherit.Replace(".0", "") + End If + If Versions.Contains(Inherit) Then + Continue For + Else + Versions.Add(Inherit) + End If + Next + Catch ex As Exception + MyMsgBox(ex.ToString(), "错误") + Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex) + End Try + If Not Versions.Any() Then Throw New Exception("没有可用版本") + Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", .Value = Versions} + End Sub + + ''' + ''' NeoForge 版本列表,BMCLAPI。 + ''' + 'Public DlNeoForgeListBmclapiLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Bmclapi", AddressOf DlNeoForgeListBmclapiMain) + 'Private Sub DlNeoForgeListBmclapiMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) + ' Dim Result As String = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/forge/minecraft", Encoding.Default) + ' If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") + ' '获取所有版本信息 + ' Dim Names As List(Of String) = RegexSearch(Result, "[0-9.]+(_pre[0-9]?)?") + ' If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")") + ' Loader.Output = New DlNeoForgeListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Names} + 'End Sub +#End Region + #Region "DlNeoForgeVersion | NeoForge 版本列表" Public Class DlNeoForgeVersionEntry @@ -811,7 +913,6 @@ ''' ''' NeoForge 版本列表,主加载器。 ''' - Public DlNeoForgeListLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeList Main", AddressOf DlNeoForgeVersionMain) Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) 'BMCLAPI 不会返回完整的 NeoForge 版本列表,而貌似也没有办法获取 NeoForge 支持的所有 Minecraft 版本 Dim DlNeoForgeVersionOfficialLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Official", AddressOf DlNeoForgeVersionOfficialMain) Dim DlNeoForgeVersionBmclapiLoader As New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Bmclapi", AddressOf DlNeoForgeVersionBmclapiMain) @@ -838,10 +939,15 @@ ''' NeoForge 版本列表,官方源。 ''' Public Sub DlNeoForgeVersionOfficialMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) - Dim Result As String - Dim ResultJson As JObject + Dim ResultLatest As String + Dim ResultLegacy As String + Dim ResultJson As String + Dim ResultLatestJson As JObject + Dim ResultLegacyJson As JObject + Dim VersionsJArray As JArray Try - Result = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) + ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) + ResultLegacy = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/forge", UseBrowserUserAgent:=True) Catch ex As Exception If GetExceptionSummary(ex).Contains("(404)") Then Throw New Exception("没有可用版本") @@ -849,10 +955,52 @@ Throw End If End Try - If Result.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") - ResultJson = GetJson(Result) - Dim VersionArray As Array = ResultJson("versions") + If ResultLatest.Length < 50 AndAlso ResultLegacy.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") + ResultLatestJson = GetJson(ResultLatest) + ResultLegacyJson = GetJson(ResultLegacy) + If Loader.Input IsNot Nothing Then + If Loader.Input Is "1.20.1" Then + VersionsJArray = ResultLegacyJson("versions") + Else + VersionsJArray = ResultLatestJson("versions") + End If + Else + VersionsJArray = ResultLatestJson("versions") + End If Dim Versions As New List(Of DlNeoForgeVersionEntry) + Try + For Each Token As String In VersionsJArray + Dim StdVersion As String + Dim IsBeta As Boolean + Dim rawVersion As String = Token.ToString() + If rawVersion.Contains("-beta") Then + StdVersion = Token.ToString().Replace("neoforge-", "").Replace("-beta", "") + IsBeta = True + Else + StdVersion = Token.ToString().Replace("neoforge-", "") + IsBeta = False + End If + Dim Inherit As String = "1." & StdVersion.ToString().Split(".")(0) & "." & StdVersion.ToString().Split(".")(1) + If Inherit.EndsWith(".0") Then + Inherit = Inherit.Replace(".0", "") + End If + Dim Entry = New DlNeoForgeVersionEntry + If Loader.Input IsNot Nothing Then + If Inherit Is Loader.Input Then + Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Versions.Add(Entry) + Continue For + Else + Continue For + End If + End If + Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Versions.Add(Entry) + Next + Catch ex As Exception + MyMsgBox(ex.ToString(), "错误") + Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex) + End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") Loader.Output = Versions End Sub @@ -865,8 +1013,7 @@ Dim Versions As New List(Of DlNeoForgeVersionEntry) Try For Each Token As JObject In Json - Dim Name As String '存储 rawVersion,貌似变化更加频繁 - Dim StdVersion As String '存储 version,相对规则 + Dim StdVersion As String Dim IsBeta As Boolean Dim rawVersion As String = Token("rawVersion") If rawVersion.Contains("-beta") Then @@ -876,9 +1023,8 @@ StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("1.20.1-", "") IsBeta = False End If - Name = rawVersion Dim Inherit As String = Token("mcversion") - Dim Entry = New DlNeoForgeVersionEntry With {.Version = Name, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Dim Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} Versions.Add(Entry) Next Catch ex As Exception diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 7f85806..f6d2f4e 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2187,16 +2187,28 @@ Retry: #Region "NeoForge 下载菜单" Public Sub NeoForgeDownloadListItemPreload(Stack As StackPanel, Entrys As List(Of DlNeoForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) - '获取最新版本 - Dim FreshVersion As DlNeoForgeVersionEntry = Nothing + '获取最新稳定版和测试版 + Dim FreshStableVersion As DlNeoForgeVersionEntry = Nothing + Dim FreshBetaVersion As DlNeoForgeVersionEntry = Nothing If Entrys.Any Then - FreshVersion = Entrys.Last() + For Each Entry In Entrys + If Entry.IsBeta Then + FreshBetaVersion = Entry + Else + FreshStableVersion = Entry + End If + Next Else Log("[System] 未找到可用的 NeoForge 版本", LogLevel.Debug) End If '显示各个版本 - If FreshVersion IsNot Nothing Then - Dim Fresh = NeoForgeDownloadListItem(FreshVersion, OnClick, IsSaveOnly) + If FreshStableVersion IsNot Nothing Then + Dim Fresh = NeoForgeDownloadListItem(FreshStableVersion, OnClick, IsSaveOnly) + Fresh.Info = "最新版" & If(Fresh.Info = "", "", "," & Fresh.Info) + Stack.Children.Add(Fresh) + End If + If FreshBetaVersion IsNot Nothing Then + Dim Fresh = NeoForgeDownloadListItem(FreshBetaVersion, OnClick, IsSaveOnly) Fresh.Info = "最新版" & If(Fresh.Info = "", "", "," & Fresh.Info) Stack.Children.Add(Fresh) End If diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml index aae4da7..f72fb9d 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml @@ -17,10 +17,11 @@ - + + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb index fcb4491..2e6f3e8 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb @@ -1,7 +1,7 @@ Public Class PageDownloadNeoForge Private Sub LoaderInit() Handles Me.Initialized - PageLoaderInit(Load, PanLoad, CardVersions, CardTip, DlNeoForgeListLoader, AddressOf Load_OnFinish) + PageLoaderInit(Load, PanLoad, PanMain, CardTip, DlNeoForgeListLoader, AddressOf Load_OnFinish) End Sub Private Sub Init() Handles Me.Loaded PanBack.ScrollToHome() @@ -10,21 +10,44 @@ Private Sub Load_OnFinish() '结果数据化 Try - Dim Versions As List(Of DlNeoForgeVersionEntry) = DlNeoForgeListLoader.Output - PanVersions.Children.Clear() - For Each Version In Versions - PanVersions.Children.Add(NeoForgeDownloadListItem(Version, AddressOf NeoForge_Selected, True)) + Dim Versions = Sort(DlNeoForgeListLoader.Output.Value, AddressOf VersionSortBoolean) + 'Dim Versions As List(Of DlNeoForgeVersionEntry) = DlNeoForgeListLoader.Output + PanMain.Children.Clear() + For Each Version As String In Versions + '增加卡片 + Dim NewCard As New MyCard With {.Title = Version.Replace("_p", " P"), .Margin = New Thickness(0, 0, 0, 15), .SwapType = 5} + Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = Version} + NewCard.Children.Add(NewStack) + NewCard.SwapControl = NewStack + NewCard.IsSwaped = True + PanMain.Children.Add(NewCard) Next - CardVersions.Title = "版本列表 (" & Versions.Count & ")" Catch ex As Exception Log(ex, "可视化 NeoForge 版本列表出错", LogLevel.Feedback) End Try End Sub + Public Sub NeoForge_StateChanged(sender As MyLoading, newState As MyLoading.MyLoadingState, oldState As MyLoading.MyLoadingState) + If newState <> MyLoading.MyLoadingState.Stop Then Exit Sub + Dim Card As MyCard = CType(sender.Parent, FrameworkElement).Parent + Dim Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)) = sender.State + '载入列表 + Card.SwapControl.Children.Clear() + Card.SwapControl.Tag = Loader.Output + Card.SwapType = 6 + Card.StackInstall() + End Sub + Public Sub NeoForge_Click(sender As MyLoading, e As MouseButtonEventArgs) + If sender.State.LoadingState = MyLoading.MyLoadingState.Error Then + CType(sender.State, LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))).Start(IsForceRestart:=True) + End If + End Sub Private Sub NeoForge_Selected(sender As MyListItem, e As EventArgs) McDownloadNeoForgeSave(sender.Tag) End Sub - + Public Sub DownloadStart(sender As MyListItem, e As Object) + McDownloadNeoForge(sender.Tag) + End Sub Private Sub BtnWeb_Click(sender As Object, e As EventArgs) Handles BtnWeb.Click OpenWebsite("https://neoforged.net/") End Sub From 707b6eec1469c7a1b9a8844da79216dc92330ec3 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Wed, 26 Jun 2024 22:13:11 +0800 Subject: [PATCH 55/87] =?UTF-8?q?fix:=20NeoForge=20=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E7=89=88=E6=9C=AC=E5=88=97=E8=A1=A8=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E6=AD=A3=E5=B8=B8=E5=8A=A0=E8=BD=BD=EF=BC=88=E4=BF=AE?= =?UTF-8?q?=E5=AE=8C=E4=BA=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Controls/MyCard.vb | 13 +++++++++++++ .../Modules/Minecraft/ModDownload.vb | 6 ------ .../Pages/PageDownload/PageDownloadNeoForge.xaml.vb | 5 ++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Plain Craft Launcher 2/Controls/MyCard.vb b/Plain Craft Launcher 2/Controls/MyCard.vb index 11b7669..0cb673f 100644 --- a/Plain Craft Launcher 2/Controls/MyCard.vb +++ b/Plain Craft Launcher 2/Controls/MyCard.vb @@ -128,6 +128,16 @@ ForgeDownloadListItemPreload(Stack, Stack.Tag, AddressOf ForgeSave_Click, True) Case 8 CompFilesCardPreload(Stack, Stack.Tag) + Case 13 + Dim LoadingPickaxe As New MyLoading With {.Text = "正在获取版本列表", .Margin = New Thickness(5)} + Dim Loader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Main", AddressOf DlNeoForgeVersionMain) + LoadingPickaxe.State = Loader + Loader.Start(Stack.Tag) + AddHandler LoadingPickaxe.StateChanged, AddressOf FrmDownloadNeoForge.NeoForge_StateChanged + AddHandler LoadingPickaxe.Click, AddressOf FrmDownloadNeoForge.NeoForge_Click + Stack.Children.Add(LoadingPickaxe) + Case 14 + NeoForgeDownloadListItemPreload(Stack, Stack.Tag, AddressOf NeoForgeSave_Click, True) End Select '实现控件虚拟化 For Each Data As Object In Stack.Tag @@ -171,6 +181,9 @@ Stack.Children.Add(CType(Data, HelpEntry).ToListItem) Case 12 Stack.Children.Add(FabricDownloadListItem(CType(Data, JObject), AddressOf FrmDownloadInstall.Fabric_Selected)) + Case 13 + Case 14 + Stack.Children.Add(NeoForgeDownloadListItem(Data, AddressOf NeoForgeSave_Click, True)) Case Else Log("未知的虚拟化种类:" & Type, LogLevel.Feedback) End Select diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index d5cfe70..a8656cc 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -767,12 +767,6 @@ ''' Public DlNeoForgeListOfficialLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Official", AddressOf DlNeoForgeListOfficialMain) Private Sub DlNeoForgeListOfficialMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) - 'Dim Result As String = NetGetCodeByRequestRetry("https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.2.4.html", Encoding.Default, "text/html", UseBrowserUserAgent:=True) - 'If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") - ''获取所有版本信息 - 'Dim Names As List(Of String) = RegexSearch(Result, "(?<=a href=""index_)[0-9.]+(_pre[0-9]?)?(?=.html)") - 'If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")") - 'Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", .Value = Names} Dim ResultLatest As String Dim VersionsJArray As JArray Try diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb index 2e6f3e8..b0eabde 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb @@ -11,11 +11,10 @@ '结果数据化 Try Dim Versions = Sort(DlNeoForgeListLoader.Output.Value, AddressOf VersionSortBoolean) - 'Dim Versions As List(Of DlNeoForgeVersionEntry) = DlNeoForgeListLoader.Output PanMain.Children.Clear() For Each Version As String In Versions '增加卡片 - Dim NewCard As New MyCard With {.Title = Version.Replace("_p", " P"), .Margin = New Thickness(0, 0, 0, 15), .SwapType = 5} + Dim NewCard As New MyCard With {.Title = Version.Replace("_p", " P"), .Margin = New Thickness(0, 0, 0, 15), .SwapType = 13} Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = Version} NewCard.Children.Add(NewStack) NewCard.SwapControl = NewStack @@ -34,7 +33,7 @@ '载入列表 Card.SwapControl.Children.Clear() Card.SwapControl.Tag = Loader.Output - Card.SwapType = 6 + Card.SwapType = 14 Card.StackInstall() End Sub Public Sub NeoForge_Click(sender As MyLoading, e As MouseButtonEventArgs) From 2cfa9b2015be952edb2898dc702ec05c331a3110 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Wed, 26 Jun 2024 23:43:37 +0800 Subject: [PATCH 56/87] =?UTF-8?q?feat:=20NeoForge=20BMCLAPI=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=88=97=E8=A1=A8=E8=8E=B7=E5=8F=96=20fix:=20?= =?UTF-8?q?=E4=B9=8B=E5=89=8D=E7=9A=84=E6=8E=92=E5=BA=8F=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=BC=9A=E5=AF=BC=E8=87=B4=20IDE=20=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 51 +++++++++++++------ .../Pages/PageDownload/ModDownloadLib.vb | 4 +- .../PageDownload/PageDownloadInstall.xaml.vb | 5 +- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index a8656cc..45006dc 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -746,18 +746,18 @@ Select Case Setup.Get("ToolDownloadVersion") Case 0 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From { - New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 30), + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListBmclapiLoader, 30), New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60) }, Loader.IsForceRestarting) Case 1 DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From { New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 5), - New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 35) + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListBmclapiLoader, 35) }, Loader.IsForceRestarting) Case Else DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)) From { New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60), - New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListOfficialLoader, 60) + New KeyValuePair(Of LoaderTask(Of Integer, DlNeoForgeListResult), Integer)(DlNeoForgeListBmclapiLoader, 60) }, Loader.IsForceRestarting) End Select End Sub @@ -806,15 +806,31 @@ ''' ''' NeoForge 版本列表,BMCLAPI。 ''' - 'Public DlNeoForgeListBmclapiLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Bmclapi", AddressOf DlNeoForgeListBmclapiMain) - 'Private Sub DlNeoForgeListBmclapiMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) - ' Dim Result As String = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/forge/minecraft", Encoding.Default) - ' If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") - ' '获取所有版本信息 - ' Dim Names As List(Of String) = RegexSearch(Result, "[0-9.]+(_pre[0-9]?)?") - ' If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")") - ' Loader.Output = New DlNeoForgeListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Names} - 'End Sub + Public DlNeoForgeListBmclapiLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Bmclapi", AddressOf DlNeoForgeListBmclapiMain) + Private Sub DlNeoForgeListBmclapiMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) + Dim Versions As List(Of String) = New List(Of String) + Dim ClientVersions As JArray = DlClientListLoader.Output.Value("versions") 'BMCLAPI 不能返回所有 NeoForge 版本,获取 MC 版本列表进行遍历 + Dim ClientReleases As List(Of String) = New List(Of String) + + For Each Client In ClientVersions '排除快照版或远古版等特殊版本 + Dim ClientVersionString = Client("id").ToString() + If Not (ClientVersionString.ContainsF("a") OrElse ClientVersionString.ContainsF("b") OrElse ClientVersionString.ContainsF("c") OrElse ClientVersionString.ContainsF("w") OrElse ClientVersionString.ContainsF("pre") OrElse ClientVersionString.ContainsF("Pre") OrElse ClientVersionString.ContainsF("rc") OrElse ClientVersionString.ContainsF("b") OrElse ClientVersionString.ContainsF("rd") OrElse ClientVersionString.ContainsF("inf")) Then + ClientReleases.Add(ClientVersionString) + End If + Next + + For Each Release In ClientReleases + If Int(Release.Split(".")(1)) > 19 Then '如果游戏版本低于 1.20 就不进行请求 + Dim Json As String = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/neoforge/list/" & Release) + If Json IsNot "[]" Then '如果这个版本不支持 NeoForge,BMCLAPI 会直接返回一个空的 Json 序列,这里直接用字符串处理了 + Versions.Add(Release) + Versions.Remove("1.20") + End If + End If + Next + + Loader.Output = New DlNeoForgeListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Versions} + End Sub #End Region #Region "DlNeoForgeVersion | NeoForge 版本列表" @@ -907,7 +923,7 @@ ''' ''' NeoForge 版本列表,主加载器。 ''' - Public Sub DlNeoForgeVersionMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) 'BMCLAPI 不会返回完整的 NeoForge 版本列表,而貌似也没有办法获取 NeoForge 支持的所有 Minecraft 版本 + 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) Select Case Setup.Get("ToolDownloadVersion") @@ -935,7 +951,6 @@ Public Sub DlNeoForgeVersionOfficialMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) Dim ResultLatest As String Dim ResultLegacy As String - Dim ResultJson As String Dim ResultLatestJson As JObject Dim ResultLegacyJson As JObject Dim VersionsJArray As JArray @@ -996,7 +1011,9 @@ Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex) End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") - Loader.Output = Versions + Dim VersionsArray = Versions.ToList() + VersionsArray.Reverse() + Loader.Output = VersionsArray End Sub ''' @@ -1026,7 +1043,9 @@ Throw New Exception("版本列表解析失败(" & Json.ToString & ")", ex) End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") - Loader.Output = Versions + Dim VersionsArray = Versions.ToList() + VersionsArray.Reverse() + Loader.Output = VersionsArray End Sub #End Region diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index f6d2f4e..bd9674f 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2191,7 +2191,9 @@ Retry: Dim FreshStableVersion As DlNeoForgeVersionEntry = Nothing Dim FreshBetaVersion As DlNeoForgeVersionEntry = Nothing If Entrys.Any Then - For Each Entry In Entrys + Dim VersionsArray = Entrys.ToList() + VersionsArray.Reverse() + For Each Entry In VersionsArray If Entry.IsBeta Then FreshBetaVersion = Entry Else diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 6fd4e6e..a58d4cb 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -974,11 +974,8 @@ If Not Loader.Output.Any() Then Exit Sub PanNeoForge.Children.Clear() - Dim VersionsArray As Array = Versions.ToArray() - VersionsArray.Reverse(VersionsArray) - 'Versions = Sort(Versions, Function(a, b) New Version(a.Version) > New Version(b.Version)).ToList NeoForgeDownloadListItemPreload(PanNeoForge, Versions, AddressOf NeoForge_Selected, False) - For Each Version In VersionsArray + For Each Version In Versions PanNeoForge.Children.Add(NeoForgeDownloadListItem(Version, AddressOf NeoForge_Selected, False)) Next Catch ex As Exception From ee10caa84e3ce3dacc9546d57330e54bb07a1335 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Wed, 26 Jun 2024 23:55:58 +0800 Subject: [PATCH 57/87] =?UTF-8?q?fix:=20NeoForge=20=E5=AE=98=E6=96=B9?= =?UTF-8?q?=E6=BA=90=E4=B8=8D=E5=8F=AF=E7=94=A8=20chores:=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 45006dc..257551e 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -981,21 +981,19 @@ For Each Token As String In VersionsJArray Dim StdVersion As String Dim IsBeta As Boolean - Dim rawVersion As String = Token.ToString() + Dim rawVersion As String = Token If rawVersion.Contains("-beta") Then - StdVersion = Token.ToString().Replace("neoforge-", "").Replace("-beta", "") + StdVersion = Token.Replace("neoforge-", "").Replace("-beta", "") IsBeta = True Else - StdVersion = Token.ToString().Replace("neoforge-", "") + StdVersion = Token.Replace("neoforge-", "") IsBeta = False End If - Dim Inherit As String = "1." & StdVersion.ToString().Split(".")(0) & "." & StdVersion.ToString().Split(".")(1) - If Inherit.EndsWith(".0") Then - Inherit = Inherit.Replace(".0", "") - End If + Dim Inherit As String = "1." & StdVersion.Split(".")(0) & "." & StdVersion.Split(".")(1) + Inherit = Inherit.Replace(".0", "") Dim Entry = New DlNeoForgeVersionEntry If Loader.Input IsNot Nothing Then - If Inherit Is Loader.Input Then + If Inherit Is Loader.Input.ToString() Then Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} Versions.Add(Entry) Continue For From 6efaa0961658575e1b639aa17a73c67f87798d4f Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Thu, 27 Jun 2024 08:04:09 +0800 Subject: [PATCH 58/87] =?UTF-8?q?fix:=20=E5=AE=98=E6=96=B9=E6=BA=90?= =?UTF-8?q?=E6=80=BB=E6=98=AF=20Fallback=20=E5=88=B0=20BMCLAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 257551e..6a8e4b2 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -993,11 +993,15 @@ Inherit = Inherit.Replace(".0", "") Dim Entry = New DlNeoForgeVersionEntry If Loader.Input IsNot Nothing Then - If Inherit Is Loader.Input.ToString() Then + If Inherit.Contains(Loader.Input.ToString().Replace("1.", "")) Then Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Hint(Entry.StdVersion) + Log(Entry.StdVersion) Versions.Add(Entry) Continue For Else + Hint("匹配失败: " & Inherit & " 但是请求的版本是 " & Loader.Input.ToString()) + Log("匹配失败: " & Inherit & " 但是请求的版本是 " & Loader.Input.ToString()) Continue For End If End If From ac6ed8d9865fb2047812ae033afbbe981305f142 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Thu, 27 Jun 2024 08:05:06 +0800 Subject: [PATCH 59/87] chores: Clean up --- Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 6a8e4b2..3d4c5d4 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -995,13 +995,9 @@ If Loader.Input IsNot Nothing Then If Inherit.Contains(Loader.Input.ToString().Replace("1.", "")) Then Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} - Hint(Entry.StdVersion) - Log(Entry.StdVersion) Versions.Add(Entry) Continue For Else - Hint("匹配失败: " & Inherit & " 但是请求的版本是 " & Loader.Input.ToString()) - Log("匹配失败: " & Inherit & " 但是请求的版本是 " & Loader.Input.ToString()) Continue For End If End If From 1b53489cf3a37cc987ab2d6af03d2116310cebf4 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Thu, 27 Jun 2024 14:09:31 +0800 Subject: [PATCH 60/87] =?UTF-8?q?fix:=20BMCLAPI=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=9A=84=20Neo=20=E5=88=97=E8=A1=A8=E6=97=B6?= =?UTF-8?q?=E4=BC=9A=E6=84=8F=E5=A4=96=E7=9A=84=E5=8C=85=E5=90=AB=201.20?= =?UTF-8?q?=20fix:=20NeoForge=201.20.1=20=E5=AE=98=E6=96=B9=E6=BA=90?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=88=97=E8=A1=A8=E4=B8=8D=E8=83=BD=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 25 +++++++++++-------- .../Pages/PageDownload/ModDownloadLib.vb | 1 + 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 3d4c5d4..8f238e9 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -822,9 +822,8 @@ For Each Release In ClientReleases If Int(Release.Split(".")(1)) > 19 Then '如果游戏版本低于 1.20 就不进行请求 Dim Json As String = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/neoforge/list/" & Release) - If Json IsNot "[]" Then '如果这个版本不支持 NeoForge,BMCLAPI 会直接返回一个空的 Json 序列,这里直接用字符串处理了 + If Not Json.Contains("[]") Then '如果这个版本不支持 NeoForge,BMCLAPI 会直接返回一个空的 Json 序列,这里直接用字符串处理了 Versions.Add(Release) - Versions.Remove("1.20") End If End If Next @@ -954,6 +953,7 @@ Dim ResultLatestJson As JObject Dim ResultLegacyJson As JObject Dim VersionsJArray As JArray + Dim IsLegacyNeo As Boolean = False Try ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) ResultLegacy = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/forge", UseBrowserUserAgent:=True) @@ -968,8 +968,9 @@ ResultLatestJson = GetJson(ResultLatest) ResultLegacyJson = GetJson(ResultLegacy) If Loader.Input IsNot Nothing Then - If Loader.Input Is "1.20.1" Then + If Loader.Input.ToString().Contains("1.20.1") Then VersionsJArray = ResultLegacyJson("versions") + IsLegacyNeo = True Else VersionsJArray = ResultLatestJson("versions") End If @@ -983,26 +984,30 @@ Dim IsBeta As Boolean Dim rawVersion As String = Token If rawVersion.Contains("-beta") Then - StdVersion = Token.Replace("neoforge-", "").Replace("-beta", "") + StdVersion = Token.Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") IsBeta = True Else - StdVersion = Token.Replace("neoforge-", "") + StdVersion = Token.Replace("neoforge-", "").Replace("1.20.1-", "") IsBeta = False End If Dim Inherit As String = "1." & StdVersion.Split(".")(0) & "." & StdVersion.Split(".")(1) Inherit = Inherit.Replace(".0", "") + If IsLegacyNeo Then Inherit = "1.20.1" Dim Entry = New DlNeoForgeVersionEntry If Loader.Input IsNot Nothing Then - If Inherit.Contains(Loader.Input.ToString().Replace("1.", "")) Then + If IsLegacyNeo Then Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} Versions.Add(Entry) - Continue For Else - Continue For + If Inherit.Contains(Loader.Input.ToString().Replace("1.", "")) Then + Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Versions.Add(Entry) + End If End If + Else + Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Versions.Add(Entry) End If - Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} - Versions.Add(Entry) Next Catch ex As Exception MyMsgBox(ex.ToString(), "错误") diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index bd9674f..ee623b2 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2197,6 +2197,7 @@ Retry: If Entry.IsBeta Then FreshBetaVersion = Entry Else + If Entry.StdVersion.Contains("47.1.82") Then Continue For FreshStableVersion = Entry End If Next From b61081fad9152275ceb2e96c8b30ec5825d8d071 Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 27 Jun 2024 18:30:47 +0800 Subject: [PATCH 61/87] =?UTF-8?q?:ok=5Fhand:=20=E4=BF=AE=E6=94=B9=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E9=BE=99=E7=8C=AB=E7=9A=84=E5=AE=A1=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Icons/{NeoForged.png => NeoForge.png} | Bin .../Modules/Minecraft/ModDownload.vb | 62 ++++++++---------- .../Modules/Minecraft/ModMinecraft.vb | 3 +- .../Pages/PageDownload/ModDownloadLib.vb | 54 +++++++-------- .../PageDownload/PageDownloadInstall.xaml | 2 +- .../PageDownload/PageDownloadInstall.xaml.vb | 8 +-- .../Pages/PageVersion/PageVersionOverall.xaml | 2 +- Plain Craft Launcher 2/Resources/Custom.xaml | 2 +- 8 files changed, 63 insertions(+), 70 deletions(-) rename Plain Craft Launcher 2/Images/Icons/{NeoForged.png => NeoForge.png} (100%) diff --git a/Plain Craft Launcher 2/Images/Icons/NeoForged.png b/Plain Craft Launcher 2/Images/Icons/NeoForge.png similarity index 100% rename from Plain Craft Launcher 2/Images/Icons/NeoForged.png rename to Plain Craft Launcher 2/Images/Icons/NeoForge.png diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 8f238e9..1d5f353 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -770,7 +770,7 @@ Dim ResultLatest As String Dim VersionsJArray As JArray Try - ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) + ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True, IsJson:=True) Catch ex As Exception If GetExceptionSummary(ex).Contains("(404)") Then Throw New Exception("没有可用版本") @@ -780,24 +780,19 @@ End Try If ResultLatest.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") VersionsJArray = GetJson(ResultLatest)("versions") - Dim Versions As List(Of String) = New List(Of String) + Dim Versions As New List(Of String) Versions.Add("1.20.1") Try For Each Token As String In VersionsJArray - Dim Version As String = Token.ToString().Replace("neoforge-", "") - Dim Inherit As String = "1." & Version.ToString().Split(".")(0) & "." & Token.ToString().Split(".")(1) - If Inherit.EndsWith(".0") Then - Inherit = Inherit.Replace(".0", "") - End If - If Versions.Contains(Inherit) Then - Continue For - Else - Versions.Add(Inherit) - End If + Dim Version As String = Token.Replace("neoforge-", "") + Dim Inherit As String = $"1.{Version.ToString().Split(".")(0)}.{Token.ToString().Split(".")(1)}" + If Inherit.EndsWith(".0") Then Inherit = Inherit.Replace(".0", "") + Versions.Add(Inherit) Next + Versions.Distinct() '去重 Catch ex As Exception - MyMsgBox(ex.ToString(), "错误") - Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex) + Log(ex, LogLevel.Feedback) + 'Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex) End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", .Value = Versions} @@ -808,11 +803,11 @@ ''' Public DlNeoForgeListBmclapiLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Bmclapi", AddressOf DlNeoForgeListBmclapiMain) Private Sub DlNeoForgeListBmclapiMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) - Dim Versions As List(Of String) = New List(Of String) - Dim ClientVersions As JArray = DlClientListLoader.Output.Value("versions") 'BMCLAPI 不能返回所有 NeoForge 版本,获取 MC 版本列表进行遍历 - Dim ClientReleases As List(Of String) = New List(Of String) + Dim Versions As New List(Of String) + Dim ClientVersions As JArray = DlClientListLoader.Output.Value("versions") 'BMCLAPI 不能返回所有 NeoForge 版本,获取 MC 版本列表进行遍历 + Dim ClientReleases As New List(Of String) - For Each Client In ClientVersions '排除快照版或远古版等特殊版本 + For Each Client In ClientVersions '排除快照版或远古版等特殊版本 Dim ClientVersionString = Client("id").ToString() If Not (ClientVersionString.ContainsF("a") OrElse ClientVersionString.ContainsF("b") OrElse ClientVersionString.ContainsF("c") OrElse ClientVersionString.ContainsF("w") OrElse ClientVersionString.ContainsF("pre") OrElse ClientVersionString.ContainsF("Pre") OrElse ClientVersionString.ContainsF("rc") OrElse ClientVersionString.ContainsF("b") OrElse ClientVersionString.ContainsF("rd") OrElse ClientVersionString.ContainsF("inf")) Then ClientReleases.Add(ClientVersionString) @@ -820,11 +815,10 @@ Next For Each Release In ClientReleases - If Int(Release.Split(".")(1)) > 19 Then '如果游戏版本低于 1.20 就不进行请求 - Dim Json As String = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/neoforge/list/" & Release) - If Not Json.Contains("[]") Then '如果这个版本不支持 NeoForge,BMCLAPI 会直接返回一个空的 Json 序列,这里直接用字符串处理了 - Versions.Add(Release) - End If + If Int(Release.Split(".")(1)) <= 19 Then Continue For '如果游戏版本低于 1.20 就不进行请求 + Dim Json As String = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/neoforge/list/" & Release) + If Not Json.Contains("[]") Then '如果这个版本不支持 NeoForge,BMCLAPI 会直接返回一个空的 Json 序列,这里直接用字符串处理了 + Versions.Add(Release) End If Next @@ -838,7 +832,7 @@ ''' ''' 完整的版本名,如 “neoforge-20.4.30-beta”。 ''' - Public Version As String + Public VersionName As String ''' ''' 对应的 Minecraft 版本,如“1.12.2”。 ''' @@ -866,7 +860,7 @@ ''' ''' 标准的版本号,如 “20.4.30”。 ''' - Public StdVersion As String + Public VersionCode As String Public Structure DlNeoForgeListResult ''' ''' 数据来源名称,如“Official”,“BMCLAPI”。 @@ -886,7 +880,7 @@ ''' Public ReadOnly Property Build As Integer Get - Dim Version = Me.Version.Split(".") + Dim Version = Me.VersionName.Split(".") If Version(0) < 15 Then Return Version(Version.Count - 1) Else @@ -899,7 +893,7 @@ ''' Public ReadOnly Property FileVersion As String Get - Return Version & If(Branch Is Nothing, "", "-" & Branch) + Return VersionName & If(Branch Is Nothing, "", "-" & Branch) End Get End Property ''' @@ -907,10 +901,10 @@ ''' Public ReadOnly Property FileName As String Get - If StdVersion.StartsWith("47.") Then 'NeoForge 1.20.1 的版本命名有些特殊... - Return "forge-" & "1.20.1" & "-" & StdVersion & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" + If VersionCode.StartsWith("47.") Then 'NeoForge 1.20.1 的版本命名有些特殊... + Return "forge-" & "1.20.1" & "-" & VersionCode & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" Else - Return "neoforge-" & StdVersion & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" + Return "neoforge-" & VersionCode & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" End If End Get End Property @@ -996,16 +990,16 @@ Dim Entry = New DlNeoForgeVersionEntry If Loader.Input IsNot Nothing Then If IsLegacyNeo Then - Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Entry = New DlNeoForgeVersionEntry With {.VersionName = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .VersionCode = StdVersion} Versions.Add(Entry) Else If Inherit.Contains(Loader.Input.ToString().Replace("1.", "")) Then - Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Entry = New DlNeoForgeVersionEntry With {.VersionName = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .VersionCode = StdVersion} Versions.Add(Entry) End If End If Else - Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Entry = New DlNeoForgeVersionEntry With {.VersionName = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .VersionCode = StdVersion} Versions.Add(Entry) End If Next @@ -1038,7 +1032,7 @@ IsBeta = False End If Dim Inherit As String = Token("mcversion") - Dim Entry = New DlNeoForgeVersionEntry With {.Version = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .StdVersion = StdVersion} + Dim Entry = New DlNeoForgeVersionEntry With {.VersionName = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .VersionCode = StdVersion} Versions.Add(Entry) Next Catch ex As Exception diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index 930e47a..620134d 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -1,5 +1,4 @@ Imports System.IO.Compression -Imports MS.Internal Public Module ModMinecraft @@ -762,7 +761,7 @@ ExitDataLoad: Case McVersionState.Forge Logo = PathImage & "Blocks/Anvil.png" Case McVersionState.NeoForge - Logo = PathImage & "Icons/NeoForged.png" + Logo = PathImage & "Icons/NeoForge.png" Case McVersionState.Fabric Logo = PathImage & "Blocks/Fabric.png" Case McVersionState.OptiFine diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index ee623b2..bbe980a 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1700,10 +1700,10 @@ Retry: Public Sub McDownloadNeoForge(DownloadInfo As DlNeoForgeVersionEntry) '初始化参数 - Dim Id As String = DownloadInfo.Inherit & "-neoforge-" & DownloadInfo.Version - Dim Target As String = PathTemp & "Cache\Code\NeoForgeInstall-" & DownloadInfo.Version & "_" & GetUuid() & "." & DownloadInfo.FileSuffix + Dim Id As String = DownloadInfo.Inherit & "-neoforge-" & DownloadInfo.VersionName + Dim Target As String = PathTemp & "Cache\Code\NeoForgeInstall-" & DownloadInfo.VersionName & "_" & GetUuid() & "." & DownloadInfo.FileSuffix Dim VersionFolder As String = PathMcFolder & "versions\" & Id & "\" - Dim DisplayName As String = "NeoForge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version + Dim DisplayName As String = "NeoForge " & DownloadInfo.Inherit & " - " & DownloadInfo.VersionName Try '重复任务检查 @@ -1727,7 +1727,7 @@ Retry: End If '启动 - Dim Loader As New LoaderCombo(Of String)(DisplayName & " 下载", McDownloadNeoForgeLoader(DownloadInfo.Version, DownloadInfo.Inherit, DownloadInfo)) With {.OnStateChanged = AddressOf McInstallState} + Dim Loader As New LoaderCombo(Of String)(DisplayName & " 下载", McDownloadNeoForgeLoader(DownloadInfo.VersionName, DownloadInfo.Inherit, DownloadInfo)) With {.OnStateChanged = AddressOf McInstallState} Loader.Start(VersionFolder) LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() @@ -1746,7 +1746,7 @@ Retry: Public Sub McDownloadNeoForgeSave(DownloadInfo As DlNeoForgeVersionEntry) Try Dim Target As String = SelectAs("选择保存位置", DownloadInfo.FileName, "NeoForge 文件 (*." & DownloadInfo.FileSuffix & ")|*." & DownloadInfo.FileSuffix) - Dim DisplayName As String = "NeoForge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version + Dim DisplayName As String = "NeoForge " & DownloadInfo.Inherit & " - " & DownloadInfo.VersionName If Not Target.Contains("\") Then Exit Sub '重复任务检查 @@ -1765,15 +1765,15 @@ Retry: 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) - If DownloadInfo.StdVersion.StartsWith("47.") Then '1.20.1 NeoForge 下载地址不同 + If DownloadInfo.VersionCode.StartsWith("47.") Then '1.20.1 NeoForge 下载地址不同 Files.Add(New NetFile({ - "https://bmclapi2.bangbang93.com/maven/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.StdVersion & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, - "https://maven.neoforged.net/releases/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.StdVersion & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName + "https://bmclapi2.bangbang93.com/maven/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, + "https://maven.neoforged.net/releases/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) Else Files.Add(New NetFile({ - "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 + "https://bmclapi2.bangbang93.com/maven/net/neoforged/neoforge/" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, + "https://maven.neoforged.net/releases/net/neoforged/neoforge/" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) End If Task.Output = Files @@ -1963,22 +1963,22 @@ Retry: McFolder = If(McFolder, PathMcFolder) If DownloadRawInfo Is Nothing Then '兜底,有的时候 DownloadInfo 可能是空的 If Version.Contains("-beta") Then - DownloadInfo.Version = Version + DownloadInfo.VersionName = Version Version = Version.Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") - DownloadInfo.StdVersion = Version + DownloadInfo.VersionCode = Version DownloadInfo.IsBeta = True Else - DownloadInfo.Version = Version + DownloadInfo.VersionName = Version Version = Version.Replace("neoforge-", "").Replace("1.20.1-", "") - DownloadInfo.StdVersion = Version + DownloadInfo.VersionCode = Version DownloadInfo.IsBeta = False End If Else DownloadInfo = DownloadRawInfo - Version = DownloadInfo.StdVersion + Version = DownloadInfo.VersionCode End If Dim IsCustomFolder As Boolean = McFolder <> PathMcFolder - Dim Id As String = DownloadInfo.Version + Dim Id As String = DownloadInfo.VersionName 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 @@ -1995,7 +1995,7 @@ Retry: Task.Progress = 0.8 '查找对应版本 For Each NeoForgeVersion In NeoForgeLoader.Output - If NeoForgeVersion.Version = Version Then + If NeoForgeVersion.VersionName = Version Then DownloadInfo = NeoForgeVersion Exit Sub End If @@ -2012,16 +2012,16 @@ Retry: ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, Inherit) End If Dim Files - If DownloadInfo.StdVersion.StartsWith("47.") Then '1.20.1 NeoForge 下载地址不同 + If DownloadInfo.VersionCode.StartsWith("47.") Then '1.20.1 NeoForge 下载地址不同 Dim FilesLegacy As New List(Of NetFile) From {New NetFile({ - "https://bmclapi2.bangbang93.com/maven/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.StdVersion & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, - "https://maven.neoforged.net/releases/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.StdVersion & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName + "https://bmclapi2.bangbang93.com/maven/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, + "https://maven.neoforged.net/releases/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))} Files = FilesLegacy Else Dim FilesLatest As New List(Of NetFile) From {New NetFile({ - "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 + "https://bmclapi2.bangbang93.com/maven/net/neoforged/neoforge/" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, + "https://maven.neoforged.net/releases/net/neoforged/neoforge/" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))} Files = FilesLatest End If @@ -2197,7 +2197,7 @@ Retry: If Entry.IsBeta Then FreshBetaVersion = Entry Else - If Entry.StdVersion.Contains("47.1.82") Then Continue For + If Entry.VersionCode.Contains("47.1.82") Then Continue For FreshStableVersion = Entry End If Next @@ -2221,12 +2221,12 @@ 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.StdVersion & "-beta", Entry.StdVersion), .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, + .Title = If(Entry.IsBeta, Entry.VersionCode & "-beta", Entry.VersionCode), .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, .Info = If(Entry.IsBeta, "测试版", "稳定版") & If(Entry.ReleaseTime = "", 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 & "Icons/NeoForged.png" + .Logo = PathImage & "Icons/NeoForge.png" } AddHandler NewItem.Click, OnClick '建立菜单 @@ -2268,7 +2268,7 @@ Retry: Else Version = sender.Parent.Parent.Tag End If - OpenWebsite("https://maven.neoforged.net/releases/net/neoforged/neoforge/" & Version.StdVersion & "/" & Version.Version & "-changelog.txt") + OpenWebsite("https://maven.neoforged.net/releases/net/neoforged/neoforge/" & Version.VersionCode & "/" & Version.VersionName & "-changelog.txt") End Sub Public Sub NeoForgeSave_Click(sender As Object, e As RoutedEventArgs) Dim Version As DlNeoForgeVersionEntry @@ -2597,7 +2597,7 @@ Retry: 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.NeoForgeEntry IsNot Nothing Then Request.NeoForgeVersion = If(Request.NeoForgeVersion, Request.NeoForgeEntry.VersionName) If Request.NeoForgeVersion IsNot Nothing Then NeoForgeFolder = TempMcFolder & "versions\" & If(Request.NeoForgeVersion.StartsWithF("1.20.1") OrElse Request.NeoForgeVersion.StartsWithF("47."), "1.20.1-forge-", "") & Request.NeoForgeVersion.Replace("1.20.1-forge-", "").Replace("1.20.1-", "") Dim FabricFolder As String = Nothing If Request.FabricVersion IsNot Nothing Then FabricFolder = TempMcFolder & "versions\fabric-loader-" & Request.FabricVersion & "-" & Request.MinecraftName diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml index b16b864..9676cfa 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 a58d4cb..a2ff68d 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -384,7 +384,7 @@ Else BtnNeoForgeClear.Visibility = Visibility.Visible ImgNeoForge.Visibility = Visibility.Visible - LabNeoForge.Text = SelectedNeoForge.StdVersion & If(SelectedNeoForge.IsBeta, "-beta", "") + LabNeoForge.Text = SelectedNeoForge.VersionCode & If(SelectedNeoForge.IsBeta, "-beta", "") LabNeoForge.Foreground = ColorGray1 End If 'Fabric @@ -499,7 +499,7 @@ Name += "-Forge_" & SelectedForge.Version End If If SelectedNeoForge IsNot Nothing Then - Name += "-NeoForge_" & SelectedNeoForge.StdVersion & If(SelectedNeoForge.IsBeta, "-beta", "") + Name += "-NeoForge_" & SelectedNeoForge.VersionCode & 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.StdVersion & If(SelectedNeoForge.IsBeta, "-beta", "") + Info += ", NeoForge " & SelectedNeoForge.VersionCode & If(SelectedNeoForge.IsBeta, "-beta", "") End If If SelectedLiteLoader IsNot Nothing Then Info += ", LiteLoader" @@ -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/Icons/NeoForged.png" + Return "pack://application:,,,/images/Icons/NeoForge.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 50b7b9f..4f0ad73 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml @@ -37,7 +37,7 @@ - + diff --git a/Plain Craft Launcher 2/Resources/Custom.xaml b/Plain Craft Launcher 2/Resources/Custom.xaml index f0236e4..1d5bb85 100644 --- a/Plain Craft Launcher 2/Resources/Custom.xaml +++ b/Plain Craft Launcher 2/Resources/Custom.xaml @@ -202,7 +202,7 @@ - + Date: Thu, 27 Jun 2024 19:43:39 +0800 Subject: [PATCH 62/87] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Images/{Icons => Blocks}/NeoForge.png | Bin .../Modules/Minecraft/ModDownload.vb | 76 +++++------------- .../Modules/Minecraft/ModMinecraft.vb | 20 ++--- .../Pages/PageDownload/ModDownloadLib.vb | 29 +++---- .../PageDownload/PageDownloadInstall.xaml | 2 +- .../PageDownload/PageDownloadInstall.xaml.vb | 3 +- .../Pages/PageVersion/PageVersionOverall.xaml | 2 +- .../Plain Craft Launcher 2.vbproj | 2 +- Plain Craft Launcher 2/Resources/Custom.xaml | 2 +- 9 files changed, 42 insertions(+), 94 deletions(-) rename Plain Craft Launcher 2/Images/{Icons => Blocks}/NeoForge.png (100%) diff --git a/Plain Craft Launcher 2/Images/Icons/NeoForge.png b/Plain Craft Launcher 2/Images/Blocks/NeoForge.png similarity index 100% rename from Plain Craft Launcher 2/Images/Icons/NeoForge.png rename to Plain Craft Launcher 2/Images/Blocks/NeoForge.png diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 1d5f353..43d683e 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -785,14 +785,16 @@ Try For Each Token As String In VersionsJArray Dim Version As String = Token.Replace("neoforge-", "") - Dim Inherit As String = $"1.{Version.ToString().Split(".")(0)}.{Token.ToString().Split(".")(1)}" + Dim Inherit As String = $"1.{Version.Split(".")(0)}.{Token.Split(".")(1)}" If Inherit.EndsWith(".0") Then Inherit = Inherit.Replace(".0", "") - Versions.Add(Inherit) + If Versions.Contains(Inherit) Then + Continue For + Else + Versions.Add(Inherit) + End If Next - Versions.Distinct() '去重 Catch ex As Exception Log(ex, LogLevel.Feedback) - 'Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex) End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", .Value = Versions} @@ -808,9 +810,8 @@ Dim ClientReleases As New List(Of String) For Each Client In ClientVersions '排除快照版或远古版等特殊版本 - Dim ClientVersionString = Client("id").ToString() - If Not (ClientVersionString.ContainsF("a") OrElse ClientVersionString.ContainsF("b") OrElse ClientVersionString.ContainsF("c") OrElse ClientVersionString.ContainsF("w") OrElse ClientVersionString.ContainsF("pre") OrElse ClientVersionString.ContainsF("Pre") OrElse ClientVersionString.ContainsF("rc") OrElse ClientVersionString.ContainsF("b") OrElse ClientVersionString.ContainsF("rd") OrElse ClientVersionString.ContainsF("inf")) Then - ClientReleases.Add(ClientVersionString) + If RegexCheck(Client("id").ToString(), "[0,9.]+") Then + ClientReleases.Add(Client("id").ToString()) End If Next @@ -846,10 +847,6 @@ ''' Public Hash As String = Nothing ''' - ''' 安装类型。有 installer、client、universal 三种。 - ''' - Public Category As String - ''' ''' 版本分支。若无分支则为 Nothing。 ''' Public Branch As String = Nothing @@ -876,19 +873,6 @@ Public Value As JObject End Structure ''' - ''' 构建数。 - ''' - Public ReadOnly Property Build As Integer - Get - Dim Version = Me.VersionName.Split(".") - If Version(0) < 15 Then - Return Version(Version.Count - 1) - Else - Return Version(Version.Count - 1) + 10000 - End If - End Get - End Property - ''' ''' 用于下载的文件版本名。可能在 Version 的基础上添加了分支。 ''' Public ReadOnly Property FileVersion As String @@ -908,10 +892,6 @@ End If End Get End Property - ''' - ''' 文件扩展名。 - ''' - Public FileSuffix As String = "jar" End Class ''' ''' NeoForge 版本列表,主加载器。 @@ -944,13 +924,9 @@ Public Sub DlNeoForgeVersionOfficialMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) Dim ResultLatest As String Dim ResultLegacy As String - Dim ResultLatestJson As JObject - Dim ResultLegacyJson As JObject - Dim VersionsJArray As JArray - Dim IsLegacyNeo As Boolean = False Try - ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True) - ResultLegacy = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/forge", UseBrowserUserAgent:=True) + ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True, IsJson:=True) + ResultLegacy = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/forge", UseBrowserUserAgent:=True, IsJson:=True) Catch ex As Exception If GetExceptionSummary(ex).Contains("(404)") Then Throw New Exception("没有可用版本") @@ -959,15 +935,13 @@ End If End Try If ResultLatest.Length < 50 AndAlso ResultLegacy.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") - ResultLatestJson = GetJson(ResultLatest) - ResultLegacyJson = GetJson(ResultLegacy) - If Loader.Input IsNot Nothing Then - If Loader.Input.ToString().Contains("1.20.1") Then - VersionsJArray = ResultLegacyJson("versions") - IsLegacyNeo = True - Else - VersionsJArray = ResultLatestJson("versions") - End If + Dim ResultLatestJson As JObject = GetJson(ResultLatest) + Dim ResultLegacyJson As JObject = GetJson(ResultLegacy) + Dim VersionsJArray As JArray + Dim IsLegacyNeo As Boolean = False + If Loader.Input IsNot Nothing AndAlso Loader.Input.ToString().Contains("1.20.1") Then + VersionsJArray = ResultLegacyJson("versions") + IsLegacyNeo = True Else VersionsJArray = ResultLatestJson("versions") End If @@ -984,19 +958,14 @@ StdVersion = Token.Replace("neoforge-", "").Replace("1.20.1-", "") IsBeta = False End If - Dim Inherit As String = "1." & StdVersion.Split(".")(0) & "." & StdVersion.Split(".")(1) - Inherit = Inherit.Replace(".0", "") - If IsLegacyNeo Then Inherit = "1.20.1" + Dim Inherit As String = $"1.{StdVersion.Split(".")(0)}.{StdVersion.Split(".")(1)}" + If Inherit.EndsWithF(".0") Then Inherit.Remove(Inherit.LastIndexOfF(".0"), 1) + Inherit = If(IsLegacyNeo, "1.20.1", Inherit) Dim Entry = New DlNeoForgeVersionEntry If Loader.Input IsNot Nothing Then - If IsLegacyNeo Then + If IsLegacyNeo OrElse Inherit.Contains(Loader.Input.ToString().Replace("1.", "")) Then Entry = New DlNeoForgeVersionEntry With {.VersionName = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .VersionCode = StdVersion} Versions.Add(Entry) - Else - If Inherit.Contains(Loader.Input.ToString().Replace("1.", "")) Then - Entry = New DlNeoForgeVersionEntry With {.VersionName = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .VersionCode = StdVersion} - Versions.Add(Entry) - End If End If Else Entry = New DlNeoForgeVersionEntry With {.VersionName = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .VersionCode = StdVersion} @@ -1004,8 +973,7 @@ End If Next Catch ex As Exception - MyMsgBox(ex.ToString(), "错误") - Throw New Exception("版本列表解析失败(" & VersionsJArray.ToString & ")", ex) + Log(ex, LogLevel.Feedback) End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") Dim VersionsArray = Versions.ToList() diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index 620134d..676d5b1 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -761,7 +761,7 @@ ExitDataLoad: Case McVersionState.Forge Logo = PathImage & "Blocks/Anvil.png" Case McVersionState.NeoForge - Logo = PathImage & "Icons/NeoForge.png" + Logo = PathImage & "Blocks/NeoForge.png" Case McVersionState.Fabric Logo = PathImage & "Blocks/Fabric.png" Case McVersionState.OptiFine @@ -979,25 +979,15 @@ ExitDataLoad: Else Throw New Exception("无效的 Fabric 版本:" & ForgeVersion) End If - ElseIf HasForge Then - If ForgeVersion = "未知版本" Then Return 0 - Dim SubVersions = ForgeVersion.Split(".") + ElseIf HasForge OrElse HasNeoForge Then + If ForgeVersion = "未知版本" AndAlso NeoForgeVersion = "未知版本" Then Return 0 + Dim SubVersions = If(HasForge, ForgeVersion.Split("."), 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("无效的 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) + Throw New Exception(If(HasForge, "无效的 Forge 版本:" & ForgeVersion, "无效的 NeoForge 版本:" & NeoForgeVersion)) End If ElseIf HasOptiFine Then If OptiFineVersion = "未知版本" Then Return 0 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index bbe980a..b63f82a 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1701,7 +1701,7 @@ Retry: Public Sub McDownloadNeoForge(DownloadInfo As DlNeoForgeVersionEntry) '初始化参数 Dim Id As String = DownloadInfo.Inherit & "-neoforge-" & DownloadInfo.VersionName - Dim Target As String = PathTemp & "Cache\Code\NeoForgeInstall-" & DownloadInfo.VersionName & "_" & GetUuid() & "." & DownloadInfo.FileSuffix + Dim Target As String = PathTemp & "Cache\Code\NeoForgeInstall-" & DownloadInfo.VersionName & "_" & GetUuid() & ".jar" Dim VersionFolder As String = PathMcFolder & "versions\" & Id & "\" Dim DisplayName As String = "NeoForge " & DownloadInfo.Inherit & " - " & DownloadInfo.VersionName Try @@ -1745,7 +1745,7 @@ Retry: End Sub Public Sub McDownloadNeoForgeSave(DownloadInfo As DlNeoForgeVersionEntry) Try - Dim Target As String = SelectAs("选择保存位置", DownloadInfo.FileName, "NeoForge 文件 (*." & DownloadInfo.FileSuffix & ")|*." & DownloadInfo.FileSuffix) + Dim Target As String = SelectAs("选择保存位置", DownloadInfo.FileName, "NeoForge 文件 (*.jar)") Dim DisplayName As String = "NeoForge " & DownloadInfo.Inherit & " - " & DownloadInfo.VersionName If Not Target.Contains("\") Then Exit Sub @@ -2011,20 +2011,11 @@ Retry: If IsCustomFolder Then Throw New Exception("如果没有指定原版下载器,则不能指定 MC 安装文件夹") ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, Inherit) End If - Dim Files - If DownloadInfo.VersionCode.StartsWith("47.") Then '1.20.1 NeoForge 下载地址不同 - Dim FilesLegacy As New List(Of NetFile) From {New NetFile({ - "https://bmclapi2.bangbang93.com/maven/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, - "https://maven.neoforged.net/releases/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName + Dim IsLegacyNeo As Boolean = DownloadInfo.VersionCode.StartsWith("47.") + Dim Files As New List(Of NetFile) From {New NetFile({ + $"https://bmclapi2.bangbang93.com/maven/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}", + $"https://maven.neoforged.net/releases/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}" }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))} - Files = FilesLegacy - Else - Dim FilesLatest As New List(Of NetFile) From {New NetFile({ - "https://bmclapi2.bangbang93.com/maven/net/neoforged/neoforge/" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, - "https://maven.neoforged.net/releases/net/neoforged/neoforge/" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName - }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))} - Files = FilesLatest - End If Task.Output = Files End Sub) With {.ProgressWeight = 0.5, .Show = False}) Loaders.Add(New LoaderDownload("下载 NeoForge 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) @@ -2224,9 +2215,9 @@ Retry: .Title = If(Entry.IsBeta, Entry.VersionCode & "-beta", Entry.VersionCode), .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, .Info = If(Entry.IsBeta, "测试版", "稳定版") & If(Entry.ReleaseTime = "", - 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 & "Icons/NeoForge.png" + If(ModeDebug, If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), ""), + "发布于 " & Entry.ReleaseTime & If(ModeDebug, If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), "")), + .Logo = PathImage & "Blocks/NeoForge.png" } AddHandler NewItem.Click, OnClick '建立菜单 @@ -2559,7 +2550,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 Or Request.NeoForgeEntry IsNot Nothing) Then + If PathTemp.Contains(" ") AndAlso (Request.ForgeEntry IsNot Nothing OrElse Request.NeoForgeEntry IsNot Nothing) Then PathInstallTemp = OsDrive & "ProgramData\PCL\Install\" Else PathInstallTemp = PathTemp & "Install\" diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml index 9676cfa..1cf0a2d 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 a2ff68d..1adeb06 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/Icons/NeoForge.png" + Return "pack://application:,,,/images/Blocks/NeoForge.png" ElseIf SelectedLiteLoader IsNot Nothing Then Return "pack://application:,,,/images/Blocks/Egg.png" ElseIf SelectedOptiFine IsNot Nothing Then @@ -946,7 +946,6 @@ End If If Loader.State <> LoadState.Finished Then Return "获取版本列表失败:未知错误,状态为 " & GetStringFromEnum(Loader.State) For Each Version In Loader.Output - If Version.Category = "universal" OrElse Version.Category = "client" Then Continue For '跳过无法自动安装的版本 If SelectedForge IsNot Nothing Then Return "与 Forge 不兼容" If SelectedFabric IsNot Nothing Then Return "与 Fabric 不兼容" Return Nothing diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml index 4f0ad73..d461c04 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml @@ -37,7 +37,7 @@ - + diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 663d1ee..7331061 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -924,7 +924,7 @@ - + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Resources/Custom.xaml b/Plain Craft Launcher 2/Resources/Custom.xaml index 1d5bb85..bf12a82 100644 --- a/Plain Craft Launcher 2/Resources/Custom.xaml +++ b/Plain Craft Launcher 2/Resources/Custom.xaml @@ -202,7 +202,7 @@ - + Date: Fri, 28 Jun 2024 05:20:43 +0800 Subject: [PATCH 63/87] =?UTF-8?q?=E6=98=8E=E7=A1=AE=E5=9C=A8=20GitHub=20?= =?UTF-8?q?=E4=B8=8A=E7=9A=84=20Fork=20=E4=B8=8D=E8=BF=9D=E5=8F=8D?= =?UTF-8?q?=E5=A4=A7=E9=87=8F=E4=BD=BF=E7=94=A8=E6=83=85=E5=BD=A2=E7=9A=84?= =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENCE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENCE b/LICENCE index 5825c79..4c8869c 100644 --- a/LICENCE +++ b/LICENCE @@ -3,7 +3,7 @@ 一、承诺与声明。   开发者承诺,在您遵守本指南的情况下,不会追究您的法律责任,但最终裁量权仍由开发者保留。 -  开发者仍保留所有权利(All Rights Reserved),且可能随时修改本指南,本指南并不是永久性保证。 +  法律上,开发者仍保留所有权利(All Rights Reserved),且可能随时修改本指南,本指南并不是永久性保证。 二、少量使用情形。 @@ -16,7 +16,7 @@   如果您基于该存储库进行衍生创作,或合理使用了本存储库中的较大量内容,您必须:   (一)给出适当的署名,且提供指向本存储库的链接。   (二)不得以任何方式暗示开发者为您或您的使用作担保。 -  (三)给出适当的说明,表示这是第三方内容。 +  (三)给出适当的说明,表示这是第三方内容。在 GitHub 上直接进行 Fork 是允许的。   (四)使用本指南文件作为协议,不得附加额外条款。   (五)不得分发编译后的可执行文件。 From cf4324426459182149b758c035ec409e6a20a27e Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Fri, 28 Jun 2024 09:44:55 +0800 Subject: [PATCH 64/87] =?UTF-8?q?refactor:=20=E5=90=88=E5=B9=B6=20Forge=20?= =?UTF-8?q?=E5=92=8C=20NeoForge=20=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 11 +- .../Pages/PageDownload/ModDownloadLib.vb | 656 +++--------------- .../PageDownload/PageDownloadNeoForge.xaml.vb | 4 +- 3 files changed, 116 insertions(+), 555 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 43d683e..eeb0488 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -787,12 +787,9 @@ Dim Version As String = Token.Replace("neoforge-", "") Dim Inherit As String = $"1.{Version.Split(".")(0)}.{Token.Split(".")(1)}" If Inherit.EndsWith(".0") Then Inherit = Inherit.Replace(".0", "") - If Versions.Contains(Inherit) Then - Continue For - Else - Versions.Add(Inherit) - End If + Versions.Add(Inherit) Next + Versions = Versions.Distinct().ToList() Catch ex As Exception Log(ex, LogLevel.Feedback) End Try @@ -892,6 +889,10 @@ End If End Get End Property + ''' + ''' 文件扩展名 + ''' + Public ReadOnly Property FileSuffix As String = ".jar" End Class ''' ''' NeoForge 版本列表,主加载器。 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index b63f82a..71ccef5 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1005,15 +1005,16 @@ Retry: #End Region -#Region "Forge 下载" +#Region "Forge / NeoForge 下载" - Public Sub McDownloadForge(DownloadInfo As DlForgeVersionEntry) + Public Sub McDownloadForge(IsNeo As Boolean, Optional DownloadForgeInfo As DlForgeVersionEntry = Nothing, Optional DownloadNeoInfo As DlNeoForgeVersionEntry = Nothing) + Dim DownloadInfo = If(IsNeo, DownloadNeoInfo, DownloadForgeInfo) '老版本提示 If DownloadInfo.Category = "client" Then If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", "版本过老", "继续", "取消") = 1 Then - McDownloadForgeSave(DownloadInfo) + McDownloadForgeSave(IsNeo, DownloadInfo) End If Exit Sub End If @@ -1021,15 +1022,15 @@ Retry: If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", "版本过老", "继续", "取消") = 1 Then - McDownloadForgeSave(DownloadInfo) + McDownloadForgeSave(IsNeo, DownloadInfo) End If Exit Sub End If '初始化参数 - Dim Id As String = DownloadInfo.Inherit & "-forge-" & DownloadInfo.Version - Dim Target As String = PathTemp & "Cache\Code\ForgeInstall-" & DownloadInfo.Version & "_" & GetUuid() & "." & DownloadInfo.FileSuffix + Dim Id As String = DownloadInfo.Inherit & $"-{If(IsNeo, "neo", "")}forge-" & DownloadInfo.Version + Dim Target As String = PathTemp & $"Cache\Code\{If(IsNeo, "Neo", "")}ForgeInstall-" & DownloadInfo.Version & "_" & GetUuid() & "." & DownloadInfo.FileSuffix Dim VersionFolder As String = PathMcFolder & "versions\" & Id & "\" - Dim DisplayName As String = "Forge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version + Dim DisplayName As String = $"{If(IsNeo, "Neo", "")}Forge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version Try '重复任务检查 @@ -1053,14 +1054,14 @@ Retry: End If '启动 - Dim Loader As New LoaderCombo(Of String)(DisplayName & " 下载", McDownloadForgeLoader(DownloadInfo.Version, DownloadInfo.Inherit, DownloadInfo)) With {.OnStateChanged = AddressOf McInstallState} + Dim Loader As New LoaderCombo(Of String)(DisplayName & " 下载", McDownloadForgeLoader(IsNeo, DownloadInfo.Version, DownloadInfo.Inherit, DownloadInfo)) With {.OnStateChanged = AddressOf McInstallState} Loader.Start(VersionFolder) LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() FrmMain.BtnExtraDownload.Ribble() Catch ex As Exception - Log(ex, "开始 Forge 下载失败", LogLevel.Feedback) + Log(ex, $"开始 {If(IsNeo, "Neo", "")}Forge 下载失败", LogLevel.Feedback) Finally '删除安装包 Try @@ -1069,10 +1070,11 @@ Retry: End Try End Try End Sub - Public Sub McDownloadForgeSave(DownloadInfo As DlForgeVersionEntry) + Public Sub McDownloadForgeSave(IsNeo As Boolean, Optional DownloadForgeInfo As DlForgeVersionEntry = Nothing, Optional DownloadNeoInfo As DlNeoForgeVersionEntry = Nothing) + Dim DownloadInfo = If(IsNeo, DownloadNeoInfo, DownloadForgeInfo) Try - Dim Target As String = SelectAs("选择保存位置", DownloadInfo.FileName, "Forge 文件 (*." & DownloadInfo.FileSuffix & ")|*." & DownloadInfo.FileSuffix) - Dim DisplayName As String = "Forge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version + Dim Target As String = SelectAs("选择保存位置", DownloadInfo.FileName, $"{If(IsNeo, "Neo", "")}Forge 文件 (*." & DownloadInfo.FileSuffix & ")|*." & DownloadInfo.FileSuffix) + Dim DisplayName As String = $"{If(IsNeo, "Neo", "")}Forge " & DownloadInfo.Inherit & " - " & If(IsNeo, DownloadInfo.VersionCode, DownloadInfo.Version) If Not Target.Contains("\") Then Exit Sub '重复任务检查 @@ -1088,31 +1090,47 @@ 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))) - Dim Files As New List(Of NetFile) - Files.Add(New NetFile({ - "https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName, - "https://files.minecraftforge.net/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName - }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) - Task.Output = Files - End Sub) With {.ProgressWeight = 0.1, .Show = False}) + If IsNeo Then + 'NeoForge + 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) + Dim IsLegacyNeo As Boolean = DownloadInfo.VersionCode.StartsWith("47.") + Files.Add(New NetFile({ + $"https://bmclapi2.bangbang93.com/maven/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}", + $"https://maven.neoforged.net/releases/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}" + }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) + Task.Output = Files + End Sub) With {.ProgressWeight = 0.1, .Show = False}) + Else + 'Forge + Loaders.Add(New LoaderTask(Of DlForgeVersionEntry, List(Of NetFile))("获取下载地址", + Sub(Task As LoaderTask(Of DlForgeVersionEntry, List(Of NetFile))) + Dim Files As New List(Of NetFile) + Files.Add(New NetFile({ + "https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName, + "https://files.minecraftforge.net/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName + }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) + Task.Output = Files + End Sub) With {.ProgressWeight = 0.1, .Show = False}) + End If '下载 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 = If(IsNeo, New LoaderCombo(Of DlNeoForgeVersionEntry)(DisplayName & " 下载", Loaders) With {.OnStateChanged = AddressOf DownloadStateSave}, + New LoaderCombo(Of DlForgeVersionEntry)(DisplayName & " 下载", Loaders) With {.OnStateChanged = AddressOf DownloadStateSave}) Loader.Start(DownloadInfo) LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() FrmMain.BtnExtraDownload.Ribble() Catch ex As Exception - Log(ex, "开始 Forge 下载失败", LogLevel.Feedback) + Log(ex, $"开始 {If(IsNeo, "Neo", "")}Forge 下载失败", LogLevel.Feedback) End Try End Sub - Private Sub ForgeInjector(Target As String, Task As LoaderTask(Of Boolean, Boolean), McFolder As String, UseJavaWrapper As Boolean) + Private Sub ForgeInjector(Target As String, Task As LoaderTask(Of Boolean, Boolean), McFolder As String, UseJavaWrapper As Boolean, IsNeoForge As Boolean) '选择 Java Dim Java As JavaEntry SyncLock JavaLock @@ -1153,7 +1171,7 @@ Retry: .RedirectStandardError = True, .RedirectStandardOutput = True } - Log("[Download] 开始安装 Forge:" & Arguments) + Log($"[Download] 开始安装 {If(IsNeoForge, "Neo", "")}Forge:" & Arguments) Dim process As New Process With {.StartInfo = Info} Dim LastResults As New Queue(Of String) Using outputWaitHandle As New AutoResetEvent(False) @@ -1170,11 +1188,11 @@ Retry: End If Catch ex As ObjectDisposedException Catch ex As Exception - Log(ex, "读取 Forge 安装器信息失败") + Log(ex, $"读取 {If(IsNeoForge, "Neo", "")}Forge 安装器信息失败") End Try Try If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then - Log("[Installer] 由于任务取消,已中止 Forge 安装") + Log($"[Installer] 由于任务取消,已中止 {If(IsNeoForge, "Neo", "")}Forge 安装") process.Kill() End If Catch @@ -1193,11 +1211,11 @@ Retry: End If Catch ex As ObjectDisposedException Catch ex As Exception - Log(ex, "读取 Forge 安装器错误信息失败") + Log(ex, $"读取 {If(IsNeoForge, "Neo", "")}Forge 安装器错误信息失败") End Try Try If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then - Log("[Installer] 由于任务取消,已中止 Forge 安装") + Log($"[Installer] 由于任务取消,已中止 {If(IsNeoForge, "Neo", "")}Forge 安装") process.Kill() End If Catch @@ -1222,7 +1240,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($"{If(IsNeoForge, "Neo", "")}Forge 安装器出错,日志结束部分为:" & LastLines) End Using End Using End SyncLock @@ -1273,31 +1291,43 @@ Retry: End Sub ''' - ''' 获取下载某个 Forge 版本的加载器列表。 + ''' 获取下载某个 Forge / NeoForge 版本的加载器列表。 ''' - Private Function McDownloadForgeLoader(Version As String, Inherit As String, Optional DownloadInfo As DlForgeVersionEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) + Private Function McDownloadForgeLoader(IsNeo As Boolean, Version As String, Inherit As String, Optional DownloadForgeInfo As DlForgeVersionEntry = Nothing, Optional DownloadNeoInfo As DlNeoForgeVersionEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) '参数初始化 + Dim DownloadInfo = If(IsNeo, DownloadNeoInfo, DownloadForgeInfo) + If DownloadNeoInfo Is Nothing AndAlso IsNeo Then '兜底,有的时候 DownloadInfo 可能是空的 + DownloadInfo.VersionName = Version + Version = Version.Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") + DownloadInfo.VersionCode = Version + If Version.Contains("-beta") Then DownloadInfo.IsBeta = True + ElseIf IsNeo Then + DownloadInfo = DownloadNeoInfo + Version = DownloadInfo.VersionCode + Else + DownloadInfo = DownloadForgeInfo + End If McFolder = If(McFolder, PathMcFolder) - If Version.StartsWithF("1.") AndAlso Version.Contains("-") Then + If Not IsNeo AndAlso 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 Dim IsCustomFolder As Boolean = McFolder <> PathMcFolder - Dim Id As String = Inherit & "-forge-" & Version - Dim InstallerAddress As String = PathTemp & "Cache\Code\ForgeInstall-" & Version & "_" & RandomInteger(0, 100000) + Dim Id As String = If(IsNeo, DownloadInfo.VersionName, Inherit & "-forge-" & Version) + Dim InstallerAddress As String = PathTemp & $"Cache\Code\{If(IsNeo, "Neo", "")}ForgeInstall-" & Version & "_" & RandomInteger(0, 100000) Dim VersionFolder As String = McFolder & "versions\" & Id & "\" - Dim DisplayName As String = "Forge " & Inherit & " - " & Version + Dim DisplayName As String = $"{If(IsNeo, "Neo", "")}Forge " & Inherit & " - " & Version Dim Loaders As New List(Of LoaderBase) Dim LibVersionFolder As String = PathMcFolder & "versions\" & Id & "\" '作为 Lib 文件目标的版本文件夹 '获取下载信息 If DownloadInfo Is Nothing Then - Loaders.Add(New LoaderTask(Of String, String)("获取 Forge 详细信息", + Loaders.Add(New LoaderTask(Of String, String)($"获取 {If(IsNeo, "Neo", "")}Forge 详细信息", Sub(Task As LoaderTask(Of String, String)) - '获取 Forge 版本列表 - Dim ForgeLoader = New LoaderTask(Of String, List(Of DlForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlForgeVersionMain) + '获取 Forge / NeoForge 版本列表 + Dim ForgeLoader = If(IsNeo, New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain), New LoaderTask(Of String, List(Of DlForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlForgeVersionMain)) ForgeLoader.WaitForExit(Inherit) Task.Progress = 0.8 '查找对应版本 @@ -1307,11 +1337,11 @@ Retry: Exit Sub End If Next - Throw New Exception("未能找到 Forge " & Inherit & "-" & Version & " 的详细信息!") + Throw New Exception($"未能找到 {If(IsNeo, "Neo", "")}Forge " & Inherit & "-" & Version & " 的详细信息!") End Sub) With {.ProgressWeight = 3}) End If - '下载 Forge 主文件 - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备下载 Forge", + '下载 Forge / NeoForge 主文件 + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"准备下载 {If(IsNeo, "Neo", "")}Forge", Sub(Task As LoaderTask(Of String, List(Of NetFile))) '启动依赖版本的下载 If ClientDownloadLoader Is Nothing Then @@ -1319,19 +1349,28 @@ Retry: ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, Inherit) End If '添加主文件 - Dim Files As New List(Of NetFile) From {New NetFile({ + Dim Files + If IsNeo Then 'NeoForge + Dim IsLegacyNeo As Boolean = DownloadInfo.VersionCode.StartsWith("47.") + Files = New List(Of NetFile) From {New NetFile({ + $"https://bmclapi2.bangbang93.com/maven/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}", + $"https://maven.neoforged.net/releases/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}" + }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))} + Else 'Forge + Files = 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 }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))} + End If Task.Output = Files End Sub) With {.ProgressWeight = 0.5, .Show = False}) - Loaders.Add(New LoaderDownload("下载 Forge 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) + Loaders.Add(New LoaderDownload($"下载 {If(IsNeo, "Neo", "")}Forge 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) '安装(仅在新版安装时需要原版 Jar) If Version.Before(".") >= 20 Then - Log("[Download] 检测为新版 Forge:" & Version) + Log($"[Download] 检测为{If(IsNeo, " Neo", "新版 ")}Forge:" & Version) Dim Libs As List(Of McLibToken) = Nothing - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Forge 支持库文件", + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"分析 {If(IsNeo, "Neo", "")}Forge 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = New List(Of NetFile) Dim Installer As ZipArchive = Nothing @@ -1357,27 +1396,27 @@ Retry: Log("[Download] 需要下载 Mappings:" & Address) End If Task.Progress = 0.8 - '去除其中的原始 Forge 项 + '去除其中的原始 Forge / NeoForge 项 For i = 0 To Libs.Count - 1 - If Libs(i).LocalPath.EndsWithF("forge-" & Inherit & "-" & Version & ".jar") OrElse + If Libs(i).LocalPath.EndsWithF($"{If(IsNeo, "neo", "")}forge-" & Inherit & "-" & Version & ".jar") OrElse Libs(i).LocalPath.EndsWithF("forge-" & Inherit & "-" & Version & "-client.jar") Then - Log("[Download] 已从待下载 Forge 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug) + Log($"[Download] 已从待下载 {If(IsNeo, "Neo", "")}Forge 支持库中移除:" & 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($"获取{If(IsNeo, " Neo", "新版 ")}Forge 支持库列表失败", ex) Finally '释放文件 If Installer IsNot Nothing Then Installer.Dispose() End Try End Sub) With {.ProgressWeight = 2}) - Loaders.Add(New LoaderDownload("下载 Forge 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12}) - Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("获取 Forge 支持库文件", + Loaders.Add(New LoaderDownload($"下载 {If(IsNeo, "Neo", "")}Forge 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12}) + Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)($"获取 {If(IsNeo, "Neo", "")}Forge 支持库文件", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) -#Region "Forge 文件" +#Region "Forge / NeoForge 文件" If IsCustomFolder Then For Each LibFile As McLibToken In Libs Dim RealPath As String = LibFile.LocalPath.Replace(PathMcFolder, McFolder) @@ -1385,7 +1424,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] 复制的 {If(IsNeo, "Neo", "")}Forge 支持库文件:" & LibFile.LocalPath) Next End If #End Region @@ -1395,7 +1434,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] {If(IsNeo, "Neo", "")}Forge 安装正在等待原版文件下载完成") Do While TargetLoaders.Any AndAlso Not Task.IsAborted TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList Thread.Sleep(50) @@ -1415,11 +1454,11 @@ Retry: End SyncLock #End Region End Sub) With {.ProgressWeight = 0.1, .Show = False}) - Loaders.Add(New LoaderTask(Of Boolean, Boolean)("安装 Forge(方式 A)", + Loaders.Add(New LoaderTask(Of Boolean, Boolean)(If(IsNeo, "安装 NeoForge", "安装 Forge(方式 A)"), Sub(Task As LoaderTask(Of Boolean, Boolean)) Dim Installer As ZipArchive = Nothing Try - Log("[Download] 开始进行新版方式 Forge 安装:" & InstallerAddress) + Log($"[Download] 开始进行{If(IsNeo, " Neo", "新版方式 ")}Forge 安装:" & InstallerAddress) '记录当前文件夹列表(在新建目标文件夹之前) Dim OldList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories. Select(Function(i) i.FullName).ToList() @@ -1440,15 +1479,15 @@ Retry: WriteFile(PathTemp & "Cache\forge_installer.jar", GetResources("ForgeInstaller")) Task.Progress = 0.06 '运行注入器 - ForgeInjector(InstallerAddress, Task, McFolder, UseJavaWrapper) + ForgeInjector(InstallerAddress, Task, McFolder, UseJavaWrapper, False) Task.Progress = 0.97 Catch ex As Exception If UseJavaWrapper Then - Log(ex, "使用 JavaWrapper 安装 Forge 失败,将不使用 JavaWrapper 并重试") + Log(ex, $"使用 JavaWrapper 安装 {If(IsNeo, "Neo", "")}Forge 失败,将不使用 JavaWrapper 并重试") UseJavaWrapper = False GoTo Retry Else - Throw New Exception("运行 Forge 安装器失败", ex) + Throw New Exception($"运行 {If(IsNeo, "Neo", "")}Forge 安装器失败", ex) End If End Try '拷贝新增的版本 Json @@ -1457,7 +1496,7 @@ Retry: If DeltaList.Count > 1 Then '它可能和 OptiFine 安装同时运行,导致增加的文件不止一个(这导致了 #151) '也可能是因为 Forge 安装器的 Bug,生成了一个名字错误的文件夹,所以需要检查文件夹是否为空 - DeltaList = DeltaList.Where(Function(l) l.Name.Contains("forge") AndAlso l.EnumerateFiles.Any).ToList + DeltaList = DeltaList.Where(Function(l) l.Name.Contains($"{If(IsNeo, "neo", "")}forge") AndAlso l.EnumerateFiles.Any).ToList End If If DeltaList.Count = 1 Then '如果没有新增文件夹,那么预测的文件夹名就是正确的 Dim JsonFile As FileInfo = DeltaList(0).EnumerateFiles.First() @@ -1466,14 +1505,14 @@ Retry: '新建 mods 文件夹 Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\") Catch ex As Exception - Throw New Exception("安装新 Forge 版本失败", ex) + Throw New Exception($"安装新 {If(IsNeo, "Neo", "")}Forge 版本失败", 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, $"安装 {If(IsNeo, "Neo", "")}Forge 清理文件时出错") End Try End Try End Sub) With {.ProgressWeight = 10}) @@ -1534,8 +1573,8 @@ Retry: End Sub) With {.ProgressWeight = 1}) If FixLibrary Then If IsCustomFolder Then Throw New Exception("若需要补全支持库,就不能自定义 MC 文件夹") - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Forge 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionFolder))) With {.ProgressWeight = 1, .Show = False}) - Loaders.Add(New LoaderDownload("下载 Forge 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 11}) + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"分析 {If(IsNeo, "Neo", "")}Forge 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionFolder))) With {.ProgressWeight = 1, .Show = False}) + Loaders.Add(New LoaderDownload($"下载 {If(IsNeo, "Neo", "")}Forge 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 11}) End If End If @@ -1634,7 +1673,7 @@ Retry: Else Version = sender.Parent.Parent.Tag End If - McDownloadForgeSave(Version) + McDownloadForgeSave(False, Version) End Sub #End Region @@ -1696,485 +1735,6 @@ Retry: #End Region -#Region "NeoForge 下载" - - Public Sub McDownloadNeoForge(DownloadInfo As DlNeoForgeVersionEntry) - '初始化参数 - Dim Id As String = DownloadInfo.Inherit & "-neoforge-" & DownloadInfo.VersionName - Dim Target As String = PathTemp & "Cache\Code\NeoForgeInstall-" & DownloadInfo.VersionName & "_" & GetUuid() & ".jar" - Dim VersionFolder As String = PathMcFolder & "versions\" & Id & "\" - Dim DisplayName As String = "NeoForge " & DownloadInfo.Inherit & " - " & DownloadInfo.VersionName - Try - - '重复任务检查 - SyncLock LoaderTaskbarLock - For i = 0 To LoaderTaskbar.Count - 1 - If LoaderTaskbar(i).Name = DisplayName & " 下载" Then - Hint("该版本正在下载中!", HintType.Critical) - Exit Sub - End If - Next - End SyncLock - - '已有版本检查 - If File.Exists(VersionFolder & Id & ".json") Then - If MyMsgBox("版本 " & Id & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 Json 和 Jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then - File.Delete(VersionFolder & Id & ".jar") - File.Delete(VersionFolder & Id & ".json") - Else - Exit Sub - End If - End If - - '启动 - Dim Loader As New LoaderCombo(Of String)(DisplayName & " 下载", McDownloadNeoForgeLoader(DownloadInfo.VersionName, DownloadInfo.Inherit, DownloadInfo)) With {.OnStateChanged = AddressOf McInstallState} - Loader.Start(VersionFolder) - LoaderTaskbarAdd(Loader) - FrmMain.BtnExtraDownload.ShowRefresh() - FrmMain.BtnExtraDownload.Ribble() - - Catch ex As Exception - Log(ex, "开始 NeoForge 下载失败", LogLevel.Feedback) - Finally - '删除安装包 - Try - If File.Exists(Target) Then File.Delete(Target) - Catch - End Try - End Try - End Sub - Public Sub McDownloadNeoForgeSave(DownloadInfo As DlNeoForgeVersionEntry) - Try - Dim Target As String = SelectAs("选择保存位置", DownloadInfo.FileName, "NeoForge 文件 (*.jar)") - Dim DisplayName As String = "NeoForge " & DownloadInfo.Inherit & " - " & DownloadInfo.VersionName - If Not Target.Contains("\") Then Exit Sub - - '重复任务检查 - SyncLock LoaderTaskbarLock - For i = 0 To LoaderTaskbar.Count - 1 - If LoaderTaskbar(i).Name = DisplayName & " 下载" Then - Hint("该版本正在下载中!", HintType.Critical) - Exit Sub - End If - Next - End SyncLock - - '构造步骤加载器 - Dim Loaders As New List(Of LoaderBase) - '获取下载地址 - 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) - If DownloadInfo.VersionCode.StartsWith("47.") Then '1.20.1 NeoForge 下载地址不同 - Files.Add(New NetFile({ - "https://bmclapi2.bangbang93.com/maven/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, - "https://maven.neoforged.net/releases/net/neoforged/forge/" & "1.20.1-" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName - }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) - Else - Files.Add(New NetFile({ - "https://bmclapi2.bangbang93.com/maven/net/neoforged/neoforge/" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName, - "https://maven.neoforged.net/releases/net/neoforged/neoforge/" & DownloadInfo.VersionCode & If(DownloadInfo.IsBeta, "-beta", "") & "/" & DownloadInfo.FileName - }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) - End If - Task.Output = Files - End Sub) With {.ProgressWeight = 0.1, .Show = False}) - '下载 - Loaders.Add(New LoaderDownload("下载主文件", New List(Of NetFile)) With {.ProgressWeight = 6}) - - '启动 - Dim Loader As New LoaderCombo(Of DlNeoForgeVersionEntry)(DisplayName & " 下载", Loaders) With {.OnStateChanged = AddressOf DownloadStateSave} - Loader.Start(DownloadInfo) - LoaderTaskbarAdd(Loader) - FrmMain.BtnExtraDownload.ShowRefresh() - FrmMain.BtnExtraDownload.Ribble() - - Catch ex As Exception - Log(ex, "开始 NeoForge 下载失败", LogLevel.Feedback) - End Try - End Sub - - Private Sub NeoForgeInjector(Target As String, Task As LoaderTask(Of Boolean, Boolean), McFolder As String, UseJavaWrapper As Boolean) - '选择 Java - Dim Java As JavaEntry - SyncLock JavaLock - Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 60)) - If Java Is Nothing Then - If Not JavaDownloadConfirm("Java 8 或更高版本") Then Throw New Exception("由于未找到 Java,已取消安装。") - '开始自动下载 - Dim JavaLoader = JavaFixLoaders(17) - Try - JavaLoader.Start(17, IsForceRestart:=True) - Do While JavaLoader.State = LoadState.Loading AndAlso Not Task.IsAborted - Thread.Sleep(10) - Loop - Finally - JavaLoader.Abort() '确保取消时中止 Java 下载 - End Try - '检查下载结果 - Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 60)) - If Task.IsAborted Then Exit Sub - If Java Is Nothing Then Throw New Exception("由于未找到 Java,已取消安装。") - End If - End SyncLock - '添加 Java Wrapper 作为主 Jar - Dim Arguments As String - If UseJavaWrapper Then - Arguments = $"-Doolloo.jlw.tmpdir=""{GetJavaWrapperDir()}"" -cp ""{PathTemp}Cache\neoforge_installer.jar;{Target}"" -jar ""{ExtractJavaWrapper()}"" com.bangbang93.ForgeInstaller ""{McFolder}" - Else - 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 - '开始启动 - SyncLock InstallSyncLock - Dim Info = New ProcessStartInfo With { - .FileName = Java.PathJavaw, - .Arguments = Arguments, - .UseShellExecute = False, - .CreateNoWindow = True, - .RedirectStandardError = True, - .RedirectStandardOutput = True - } - Log("[Download] 开始安装 NeoForge:" & Arguments) - Dim process As New Process With {.StartInfo = Info} - Dim LastResults As New Queue(Of String) - Using outputWaitHandle As New AutoResetEvent(False) - Using errorWaitHandle As New AutoResetEvent(False) - AddHandler process.OutputDataReceived, - Function(sender, e) - Try - If e.Data Is Nothing Then - outputWaitHandle.[Set]() - Else - LastResults.Enqueue(e.Data) - If LastResults.Count > 100 Then LastResults.Dequeue() - NeoForgeInjectorLine(e.Data, Task) - End If - Catch ex As ObjectDisposedException - Catch ex As Exception - Log(ex, "读取 NeoForge 安装器信息失败") - End Try - Try - If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then - Log("[Installer] 由于任务取消,已中止 NeoForge 安装") - process.Kill() - End If - Catch - End Try - Return Nothing - End Function - AddHandler process.ErrorDataReceived, - Function(sender, e) - Try - If e.Data Is Nothing Then - errorWaitHandle.[Set]() - Else - LastResults.Enqueue(e.Data) - If LastResults.Count > 100 Then LastResults.Dequeue() - NeoForgeInjectorLine(e.Data, Task) - End If - Catch ex As ObjectDisposedException - Catch ex As Exception - Log(ex, "读取 NeoForge 安装器错误信息失败") - End Try - Try - If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then - Log("[Installer] 由于任务取消,已中止 NeoForge 安装") - process.Kill() - End If - Catch - End Try - Return Nothing - End Function - process.Start() - process.BeginOutputReadLine() - process.BeginErrorReadLine() - '等待 - Do Until process.HasExited - Thread.Sleep(10) - Loop - '输出 - outputWaitHandle.WaitOne(10000) - errorWaitHandle.WaitOne(10000) - process.Dispose() - '检查是否安装成功:最后两行中是否有 true(true 可能在倒数第二行,见 #832) - If LastResults.Last = "true" OrElse (LastResults.Count >= 2 AndAlso LastResults(LastResults.Count - 2) = "true") Then Exit Sub - Log(Join(LastResults, vbCrLf)) - Dim LastLines As String = "" - For i As Integer = Math.Max(0, LastResults.Count - 5) To LastResults.Count - 1 '最后 5 行 - LastLines &= vbCrLf & LastResults(i) - Next - Throw New Exception("NeoForge 安装器出错,日志结束部分为:" & LastLines) - End Using - End Using - End SyncLock - End Sub - Private Sub NeoForgeInjectorLine(Content As String, Task As LoaderTask(Of Boolean, Boolean)) - If Content.StartsWithF(" Data") OrElse Content.StartsWithF(" Slim") Then - If ModeDebug Then Log("[Installer] " & Content) - ElseIf Content.StartsWithF(" Reading patch ") Then - If ModeDebug Then Log("[Installer] " & Content) - Task.Progress = 0.86 - Else - Select Case Content - Case "Extracting json" - Log("[Installer] " & Content) - Task.Progress = 0.07 - Case "Downloading libraries" - Log("[Installer] " & Content) - Task.Progress = 0.08 - Case " File exists: Checksum validated." - If ModeDebug Then Log("[Installer] " & Content) - Task.Progress += 0.003 - Case "Building Processors" - Task.Progress = 0.38 - Case "Task: DOWNLOAD_MOJMAPS" 'B - Task.Progress = 0.4 - Case "Task: MERGE_MAPPING" 'B - Task.Progress = 0.6 - Case "Splitting: " - Task.Progress = 0.62 - Case "Parameter Annotations" 'B - Task.Progress = 0.66 - Case "Processing Complete" 'B - Task.Progress = 0.7 - Case "Remapping final jar" 'A - Task.Progress = 0.72 - Case "Remapping jar... 50%" 'A - Task.Progress = 0.76 - Case "Remapping jar... 100%" 'A - Task.Progress = 0.81 - Case "Injecting profile" - Task.Progress = 0.91 - Case Else - If ModeDebug Then Log("[Installer] " & Content) - Exit Sub - End Select - Log("[Installer] " & Content) - End If - End Sub - - ''' - ''' 获取下载某个 NeoForge 版本的加载器列表。 - ''' - Private Function McDownloadNeoForgeLoader(Version As String, Inherit As String, Optional DownloadRawInfo As DlNeoForgeVersionEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) - - '参数初始化 - Dim DownloadInfo As New DlNeoForgeVersionEntry - McFolder = If(McFolder, PathMcFolder) - If DownloadRawInfo Is Nothing Then '兜底,有的时候 DownloadInfo 可能是空的 - If Version.Contains("-beta") Then - DownloadInfo.VersionName = Version - Version = Version.Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") - DownloadInfo.VersionCode = Version - DownloadInfo.IsBeta = True - Else - DownloadInfo.VersionName = Version - Version = Version.Replace("neoforge-", "").Replace("1.20.1-", "") - DownloadInfo.VersionCode = Version - DownloadInfo.IsBeta = False - End If - Else - DownloadInfo = DownloadRawInfo - Version = DownloadInfo.VersionCode - End If - Dim IsCustomFolder As Boolean = McFolder <> PathMcFolder - Dim Id As String = DownloadInfo.VersionName - 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 - Dim Loaders As New List(Of LoaderBase) - Dim LibVersionFolder As String = PathMcFolder & "versions\" & Id & "\" '作为 Lib 文件目标的版本文件夹 - - '获取下载信息 - If DownloadInfo Is Nothing Then - Loaders.Add(New LoaderTask(Of String, String)("获取 NeoForge 详细信息", - Sub(Task As LoaderTask(Of String, String)) - '获取 NeoForge 版本列表 - Dim NeoForgeLoader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadNeoForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain) - NeoForgeLoader.WaitForExit(Inherit) - Task.Progress = 0.8 - '查找对应版本 - For Each NeoForgeVersion In NeoForgeLoader.Output - If NeoForgeVersion.VersionName = Version Then - DownloadInfo = NeoForgeVersion - Exit Sub - End If - Next - Throw New Exception("未能找到 NeoForge " & Inherit & "-" & Version & " 的详细信息!") - End Sub) With {.ProgressWeight = 3}) - End If - '下载 NeoForge 主文件 - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("准备下载 NeoForge", - Sub(Task As LoaderTask(Of String, List(Of NetFile))) - '启动依赖版本的下载 - If ClientDownloadLoader Is Nothing Then - If IsCustomFolder Then Throw New Exception("如果没有指定原版下载器,则不能指定 MC 安装文件夹") - ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, Inherit) - End If - Dim IsLegacyNeo As Boolean = DownloadInfo.VersionCode.StartsWith("47.") - Dim Files As New List(Of NetFile) From {New NetFile({ - $"https://bmclapi2.bangbang93.com/maven/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}", - $"https://maven.neoforged.net/releases/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{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("下载 NeoForge 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) - - '安装(需要原版 Jar) - Log("[Download] 检测到的 NeoForge 版本:" & Version) - Dim Libs As List(Of McLibToken) = Nothing - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 NeoForge 支持库文件", - Sub(Task As LoaderTask(Of String, List(Of NetFile))) - Task.Output = New List(Of NetFile) - Dim Installer As ZipArchive = Nothing - Try - '解压并获取、合并两个 Json 的信息 - Installer = New ZipArchive(New FileStream(InstallerAddress, FileMode.Open)) - Task.Progress = 0.2 - Dim Json As JObject = GetJson(ReadFile(Installer.GetEntry("install_profile.json").Open)) - Dim Json2 As JObject = GetJson(ReadFile(Installer.GetEntry("version.json").Open)) - Json.Merge(Json2) - '获取 Lib 下载信息 - Libs = McLibListGetWithJson(Json, True) - '添加 Mappings 下载信息 - If Json("data") IsNot Nothing AndAlso Json("data")("MOJMAPS") IsNot Nothing Then - '下载原版 Json 文件 - Task.Progress = 0.4 - Dim RawJson As JObject = GetJson(NetGetCodeByDownload(DlSourceLauncherOrMetaGet(DlClientListGet(Inherit)), IsJson:=True)) - '[net.minecraft:client:1.17.1-20210706.113038:mappings@txt] 或 @tsrg] - Dim OriginalName As String = Json("data")("MOJMAPS")("client").ToString.Trim("[]".ToCharArray()).Before("@") - Dim Address = McLibGet(OriginalName).Replace(".jar", "-mappings." & Json("data")("MOJMAPS")("client").ToString.Trim("[]".ToCharArray()).Split("@")(1)) - Libs.Add(New McLibToken With {.IsJumpLoader = False, .IsNatives = False, .LocalPath = Address, .OriginalName = OriginalName, - .Url = RawJson("downloads")("client_mappings")("url"), .Size = RawJson("downloads")("client_mappings")("size"), .SHA1 = RawJson("downloads")("client_mappings")("sha1")}) - Log("[Download] 需要下载 Mappings:" & Address) - End If - Task.Progress = 0.8 - '去除其中的原始 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 - 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("获取 NeoForge 支持库列表失败", ex) - Finally - '释放文件 - If Installer IsNot Nothing Then Installer.Dispose() - End Try - End Sub) With {.ProgressWeight = 2}) - Loaders.Add(New LoaderDownload("下载 NeoForge 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12}) - Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("获取 NeoForge 支持库文件", - Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) -#Region "NeoForge 文件" - If IsCustomFolder Then - For Each LibFile As McLibToken In Libs - Dim RealPath As String = LibFile.LocalPath.Replace(PathMcFolder, McFolder) - If Not File.Exists(RealPath) Then - Directory.CreateDirectory(IO.Path.GetDirectoryName(RealPath)) - CopyFile(LibFile.LocalPath, RealPath) - End If - If ModeDebug Then Log("[Download] 复制的 NeoForge 支持库文件:" & LibFile.LocalPath) - Next - End If -#End Region -#Region "原版文件" - '等待原版文件下载完成 - If ClientDownloadLoader Is Nothing Then Exit Sub - 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] NeoForge 安装正在等待原版文件下载完成") - Do While TargetLoaders.Any AndAlso Not Task.IsAborted - TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList - Thread.Sleep(50) - Loop - If Task.IsAborted Then Exit Sub - '拷贝原版文件 - If Not IsCustomFolder Then Exit Sub - SyncLock VanillaSyncLock - Dim ClientName As String = GetFolderNameFromPath(ClientFolder) - Directory.CreateDirectory(McFolder & "versions\" & Inherit) - If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".json") Then - CopyFile(ClientFolder & ClientName & ".json", McFolder & "versions\" & Inherit & "\" & Inherit & ".json") - End If - If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".jar") Then - CopyFile(ClientFolder & ClientName & ".jar", McFolder & "versions\" & Inherit & "\" & Inherit & ".jar") - End If - End SyncLock -#End Region - End Sub) With {.ProgressWeight = 0.1, .Show = False}) - Loaders.Add(New LoaderTask(Of Boolean, Boolean)("安装 NeoForge", - Sub(Task As LoaderTask(Of Boolean, Boolean)) - Dim Installer As ZipArchive = Nothing - Try - Log("[Download] 开始进行 NeoForge 安装:" & InstallerAddress) - '记录当前文件夹列表(在新建目标文件夹之前) - Dim OldList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories. - Select(Function(i) i.FullName).ToList() - '解压并获取信息 - Installer = New ZipArchive(New FileStream(InstallerAddress, FileMode.Open)) - Dim Json As JObject = GetJson(ReadFile(Installer.GetEntry("install_profile.json").Open)) - '新建目标版本文件夹 - Directory.CreateDirectory(VersionFolder) - Task.Progress = 0.04 - '释放 launcher_installer.json - McFolderLauncherProfilesJsonCreate(McFolder) - Task.Progress = 0.05 - '运行 NeoForge 安装器 - Dim UseJavaWrapper As Boolean = True -Retry: - Try - '释放 NeoForge 注入器 - WriteFile(PathTemp & "Cache\neoforge_installer.jar", GetResources("ForgeInstaller")) - Task.Progress = 0.06 - '运行注入器 - NeoForgeInjector(InstallerAddress, Task, McFolder, UseJavaWrapper) - Task.Progress = 0.97 - Catch ex As Exception - If UseJavaWrapper Then - Log(ex, "使用 JavaWrapper 安装 NeoForge 失败,将不使用 JavaWrapper 并重试") - UseJavaWrapper = False - GoTo Retry - Else - Throw New Exception("运行 NeoForge 安装器失败", ex) - End If - End Try - '拷贝新增的版本 Json - Dim DeltaList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories. - SkipWhile(Function(i) OldList.Contains(i.FullName)).ToList() - If DeltaList.Count > 1 Then - '它可能和 OptiFine 安装同时运行,导致增加的文件不止一个(这导致了 #151) - '也可能是因为 NeoForge 安装器的 Bug,生成了一个名字错误的文件夹,所以需要检查文件夹是否为空 - 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() - WriteFile(VersionFolder & Id & ".json", ReadFile(JsonFile.FullName)) - 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) - Catch ex As Exception - Log(ex, "安装 NeoForge 清理文件时出错") - End Try - End Try - End Sub) With {.ProgressWeight = 10}) - - Return Loaders - End Function - -#End Region - #Region "NeoForge 下载菜单" Public Sub NeoForgeDownloadListItemPreload(Stack As StackPanel, Entrys As List(Of DlNeoForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) @@ -2270,7 +1830,7 @@ Retry: Else Version = sender.Parent.Parent.Tag End If - McDownloadNeoForgeSave(Version) + McDownloadForgeSave(True, , Version) End Sub #End Region @@ -2642,11 +2202,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 AndAlso Request.NeoForgeEntry Is Nothing}) + LoaderList.Add(New LoaderCombo(Of String)("下载 Forge " & Request.ForgeVersion, McDownloadForgeLoader(False, 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}) + LoaderList.Add(New LoaderCombo(Of String)("下载 NeoForge " & Request.NeoForgeVersion, McDownloadForgeLoader(True, 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 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb index b0eabde..bdd3b01 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb @@ -42,10 +42,10 @@ End If End Sub Private Sub NeoForge_Selected(sender As MyListItem, e As EventArgs) - McDownloadNeoForgeSave(sender.Tag) + McDownloadForgeSave(True, sender.Tag) End Sub Public Sub DownloadStart(sender As MyListItem, e As Object) - McDownloadNeoForge(sender.Tag) + McDownloadForge(True, sender.Tag) End Sub Private Sub BtnWeb_Click(sender As Object, e As EventArgs) Handles BtnWeb.Click OpenWebsite("https://neoforged.net/") From 4dba7c969cb88d41e4e96e56479759ae6b545f60 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Fri, 28 Jun 2024 22:00:01 +0800 Subject: [PATCH 65/87] =?UTF-8?q?chores:=20=E4=BB=A3=E7=A0=81=E5=8F=AF?= =?UTF-8?q?=E8=AF=BB=E6=80=A7=E5=92=8C=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageDownload/ModDownloadLib.vb | 72 ++++++++++--------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 71ccef5..a90fb77 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1171,7 +1171,8 @@ Retry: .RedirectStandardError = True, .RedirectStandardOutput = True } - Log($"[Download] 开始安装 {If(IsNeoForge, "Neo", "")}Forge:" & Arguments) + Dim LoaderName As String = If(IsNeoForge, "NeoForge", "Forge") + Log($"[Download] 开始安装 {LoaderName}:" & Arguments) Dim process As New Process With {.StartInfo = Info} Dim LastResults As New Queue(Of String) Using outputWaitHandle As New AutoResetEvent(False) @@ -1188,11 +1189,11 @@ Retry: End If Catch ex As ObjectDisposedException Catch ex As Exception - Log(ex, $"读取 {If(IsNeoForge, "Neo", "")}Forge 安装器信息失败") + Log(ex, $"读取 {LoaderName} 安装器信息失败") End Try Try If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then - Log($"[Installer] 由于任务取消,已中止 {If(IsNeoForge, "Neo", "")}Forge 安装") + Log($"[Installer] 由于任务取消,已中止 {LoaderName} 安装") process.Kill() End If Catch @@ -1211,11 +1212,11 @@ Retry: End If Catch ex As ObjectDisposedException Catch ex As Exception - Log(ex, $"读取 {If(IsNeoForge, "Neo", "")}Forge 安装器错误信息失败") + Log(ex, $"读取 {LoaderName} 安装器错误信息失败") End Try Try If Task.State = LoadState.Aborted AndAlso Not process.HasExited Then - Log($"[Installer] 由于任务取消,已中止 {If(IsNeoForge, "Neo", "")}Forge 安装") + Log($"[Installer] 由于任务取消,已中止 {LoaderName} 安装") process.Kill() End If Catch @@ -1240,7 +1241,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($"{If(IsNeoForge, "Neo", "")}Forge 安装器出错,日志结束部分为:" & LastLines) + Throw New Exception($"{LoaderName} 安装器出错,日志结束部分为:" & LastLines) End Using End Using End SyncLock @@ -1297,14 +1298,16 @@ Retry: '参数初始化 Dim DownloadInfo = If(IsNeo, DownloadNeoInfo, DownloadForgeInfo) - If DownloadNeoInfo Is Nothing AndAlso IsNeo Then '兜底,有的时候 DownloadInfo 可能是空的 - DownloadInfo.VersionName = Version - Version = Version.Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") - DownloadInfo.VersionCode = Version - If Version.Contains("-beta") Then DownloadInfo.IsBeta = True - ElseIf IsNeo Then - DownloadInfo = DownloadNeoInfo - Version = DownloadInfo.VersionCode + If IsNeo Then '兜底,有的时候 DownloadInfo 可能是空的 + If DownloadNeoInfo Is Nothing Then + DownloadInfo.VersionName = Version + Version = Version.Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") + DownloadInfo.VersionCode = Version + If Version.Contains("-beta") Then DownloadInfo.IsBeta = True + Else + DownloadInfo = DownloadNeoInfo + Version = DownloadInfo.VersionCode + End If Else DownloadInfo = DownloadForgeInfo End If @@ -1314,17 +1317,18 @@ Retry: Inherit = Version.Before("-") Version = Version.After("-") End If + Dim LoaderName As String = If(IsNeo, "NeoForge", "Forge") Dim IsCustomFolder As Boolean = McFolder <> PathMcFolder Dim Id As String = If(IsNeo, DownloadInfo.VersionName, Inherit & "-forge-" & Version) - Dim InstallerAddress As String = PathTemp & $"Cache\Code\{If(IsNeo, "Neo", "")}ForgeInstall-" & Version & "_" & RandomInteger(0, 100000) + Dim InstallerAddress As String = PathTemp & $"Cache\Code\{LoaderName}Install-" & Version & "_" & RandomInteger(0, 100000) Dim VersionFolder As String = McFolder & "versions\" & Id & "\" - Dim DisplayName As String = $"{If(IsNeo, "Neo", "")}Forge " & Inherit & " - " & Version + Dim DisplayName As String = $"{LoaderName} " & Inherit & " - " & Version Dim Loaders As New List(Of LoaderBase) Dim LibVersionFolder As String = PathMcFolder & "versions\" & Id & "\" '作为 Lib 文件目标的版本文件夹 '获取下载信息 If DownloadInfo Is Nothing Then - Loaders.Add(New LoaderTask(Of String, String)($"获取 {If(IsNeo, "Neo", "")}Forge 详细信息", + Loaders.Add(New LoaderTask(Of String, String)($"获取 {LoaderName} 详细信息", Sub(Task As LoaderTask(Of String, String)) '获取 Forge / NeoForge 版本列表 Dim ForgeLoader = If(IsNeo, New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain), New LoaderTask(Of String, List(Of DlForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlForgeVersionMain)) @@ -1337,11 +1341,11 @@ Retry: Exit Sub End If Next - Throw New Exception($"未能找到 {If(IsNeo, "Neo", "")}Forge " & Inherit & "-" & Version & " 的详细信息!") + Throw New Exception($"未能找到 {LoaderName} " & Inherit & "-" & Version & " 的详细信息!") End Sub) With {.ProgressWeight = 3}) End If '下载 Forge / NeoForge 主文件 - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"准备下载 {If(IsNeo, "Neo", "")}Forge", + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"准备下载 {LoaderName}", Sub(Task As LoaderTask(Of String, List(Of NetFile))) '启动依赖版本的下载 If ClientDownloadLoader Is Nothing Then @@ -1364,13 +1368,13 @@ Retry: End If Task.Output = Files End Sub) With {.ProgressWeight = 0.5, .Show = False}) - Loaders.Add(New LoaderDownload($"下载 {If(IsNeo, "Neo", "")}Forge 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) + Loaders.Add(New LoaderDownload($"下载 {LoaderName} 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) '安装(仅在新版安装时需要原版 Jar) If Version.Before(".") >= 20 Then Log($"[Download] 检测为{If(IsNeo, " Neo", "新版 ")}Forge:" & Version) Dim Libs As List(Of McLibToken) = Nothing - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"分析 {If(IsNeo, "Neo", "")}Forge 支持库文件", + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"分析 {LoaderName} 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = New List(Of NetFile) Dim Installer As ZipArchive = Nothing @@ -1400,7 +1404,7 @@ Retry: For i = 0 To Libs.Count - 1 If Libs(i).LocalPath.EndsWithF($"{If(IsNeo, "neo", "")}forge-" & Inherit & "-" & Version & ".jar") OrElse Libs(i).LocalPath.EndsWithF("forge-" & Inherit & "-" & Version & "-client.jar") Then - Log($"[Download] 已从待下载 {If(IsNeo, "Neo", "")}Forge 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug) + Log($"[Download] 已从待下载 {LoaderName} 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug) Libs.RemoveAt(i) Exit For End If @@ -1413,8 +1417,8 @@ Retry: If Installer IsNot Nothing Then Installer.Dispose() End Try End Sub) With {.ProgressWeight = 2}) - Loaders.Add(New LoaderDownload($"下载 {If(IsNeo, "Neo", "")}Forge 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12}) - Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)($"获取 {If(IsNeo, "Neo", "")}Forge 支持库文件", + Loaders.Add(New LoaderDownload($"下载 {LoaderName} 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12}) + Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)($"获取 {LoaderName} 支持库文件", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) #Region "Forge / NeoForge 文件" If IsCustomFolder Then @@ -1424,7 +1428,7 @@ Retry: Directory.CreateDirectory(IO.Path.GetDirectoryName(RealPath)) CopyFile(LibFile.LocalPath, RealPath) End If - If ModeDebug Then Log($"[Download] 复制的 {If(IsNeo, "Neo", "")}Forge 支持库文件:" & LibFile.LocalPath) + If ModeDebug Then Log($"[Download] 复制的 {LoaderName} 支持库文件:" & LibFile.LocalPath) Next End If #End Region @@ -1434,7 +1438,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] {If(IsNeo, "Neo", "")}Forge 安装正在等待原版文件下载完成") + If TargetLoaders.Any Then Log($"[Download] {LoaderName} 安装正在等待原版文件下载完成") Do While TargetLoaders.Any AndAlso Not Task.IsAborted TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList Thread.Sleep(50) @@ -1483,11 +1487,11 @@ Retry: Task.Progress = 0.97 Catch ex As Exception If UseJavaWrapper Then - Log(ex, $"使用 JavaWrapper 安装 {If(IsNeo, "Neo", "")}Forge 失败,将不使用 JavaWrapper 并重试") + Log(ex, $"使用 JavaWrapper 安装 {LoaderName} 失败,将不使用 JavaWrapper 并重试") UseJavaWrapper = False GoTo Retry Else - Throw New Exception($"运行 {If(IsNeo, "Neo", "")}Forge 安装器失败", ex) + Throw New Exception($"运行 {LoaderName} 安装器失败", ex) End If End Try '拷贝新增的版本 Json @@ -1505,14 +1509,14 @@ Retry: '新建 mods 文件夹 Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\") Catch ex As Exception - Throw New Exception($"安装新 {If(IsNeo, "Neo", "")}Forge 版本失败", ex) + Throw New Exception($"安装新 {LoaderName} 版本失败", ex) Finally '清理文件 Try If Installer IsNot Nothing Then Installer.Dispose() If File.Exists(InstallerAddress) Then File.Delete(InstallerAddress) Catch ex As Exception - Log(ex, $"安装 {If(IsNeo, "Neo", "")}Forge 清理文件时出错") + Log(ex, $"安装 {LoaderName} 清理文件时出错") End Try End Try End Sub) With {.ProgressWeight = 10}) @@ -1573,8 +1577,8 @@ Retry: End Sub) With {.ProgressWeight = 1}) If FixLibrary Then If IsCustomFolder Then Throw New Exception("若需要补全支持库,就不能自定义 MC 文件夹") - Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"分析 {If(IsNeo, "Neo", "")}Forge 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionFolder))) With {.ProgressWeight = 1, .Show = False}) - Loaders.Add(New LoaderDownload($"下载 {If(IsNeo, "Neo", "")}Forge 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 11}) + Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"分析 {LoaderName} 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionFolder))) With {.ProgressWeight = 1, .Show = False}) + Loaders.Add(New LoaderDownload($"下载 {LoaderName} 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 11}) End If End If @@ -1673,7 +1677,7 @@ Retry: Else Version = sender.Parent.Parent.Tag End If - McDownloadForgeSave(False, Version) + McDownloadForgeSave(False, DownloadForgeInfo:=Version) End Sub #End Region @@ -1830,7 +1834,7 @@ Retry: Else Version = sender.Parent.Parent.Tag End If - McDownloadForgeSave(True, , Version) + McDownloadForgeSave(True, DownloadNeoInfo:=Version) End Sub #End Region From 6674533cfb7394d4cee5903d155c6b8508479dbb Mon Sep 17 00:00:00 2001 From: SALTWOOD <105980161+SALTWOOD@users.noreply.github.com> Date: Fri, 28 Jun 2024 22:20:09 +0800 Subject: [PATCH 66/87] =?UTF-8?q?modify:=20=E5=88=A0=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E7=9A=84=E5=85=B3=E9=94=AE=E8=AF=8D=EF=BC=8C=E5=9B=A0?= =?UTF-8?q?=E4=B8=BA=E4=B8=8B=E6=96=87=E5=B7=B2=E9=92=88=E5=AF=B9=E5=85=B6?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E5=85=A8=E5=AD=97=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb index 2bc5f59..8091129 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb @@ -5,7 +5,7 @@ ''' 用于在搜索 Java 时进行关键词检测。 ''' Public ReadOnly SearchEntryWords As List(Of String) = - New List(Of String) From {"java", "jdk", "env", "环境", "run", "软件", "jre", "bin", "mc", + New List(Of String) From {"java", "jdk", "env", "环境", "run", "软件", "jre", "mc", "soft", "cache", "temp", "corretto", "roaming", "users", "craft", "program", "世界", "net", "游戏", "oracle", "game", "file", "data", "jvm", "服务", "server", "客户", "client", "整合", "应用", "运行", "前置", "mojang", "官启", "新建文件夹", "eclipse", "microsoft", "hotspot", From 3c44a55b37f23866cda59513983d92e1739112f0 Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 30 Jun 2024 15:01:06 +0800 Subject: [PATCH 67/87] =?UTF-8?q?refactor:=20NeoForge=20BMCLAPI=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=88=97=E8=A1=A8=EF=BC=88=E7=88=B1=E6=9D=A5?= =?UTF-8?q?=E8=87=AA=20bangbang93=EF=BC=89=20fix:=20=E5=AE=89=E8=A3=85=20N?= =?UTF-8?q?eoForge=20=E6=95=B4=E5=90=88=E5=8C=85=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=88=9D=E5=A7=8B=E5=8C=96=E4=B8=8D=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=20chores:=20=E5=9C=A8=E4=BD=8E=E7=89=88=E6=9C=AC?= =?UTF-8?q?=EF=BC=88<=3D1.19=EF=BC=89=E7=9A=84=E8=87=AA=E5=8A=A8=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E7=95=8C=E9=9D=A2=E5=B0=86=E4=B8=8D=E4=BC=9A=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=20NeoForge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 43 +++++++++++-------- .../Pages/PageDownload/ModDownloadLib.vb | 2 +- .../PageDownload/PageDownloadInstall.xaml.vb | 30 +++++++------ 3 files changed, 44 insertions(+), 31 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index eeb0488..5bc3131 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -802,24 +802,33 @@ ''' Public DlNeoForgeListBmclapiLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Bmclapi", AddressOf DlNeoForgeListBmclapiMain) Private Sub DlNeoForgeListBmclapiMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) + Dim ResultLatest As String + Dim VersionsJArray As JArray + Try + ResultLatest = NetGetCodeByDownload("https://bmclapi2.bangbang93.com/neoforge/meta/api/maven/details/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True, IsJson:=True) + Catch ex As Exception + If GetExceptionSummary(ex).Contains("(404)") Then + Throw New Exception("没有可用版本") + Else + Throw + End If + End Try + If ResultLatest.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") + VersionsJArray = GetJson(ResultLatest)("name") Dim Versions As New List(Of String) - Dim ClientVersions As JArray = DlClientListLoader.Output.Value("versions") 'BMCLAPI 不能返回所有 NeoForge 版本,获取 MC 版本列表进行遍历 - Dim ClientReleases As New List(Of String) - - For Each Client In ClientVersions '排除快照版或远古版等特殊版本 - If RegexCheck(Client("id").ToString(), "[0,9.]+") Then - ClientReleases.Add(Client("id").ToString()) - End If - Next - - For Each Release In ClientReleases - If Int(Release.Split(".")(1)) <= 19 Then Continue For '如果游戏版本低于 1.20 就不进行请求 - Dim Json As String = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/neoforge/list/" & Release) - If Not Json.Contains("[]") Then '如果这个版本不支持 NeoForge,BMCLAPI 会直接返回一个空的 Json 序列,这里直接用字符串处理了 - Versions.Add(Release) - End If - Next - + Versions.Add("1.20.1") + Try + For Each Token As String In VersionsJArray("name") + Dim Version As String = Token.Replace("neoforge-", "") + Dim Inherit As String = $"1.{Version.Split(".")(0)}.{Token.Split(".")(1)}" + If Inherit.EndsWith(".0") Then Inherit = Inherit.Replace(".0", "") + Versions.Add(Inherit) + Next + Versions = Versions.Distinct().ToList() + Catch ex As Exception + Log(ex, LogLevel.Feedback) + End Try + If Not Versions.Any() Then Throw New Exception("没有可用版本") Loader.Output = New DlNeoForgeListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Versions} End Sub #End Region diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index a90fb77..7d87ce3 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1300,7 +1300,7 @@ Retry: Dim DownloadInfo = If(IsNeo, DownloadNeoInfo, DownloadForgeInfo) If IsNeo Then '兜底,有的时候 DownloadInfo 可能是空的 If DownloadNeoInfo Is Nothing Then - DownloadInfo.VersionName = Version + DownloadInfo = New DlNeoForgeVersionEntry With {.VersionName = Version} Version = Version.Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") DownloadInfo.VersionCode = Version If Version.Contains("-beta") Then DownloadInfo.IsBeta = True diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 1adeb06..687c827 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -372,20 +372,24 @@ LabForge.Foreground = ColorGray1 End If 'NeoForge - Dim NeoForgeError As String = LoadNeoForgeGetError() - CardNeoForge.MainSwap.Visibility = If(NeoForgeError Is Nothing, Visibility.Visible, Visibility.Collapsed) - If NeoForgeError IsNot Nothing Then CardNeoForge.IsSwaped = True - SetNeoForgeInfoShow(CardNeoForge.IsSwaped) - If SelectedNeoForge Is Nothing Then - BtnNeoForgeClear.Visibility = Visibility.Collapsed - ImgNeoForge.Visibility = Visibility.Collapsed - LabNeoForge.Text = If(NeoForgeError, "点击选择") - LabNeoForge.Foreground = ColorGray4 + If Not SelectedMinecraftId.Contains("1.") OrElse Val(SelectedMinecraftId.Split(".")(1)) <= 19 Then + CardNeoForge.Visibility = Visibility.Collapsed Else - BtnNeoForgeClear.Visibility = Visibility.Visible - ImgNeoForge.Visibility = Visibility.Visible - LabNeoForge.Text = SelectedNeoForge.VersionCode & If(SelectedNeoForge.IsBeta, "-beta", "") - LabNeoForge.Foreground = ColorGray1 + Dim NeoForgeError As String = LoadNeoForgeGetError() + CardNeoForge.MainSwap.Visibility = If(NeoForgeError Is Nothing, Visibility.Visible, Visibility.Collapsed) + If NeoForgeError IsNot Nothing Then CardNeoForge.IsSwaped = True + SetNeoForgeInfoShow(CardNeoForge.IsSwaped) + If SelectedNeoForge Is Nothing Then + BtnNeoForgeClear.Visibility = Visibility.Collapsed + ImgNeoForge.Visibility = Visibility.Collapsed + LabNeoForge.Text = If(NeoForgeError, "点击选择") + LabNeoForge.Foreground = ColorGray4 + Else + BtnNeoForgeClear.Visibility = Visibility.Visible + ImgNeoForge.Visibility = Visibility.Visible + LabNeoForge.Text = SelectedNeoForge.VersionCode & If(SelectedNeoForge.IsBeta, "-beta", "") + LabNeoForge.Foreground = ColorGray1 + End If End If 'Fabric If SelectedMinecraftId.Contains("1.") AndAlso Val(SelectedMinecraftId.Split(".")(1)) <= 13 Then From bec5ddd833a09a8eb8763d85884fc94706ac287a Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 30 Jun 2024 17:19:34 +0800 Subject: [PATCH 68/87] =?UTF-8?q?chores:=20=E4=BB=A3=E7=A0=81=E6=B8=85?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/Minecraft/ModDownload.vb | 22 +------------------ .../Modules/Minecraft/ModMinecraft.vb | 8 +++---- .../Modules/Minecraft/ModModpack.vb | 5 +---- .../Pages/PageDownload/ModDownloadLib.vb | 13 +++++------ 4 files changed, 11 insertions(+), 37 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 5bc3131..9f454a9 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -841,22 +841,10 @@ ''' Public VersionName As String ''' - ''' 对应的 Minecraft 版本,如“1.12.2”。 + ''' 对应的 Minecraft 版本,如“1.20.4”。 ''' Public Inherit As String ''' - ''' 发布时间,格式为“yyyy/MM/dd HH:mm”。 - ''' - Public ReleaseTime As String - ''' - ''' 文件的 MD5 或 SHA1(BMCLAPI 的老版本是 MD5,新版本是 SHA1;官方源总是 MD5)。 - ''' - Public Hash As String = Nothing - ''' - ''' 版本分支。若无分支则为 Nothing。 - ''' - Public Branch As String = Nothing - ''' ''' 是否是 Beta 版。若未提供则默认为 False。 ''' Public IsBeta As Boolean = False @@ -879,14 +867,6 @@ Public Value As JObject End Structure ''' - ''' 用于下载的文件版本名。可能在 Version 的基础上添加了分支。 - ''' - Public ReadOnly Property FileVersion As String - Get - Return VersionName & If(Branch Is Nothing, "", "-" & Branch) - End Get - End Property - ''' ''' 即将下载的文件全名。 ''' Public ReadOnly Property FileName As String diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index 676d5b1..64ffbe8 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -1208,10 +1208,10 @@ OnLoaded: .McCodeSub = ReadIni(Version.Path & "PCL\Setup.ini", "VersionOriginalSub", -1), .IsApiLoaded = True } - VersionInfo.HasFabric = VersionInfo.FabricVersion.Count > 1 - VersionInfo.HasForge = VersionInfo.ForgeVersion.Count > 1 - VersionInfo.HasNeoForge = VersionInfo.NeoForgeVersion.Count > 1 - VersionInfo.HasOptiFine = VersionInfo.OptiFineVersion.Count > 1 + VersionInfo.HasFabric = VersionInfo.FabricVersion.Any() + VersionInfo.HasForge = VersionInfo.ForgeVersion.Any() + VersionInfo.HasNeoForge = VersionInfo.NeoForgeVersion.Any() + VersionInfo.HasOptiFine = VersionInfo.OptiFineVersion.Any() Version.Version = VersionInfo End If diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 20ab3fc..c64aaef 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -388,10 +388,7 @@ Retry: Case "forge" 'eg. 14.23.5.2859 / 1.19-41.1.0 ForgeVersion = Entry.Value.ToString Log("[ModPack] 整合包 Forge 版本:" & ForgeVersion) - Case "neoforge" 'eg. 20.6.98-beta - NeoForgeVersion = Entry.Value.ToString - Log("[ModPack] 整合包 NeoForge 版本:" & NeoForgeVersion) - Case "neo-forge" 'eg. 20.6.98-beta / 有些早期的 Modrinth 整合包可能会写成这样,也检测一下 + Case "neoforge", "neo-forge" 'eg. 20.6.98-beta NeoForgeVersion = Entry.Value.ToString Log("[ModPack] 整合包 NeoForge 版本:" & NeoForgeVersion) Case "fabric-loader" 'eg. 0.14.14 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 7d87ce3..9da7e8b 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1099,7 +1099,7 @@ Retry: Files.Add(New NetFile({ $"https://bmclapi2.bangbang93.com/maven/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}", $"https://maven.neoforged.net/releases/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}" - }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) + }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=If(IsNeo, Nothing, DownloadInfo.Hash)))) Task.Output = Files End Sub) With {.ProgressWeight = 0.1, .Show = False}) Else @@ -1110,7 +1110,7 @@ Retry: Files.Add(New NetFile({ "https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName, "https://files.minecraftforge.net/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName - }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))) + }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=If(IsNeo, Nothing, DownloadInfo.Hash)))) Task.Output = Files End Sub) With {.ProgressWeight = 0.1, .Show = False}) End If @@ -1359,12 +1359,12 @@ Retry: Files = New List(Of NetFile) From {New NetFile({ $"https://bmclapi2.bangbang93.com/maven/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}", $"https://maven.neoforged.net/releases/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}" - }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))} + }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=If(IsNeo, Nothing, DownloadInfo.Hash)))} Else 'Forge Files = 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 - }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=DownloadInfo.Hash))} + }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=If(IsNeo, Nothing, DownloadInfo.Hash)))} End If Task.Output = Files End Sub) With {.ProgressWeight = 0.5, .Show = False}) @@ -1777,10 +1777,7 @@ Retry: '建立控件 Dim NewItem As New MyListItem With { .Title = If(Entry.IsBeta, Entry.VersionCode & "-beta", Entry.VersionCode), .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, - .Info = If(Entry.IsBeta, "测试版", "稳定版") & - If(Entry.ReleaseTime = "", - If(ModeDebug, If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), ""), - "发布于 " & Entry.ReleaseTime & If(ModeDebug, If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), "")), + .Info = If(Entry.IsBeta, "测试版", "稳定版"), .Logo = PathImage & "Blocks/NeoForge.png" } AddHandler NewItem.Click, OnClick From 7921184a58dfd95e28e8df0f4cad04d486b36f8f Mon Sep 17 00:00:00 2001 From: Pigeon0v0 Date: Sun, 30 Jun 2024 21:05:41 +0800 Subject: [PATCH 69/87] =?UTF-8?q?chores:=20=E4=B8=80=E4=BA=9B=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=92=8C=E5=91=BD=E5=90=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb | 2 +- .../Pages/PageDownload/PageDownloadInstall.xaml.vb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 9da7e8b..2e0d06f 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1331,7 +1331,7 @@ Retry: Loaders.Add(New LoaderTask(Of String, String)($"获取 {LoaderName} 详细信息", Sub(Task As LoaderTask(Of String, String)) '获取 Forge / NeoForge 版本列表 - Dim ForgeLoader = If(IsNeo, New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain), New LoaderTask(Of String, List(Of DlForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlForgeVersionMain)) + Dim ForgeLoader = If(IsNeo, New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadNeoForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain), New LoaderTask(Of String, List(Of DlForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlForgeVersionMain)) ForgeLoader.WaitForExit(Inherit) Task.Progress = 0.8 '查找对应版本 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 687c827..0539f22 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -75,7 +75,7 @@ End If '启动 NeoForge 加载 - If SelectedMinecraftId.StartsWith("1.") Then + If SelectedMinecraftId.StartsWith("1.") AndAlso Int(SelectedMinecraftId.Split(".")(1)) > 19 Then Dim NeoForgeLoader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion " & SelectedMinecraftId, AddressOf DlNeoForgeVersionMain) LoadNeoForge.State = NeoForgeLoader NeoForgeLoader.Start(SelectedMinecraftId) From 99c0845a1bb26da533dda3d7f43e5cb8daa63d06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=B1=E9=BB=91=E6=A3=AE=E6=9E=97?= <131975043+Deep-Dark-Forest@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:58:17 +0800 Subject: [PATCH 70/87] Update MySkin.xaml.vb --- Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index a0d6ad8..c0d838b 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -241,7 +241,7 @@ Retry: {"Translator-Chinese", "Crowdin 中文翻译者披风"}, {"Translator", "Crowdin 翻译者披风"}, {"Cobalt", "Cobalt 披风"}, {"Vanilla", "原版披风"}, {"Minecon2011", "Minecon 2011 参与者披风"}, {"Minecon2012", "Minecon 2012 参与者披风"}, {"Minecon2013", "Minecon 2013 参与者披风"}, {"Minecon2015", "Minecon 2015 参与者披风"}, {"Minecon2016", "Minecon 2016 参与者披风"}, - {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower’s","追随者披风"} + {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower's","追随者披风"} } Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}} For Each Cape In SkinData("capes") From d37572f8508bd903ae9a20b4deb08008fa46e066 Mon Sep 17 00:00:00 2001 From: Mxmilu Date: Tue, 2 Jul 2024 21:46:10 +0800 Subject: [PATCH 71/87] Fix #3819 --- Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb | 4 ++-- .../Pages/PageVersion/PageVersionSetup.xaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb index b5422ae..7501035 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb @@ -71,9 +71,9 @@ End Sub Private Sub Btn_Click(sender As Object, e As EventArgs) Handles BtnLink.Click If BtnLink.Content = "注册账号" Then - OpenWebsite(If(McVersionCurrent Is Nothing, Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent), Setup.Get("CacheAuthServerRegister"))) + OpenWebsite(Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent)) Else - Dim Website As String = If(McVersionCurrent Is Nothing, Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent), Setup.Get("CacheAuthServerRegister")) + Dim Website As String = Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent) OpenWebsite(Website.Replace("/auth/register", "/auth/forgot")) End If End Sub diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml index 72caf3d..93592a7 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml @@ -226,4 +226,4 @@ - \ No newline at end of file + From 86a51dea787aef0e6d0998075e146378616b8d8e Mon Sep 17 00:00:00 2001 From: Mxmilu Date: Wed, 3 Jul 2024 14:06:06 +0800 Subject: [PATCH 72/87] Fix #4151 --- Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb index 7501035..3476e70 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb @@ -71,9 +71,9 @@ End Sub Private Sub Btn_Click(sender As Object, e As EventArgs) Handles BtnLink.Click If BtnLink.Content = "注册账号" Then - OpenWebsite(Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent)) + OpenWebsite(If(McVersionCurrent IsNot Nothing, Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent), Setup.Get("CacheAuthServerRegister"))) Else - Dim Website As String = Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent) + Dim Website As String = If(McVersionCurrent IsNot Nothing, Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent), Setup.Get("CacheAuthServerRegister")) OpenWebsite(Website.Replace("/auth/register", "/auth/forgot")) End If End Sub From e82426399278beff13d97decb41d88242d510f0c Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 4 Jul 2024 15:57:43 +0800 Subject: [PATCH 73/87] =?UTF-8?q?:children=5Fcrossing:=20=E5=8F=AA?= =?UTF-8?q?=E6=9C=89=E4=B8=80=E9=A6=96=E9=9F=B3=E4=B9=90=E6=97=B6=E5=8F=B3?= =?UTF-8?q?=E9=94=AE=E9=87=8D=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/ModMusic.vb | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/ModMusic.vb b/Plain Craft Launcher 2/Modules/ModMusic.vb index 8377aef..c4bcdce 100644 --- a/Plain Craft Launcher 2/Modules/ModMusic.vb +++ b/Plain Craft Launcher 2/Modules/ModMusic.vb @@ -1,4 +1,6 @@ -Public Module ModMusic +Imports System.Net + +Public Module ModMusic #Region "播放列表" @@ -74,11 +76,19 @@ If MusicState = MusicStates.Pause Then FrmMain.BtnExtraMusic.Logo = Logo.IconPlay FrmMain.BtnExtraMusic.LogoScale = 0.8 - If MusicAllList.Count > 1 Then ToolTipText += vbCrLf & "左键播放,右键播放下一曲。" + If MusicAllList.Count > 1 Then + ToolTipText += vbCrLf & "左键播放,右键播放下一曲。" + Else + ToolTipText += vbCrLf & "左键播放,右键从头重新播放。" + End If Else FrmMain.BtnExtraMusic.Logo = Logo.IconMusic FrmMain.BtnExtraMusic.LogoScale = 1 - If MusicAllList.Count > 1 Then ToolTipText += vbCrLf & "左键暂停,右键播放下一曲。" + If MusicAllList.Count > 1 Then + ToolTipText += vbCrLf & "左键暂停,右键播放下一曲。" + Else + ToolTipText += vbCrLf & "左键暂停,右键从头重新播放。" + End If End If FrmMain.BtnExtraMusic.ToolTip = ToolTipText ToolTipService.SetVerticalOffset(FrmMain.BtnExtraMusic, If(ToolTipText.Contains(vbLf), 10, 16)) @@ -115,7 +125,10 @@ ''' Public Sub MusicControlNext() If MusicAllList.Count = 1 Then - Hint("播放列表中仅有一首歌曲!") + 'Hint("播放列表中仅有一首歌曲!") + MusicStartPlay(MusicCurrent) + Hint("重新播放:" & GetFileNameFromPath(MusicCurrent), HintType.Finish) + MusicRefreshUI() Else Dim Address As String = DequeueNextMusicAddress() MusicStartPlay(Address) From fca3a2cbb5dad6be2659b9aa47c16cb40360189a Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Thu, 4 Jul 2024 15:58:53 +0800 Subject: [PATCH 74/87] =?UTF-8?q?:art:=20=E5=88=A0=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=20Import=20=E2=80=A6=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Modules/ModMusic.vb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/ModMusic.vb b/Plain Craft Launcher 2/Modules/ModMusic.vb index c4bcdce..ef89bf3 100644 --- a/Plain Craft Launcher 2/Modules/ModMusic.vb +++ b/Plain Craft Launcher 2/Modules/ModMusic.vb @@ -1,6 +1,4 @@ -Imports System.Net - -Public Module ModMusic +Public Module ModMusic #Region "播放列表" From f999da7cce647e475ccb8d50024f195473306653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=99=E8=85=BE=E7=8C=AB=E8=B7=83?= <1043137532@qq.com> Date: Thu, 4 Jul 2024 22:09:58 +0800 Subject: [PATCH 75/87] =?UTF-8?q?=E5=85=81=E8=AE=B8=E5=9C=A8=20<100=20?= =?UTF-8?q?=E4=BA=BA=E7=9A=84=20QQ=20=E7=BE=A4=E5=86=85=E5=88=86=E5=8F=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8E=E7=9A=84=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENCE | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/LICENCE b/LICENCE index 4c8869c..9bd5dbe 100644 --- a/LICENCE +++ b/LICENCE @@ -18,7 +18,7 @@   (二)不得以任何方式暗示开发者为您或您的使用作担保。   (三)给出适当的说明,表示这是第三方内容。在 GitHub 上直接进行 Fork 是允许的。   (四)使用本指南文件作为协议,不得附加额外条款。 -  (五)不得分发编译后的可执行文件。 +  (五)不得分发编译后的可执行文件。唯一的例外是,你可以在明确禁止再次分发的前提下,在小于 100 人的 QQ 群内分发编译后的可执行文件。 ———————————— @@ -27,9 +27,5 @@ 因为没有法律专业人士检查,所以这不敢作为正式的法律协议,如果有专业人士愿意帮忙改一改我也很乐意…… 这些规则主要是为了阻止恶意的使用和 “山寨版” 的出现,常规、善意的使用都没啥问题的,放心吧! -如果你只是想参考一下,或者用了一小部分代码: -  署名就行啦。 -如果你整了个魔改版,或者用了一大堆代码: -  你不能把编译后的文件发给其他人,但可以私下使用。 -如果你修改了代码,并且打算公开: -  请仔细参考上面的第三条。 +如果你只是想参考一下,或者用了一小部分代码,署个名就行啦。 +如果你整了个魔改版,或者用了一大堆代码,请仔细参考上面的第三条。 From 7b0e9257487f932d8a5c9c2401ac4544faa352d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=99=E8=85=BE=E7=8C=AB=E8=B7=83?= <1043137532@qq.com> Date: Sat, 6 Jul 2024 07:18:48 +0800 Subject: [PATCH 76/87] 2.8.0 --- Plain Craft Launcher 2/Controls/MyCard.vb | 32 +- .../Controls/MyPageRight.vb | 14 +- Plain Craft Launcher 2/FormMain.xaml.vb | 23 +- .../Modules/Base/ModBase.vb | 139 ++--- Plain Craft Launcher 2/Modules/Base/ModNet.vb | 26 +- .../Modules/Minecraft/ModComp.vb | 9 +- .../Modules/Minecraft/ModCrash.vb | 4 +- .../Modules/Minecraft/ModDownload.vb | 510 +++++++----------- .../Modules/Minecraft/ModJava.vb | 53 +- .../Modules/Minecraft/ModLaunch.vb | 9 +- .../Modules/Minecraft/ModMinecraft.vb | 86 +-- .../Modules/Minecraft/ModMod.vb | 22 +- .../Modules/Minecraft/ModModpack.vb | 20 +- Plain Craft Launcher 2/Modules/ModEvent.vb | 9 +- Plain Craft Launcher 2/Modules/ModMusic.vb | 15 +- Plain Craft Launcher 2/Modules/ModSecret.vb | 1 + .../My Project/AssemblyInfo.vb | 4 +- .../Pages/PageDownload/ModDownloadLib.vb | 366 ++++++------- .../PageDownload/PageDownloadClient.xaml.vb | 2 +- .../PageDownloadCompDetail.xaml.vb | 40 +- .../PageDownload/PageDownloadForge.xaml.vb | 4 +- .../PageDownload/PageDownloadInstall.xaml | 3 +- .../PageDownload/PageDownloadInstall.xaml.vb | 176 +++--- .../Pages/PageDownload/PageDownloadLeft.xaml | 37 +- .../PageDownload/PageDownloadLeft.xaml.vb | 48 +- .../PageDownloadLiteLoader.xaml.vb | 2 +- .../Pages/PageDownload/PageDownloadMod.xaml | 1 + .../PageDownload/PageDownloadMod.xaml.vb | 23 +- .../PageDownload/PageDownloadNeoForge.xaml | 12 +- .../PageDownload/PageDownloadNeoForge.xaml.vb | 40 +- .../PageDownload/PageDownloadOptiFine.xaml.vb | 8 +- .../Pages/PageDownload/PageDownloadPack.xaml | 1 + .../PageDownload/PageDownloadPack.xaml.vb | 12 +- .../Pages/PageLaunch/MySkin.xaml.vb | 2 +- .../Pages/PageLaunch/PageLaunchRight.xaml.vb | 22 +- .../Pages/PageLaunch/PageLoginMs.xaml.vb | 17 +- .../Pages/PageOther/PageOtherAbout.xaml | 435 ++++++++++----- .../Pages/PageSelectRight.xaml.vb | 12 +- .../Pages/PageSetup/PageSetupLaunch.xaml.vb | 32 +- .../Pages/PageSetup/PageSetupUI.xaml.vb | 10 +- .../Pages/PageVersion/PageVersionMod.xaml.vb | 6 +- .../PageVersion/PageVersionModDisabled.xaml | 2 +- .../PageVersion/PageVersionOverall.xaml.vb | 26 +- .../Pages/PageVersion/PageVersionSetup.xaml | 34 +- .../PageVersion/PageVersionSetup.xaml.vb | 9 +- .../Plain Craft Launcher 2.vbproj | 21 +- Plain Craft Launcher 2/Resources/Custom.xaml | 30 +- 47 files changed, 1207 insertions(+), 1202 deletions(-) diff --git a/Plain Craft Launcher 2/Controls/MyCard.vb b/Plain Craft Launcher 2/Controls/MyCard.vb index 0cb673f..8ae95ef 100644 --- a/Plain Craft Launcher 2/Controls/MyCard.vb +++ b/Plain Craft Launcher 2/Controls/MyCard.vb @@ -98,21 +98,13 @@ '排序 Select Case Type Case 3 - Stack.Tag = Sort(CType(Stack.Tag, List(Of DlOptiFineListEntry)), Function(Left As DlOptiFineListEntry, Right As DlOptiFineListEntry) As Boolean - Return VersionSortBoolean(Left.NameDisplay, Right.NameDisplay) - End Function) + Stack.Tag = Sort(CType(Stack.Tag, List(Of DlOptiFineListEntry)), Function(a, b) VersionSortBoolean(a.NameDisplay, b.NameDisplay)) Case 4, 10 - Stack.Tag = Sort(CType(Stack.Tag, List(Of DlLiteLoaderListEntry)), Function(Left As DlLiteLoaderListEntry, Right As DlLiteLoaderListEntry) As Boolean - Return VersionSortBoolean(Left.Inherit, Right.Inherit) - End Function) + Stack.Tag = Sort(CType(Stack.Tag, List(Of DlLiteLoaderListEntry)), Function(a, b) VersionSortBoolean(a.Inherit, b.Inherit)) Case 6 - Stack.Tag = Sort(CType(Stack.Tag, List(Of DlForgeVersionEntry)), Function(Left As DlForgeVersionEntry, Right As DlForgeVersionEntry) As Boolean - Return VersionSortBoolean(Left.Version, Right.Version) - End Function) + Stack.Tag = Sort(CType(Stack.Tag, List(Of DlForgeVersionEntry)), Function(a, b) a.Version > b.Version) Case 8, 9 - Stack.Tag = Sort(CType(Stack.Tag, List(Of CompFile)), Function(Left As CompFile, Right As CompFile) As Boolean - Return Left.ReleaseDate > Right.ReleaseDate - End Function) + Stack.Tag = Sort(CType(Stack.Tag, List(Of CompFile)), Function(a, b) a.ReleaseDate > b.ReleaseDate) End Select '控件转换 Select Case Type @@ -128,16 +120,6 @@ ForgeDownloadListItemPreload(Stack, Stack.Tag, AddressOf ForgeSave_Click, True) Case 8 CompFilesCardPreload(Stack, Stack.Tag) - Case 13 - Dim LoadingPickaxe As New MyLoading With {.Text = "正在获取版本列表", .Margin = New Thickness(5)} - Dim Loader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion Main", AddressOf DlNeoForgeVersionMain) - LoadingPickaxe.State = Loader - Loader.Start(Stack.Tag) - AddHandler LoadingPickaxe.StateChanged, AddressOf FrmDownloadNeoForge.NeoForge_StateChanged - AddHandler LoadingPickaxe.Click, AddressOf FrmDownloadNeoForge.NeoForge_Click - Stack.Children.Add(LoadingPickaxe) - Case 14 - NeoForgeDownloadListItemPreload(Stack, Stack.Tag, AddressOf NeoForgeSave_Click, True) End Select '实现控件虚拟化 For Each Data As Object In Stack.Tag @@ -154,9 +136,8 @@ Case 6 Stack.Children.Add(ForgeDownloadListItem(Data, AddressOf ForgeSave_Click, True)) Case 7 - Stack.Children.Add(McDownloadListItem(Data, Sub(sender, e) '不能使用 AddressOf,这导致了 #535,原因完全不明,疑似是编译器 Bug - FrmDownloadInstall.MinecraftSelected(sender, e) - End Sub, False)) + '不能使用 AddressOf,这导致了 #535,原因完全不明,疑似是编译器 Bug + Stack.Children.Add(McDownloadListItem(Data, Sub(sender, e) FrmDownloadInstall.MinecraftSelected(sender, e), False)) Case 8 If CType(Stack.Tag, List(Of CompFile)).Distinct(Function(a, b) a.DisplayName = b.DisplayName).Count <> CType(Stack.Tag, List(Of CompFile)).Count Then @@ -182,7 +163,6 @@ Case 12 Stack.Children.Add(FabricDownloadListItem(CType(Data, JObject), AddressOf FrmDownloadInstall.Fabric_Selected)) Case 13 - Case 14 Stack.Children.Add(NeoForgeDownloadListItem(Data, AddressOf NeoForgeSave_Click, True)) Case Else Log("未知的虚拟化种类:" & Type, LogLevel.Feedback) diff --git a/Plain Craft Launcher 2/Controls/MyPageRight.vb b/Plain Craft Launcher 2/Controls/MyPageRight.vb index 9d1db6e..4fafd60 100644 --- a/Plain Craft Launcher 2/Controls/MyPageRight.vb +++ b/Plain Craft Launcher 2/Controls/MyPageRight.vb @@ -74,13 +74,13 @@ '添加结束 Invoke If FinishedInvoke IsNot Nothing Then AddHandler RealLoader.PreviewFinish, - Sub() - Do While PageState = MyPageRight.PageStates.PageExit OrElse PageState = MyPageRight.PageStates.ContentExit - Thread.Sleep(10) '不在退出动画时执行 UI 线程操作,避免退出动画被重置 - Loop - RunInUiWait(Sub() FinishedInvoke(RealLoader)) - Thread.Sleep(20) '由于大量初始化控件会导致掉帧,延迟触发 State 改变事件 - End Sub + Sub() + Do While PageState = MyPageRight.PageStates.PageExit OrElse PageState = MyPageRight.PageStates.ContentExit + Thread.Sleep(10) '不在退出动画时执行 UI 线程操作,避免退出动画被重置 + Loop + RunInUiWait(Sub() FinishedInvoke(RealLoader)) + Thread.Sleep(20) '由于大量初始化控件会导致掉帧,延迟触发 State 改变事件 + End Sub End If AddHandler RealLoader.OnStateChangedUi, Sub(Loader As LoaderBase, NewState As LoadState, OldState As LoadState) RunInUi(Sub() PageLoaderState(Loader, NewState, OldState)) '隐藏 UI diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 339404b..71b426d 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -10,6 +10,13 @@ Public Class FormMain Dim FeatureList As New List(Of KeyValuePair(Of Integer, String)) '统计更新日志条目 #If BETA Then + If LastVersion < 326 Then 'Release 2.7.4 + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "会自动隐藏明显不可用的自动安装选项")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化正版登录流程和 MC 性能")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复正版登录时弹出脚本错误提示的 Bug")) + FeatureCount += 17 + BugCount += 19 + End If If LastVersion < 323 Then 'Release 2.7.3 FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "添加 启动游戏前进行内存优化 设置")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化 MC 性能")) @@ -108,6 +115,12 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- + If LastVersion < 327 Then 'Snapshot 2.8.0 + FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "NeoForge 兼容与自动安装")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "支持编译、运行 PCL 开源代码")) + FeatureCount += 11 + BugCount += 14 + End If If LastVersion < 325 Then 'Snapshot 2.7.4 FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "会自动隐藏明显不可用的自动安装选项")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化正版登录流程和 MC 性能")) @@ -1019,11 +1032,11 @@ Install: DownloadClient = 4 DownloadOptiFine = 5 DownloadForge = 6 - DownloadNeoForge = 13 - DownloadFabric = 7 - DownloadLiteLoader = 8 - DownloadMod = 10 - DownloadPack = 11 + DownloadNeoForge = 7 + DownloadFabric = 8 + DownloadLiteLoader = 9 + DownloadMod = 11 + DownloadPack = 12 SetupLaunch = 0 SetupUI = 1 SetupSystem = 2 diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 00e4bcc..89f1887 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -11,12 +11,12 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.7.4" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.7.4." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.8.0" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.8.0." & VersionBranchCode '标准格式的四段式版本号 #If BETA Then - Public Const VersionCode As Integer = 323 'Release + Public Const VersionCode As Integer = 326 'Release #Else - Public Const VersionCode As Integer = 325 'Snapshot + Public Const VersionCode As Integer = 327 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName @@ -2065,15 +2065,16 @@ NextElement: ''' 在新的工作线程中执行代码。 ''' Public Function RunInNewThread(Action As Action, Name As String, Optional Priority As ThreadPriority = ThreadPriority.Normal) As Thread - Dim th As New Thread(Sub() - Try - Action() - Catch ex As ThreadInterruptedException - Log(Name & ":线程已中止") - Catch ex As Exception - Log(ex, Name & ":线程执行失败", LogLevel.Feedback) - End Try - End Sub) With {.Name = Name, .Priority = Priority} + Dim th As New Thread( + Sub() + Try + Action() + Catch ex As ThreadInterruptedException + Log(Name & ":线程已中止") + Catch ex As Exception + Log(ex, Name & ":线程执行失败", LogLevel.Feedback) + End Try + End Sub) With {.Name = Name, .Priority = Priority} th.Start() Return th End Function @@ -2186,8 +2187,9 @@ NextElement: ''' Public Sub OpenWebsite(Url As String) Try - ' 允许 Minecraft 基岩版的 URLScheme (#3985) - If Not Url.StartsWithF("http", True) Or Not Url.StartsWithF("minecraft://") Then Throw New Exception(Url & " 不是一个有效的网址,它必须以 http 开头!") + If Not Url.StartsWithF("http", True) AndAlso Not Url.StartsWithF("minecraft://", True) Then + Throw New Exception(Url & " 不是一个有效的网址,它必须以 http 开头!") + End If Log("[System] 正在打开网页:" & Url) Process.Start(Url) Catch ex As Exception @@ -2212,25 +2214,27 @@ NextElement: ''' 设置剪贴板。将在另一线程运行,且不会抛出异常。 ''' Public Sub ClipboardSet(Text As String, Optional ShowSuccessHint As Boolean = True) - RunInThread(Sub() - Dim RetryCount As Integer = 0 + RunInThread( + Sub() + Dim RetryCount As Integer = 0 Retry: - Try - RunInUi(Sub() - My.Computer.Clipboard.Clear() - My.Computer.Clipboard.SetText(Text) - End Sub) - Catch ex As Exception - RetryCount += 1 - If RetryCount <= 5 Then - Thread.Sleep(20) - GoTo Retry - Else - Log(ex, "可能由于剪贴板被其他程序占用,文本复制失败", LogLevel.Hint) - End If - End Try - If ShowSuccessHint Then Hint("已成功复制!", HintType.Finish) - End Sub) + Try + RunInUi( + Sub() + My.Computer.Clipboard.Clear() + My.Computer.Clipboard.SetText(Text) + End Sub) + Catch ex As Exception + RetryCount += 1 + If RetryCount <= 5 Then + Thread.Sleep(20) + GoTo Retry + Else + Log(ex, "可能由于剪贴板被其他程序占用,文本复制失败", LogLevel.Hint) + End If + End Try + If ShowSuccessHint Then Hint("已成功复制!", HintType.Finish) + End Sub) End Sub ''' @@ -2449,39 +2453,40 @@ Retry: Private LogList As New StringBuilder Private LogWritter As StreamWriter Public Sub LogStart() - RunInNewThread(Sub() - Dim IsInitSuccess As Boolean = True - Try - For i = 4 To 1 Step -1 - If File.Exists(Path & "PCL\Log" & i & ".txt") Then - If File.Exists(Path & "PCL\Log" & (i + 1) & ".txt") Then File.Delete(Path & "PCL\Log" & (i + 1) & ".txt") - CopyFile(Path & "PCL\Log" & i & ".txt", Path & "PCL\Log" & (i + 1) & ".txt") - End If - Next - File.Create(Path & "PCL\Log1.txt").Dispose() - Catch ex As IOException - IsInitSuccess = False - Hint("可能同时开启了多个 PCL,程序可能会出现未知问题!", HintType.Critical) - Log(ex, "日志初始化失败(疑似文件占用问题)") - Catch ex As Exception - IsInitSuccess = False - Log(ex, "日志初始化失败", LogLevel.Hint) - End Try - Try - LogWritter = New StreamWriter(Path & "PCL\Log1.txt", True) With {.AutoFlush = True} - Catch ex As Exception - LogWritter = Nothing - Log(ex, "日志写入失败", LogLevel.Hint) - End Try - While True - If IsInitSuccess Then - LogFlush() - Else - LogList = New StringBuilder '清空 LogList 避免内存爆炸 - End If - Thread.Sleep(50) - End While - End Sub, "Log Writer", ThreadPriority.Lowest) + RunInNewThread( + Sub() + Dim IsInitSuccess As Boolean = True + Try + For i = 4 To 1 Step -1 + If File.Exists(Path & "PCL\Log" & i & ".txt") Then + If File.Exists(Path & "PCL\Log" & (i + 1) & ".txt") Then File.Delete(Path & "PCL\Log" & (i + 1) & ".txt") + CopyFile(Path & "PCL\Log" & i & ".txt", Path & "PCL\Log" & (i + 1) & ".txt") + End If + Next + File.Create(Path & "PCL\Log1.txt").Dispose() + Catch ex As IOException + IsInitSuccess = False + Hint("可能同时开启了多个 PCL,程序可能会出现未知问题!", HintType.Critical) + Log(ex, "日志初始化失败(疑似文件占用问题)") + Catch ex As Exception + IsInitSuccess = False + Log(ex, "日志初始化失败", LogLevel.Hint) + End Try + Try + LogWritter = New StreamWriter(Path & "PCL\Log1.txt", True) With {.AutoFlush = True} + Catch ex As Exception + LogWritter = Nothing + Log(ex, "日志写入失败", LogLevel.Hint) + End Try + While True + If IsInitSuccess Then + LogFlush() + Else + LogList = New StringBuilder '清空 LogList 避免内存爆炸 + End If + Thread.Sleep(50) + End While + End Sub, "Log Writer", ThreadPriority.Lowest) End Sub Private ReadOnly LogFlushLock As New Object '防止外部调用 LogFlush 时同时输出多次日志 Public Sub LogFlush() @@ -2714,4 +2719,4 @@ Retry: #End Region -End Module +End Module \ No newline at end of file diff --git a/Plain Craft Launcher 2/Modules/Base/ModNet.vb b/Plain Craft Launcher 2/Modules/Base/ModNet.vb index de97191..8929ea2 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModNet.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModNet.vb @@ -341,14 +341,15 @@ Retry: Dim RequestEx As Exception = Nothing Dim FailCount As Integer = 0 For i = 1 To RequestCount - Dim th As New Thread(Sub() - Try - RequestResult = NetRequestOnce(Url, Method, Data, ContentType, 30000, Headers) - Catch ex As Exception - FailCount += 1 - RequestEx = ex - End Try - End Sub) + Dim th As New Thread( + Sub() + Try + RequestResult = NetRequestOnce(Url, Method, Data, ContentType, 30000, Headers) + Catch ex As Exception + FailCount += 1 + RequestEx = ex + End Try + End Sub) th.Start() Threads.Add(th) Thread.Sleep(i * 250) @@ -382,7 +383,7 @@ RequestFinished: Dim Resp As WebResponse = Nothing Dim Req As HttpWebRequest Try - Req = WebRequest.Create(New Uri(Url)) + Req = WebRequest.Create(Url) Req.Method = Method Dim SendData As Byte() If TypeOf Data Is Byte() Then @@ -1859,15 +1860,10 @@ Retry: Try While True Thread.Sleep(20) - '若已完成,则清空 - If Id = 0 AndAlso FileRemain = 0 AndAlso Files.Any() Then - SyncLock LockFiles - Files.Clear() - End SyncLock - End If '获取文件列表 Dim AllFiles As List(Of NetFile) SyncLock LockFiles + If Id = 0 AndAlso FileRemain = 0 AndAlso Files.Any() Then Files.Clear() '若已完成,则清空 AllFiles = Files.Values.ToList() End SyncLock Dim WaitingFiles As New List(Of NetFile) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb index 39dbf53..5d32043 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb @@ -355,12 +355,12 @@ ModLoaders = New List(Of CompModLoaderType) For Each Category In Data("categories").Select(Function(t) t.ToString) Select Case Category - '加载器 + '加载器 Case "forge" : ModLoaders.Add(CompModLoaderType.Forge) Case "fabric" : ModLoaders.Add(CompModLoaderType.Fabric) Case "quilt" : ModLoaders.Add(CompModLoaderType.Quilt) Case "neoforge" : ModLoaders.Add(CompModLoaderType.NeoForge) - 'Mod + 'Mod Case "worldgen" : Tags.Add("世界元素") Case "technology" : Tags.Add("科技") Case "food" : Tags.Add("食物/烹饪") @@ -376,7 +376,7 @@ Case "social" : Tags.Add("服务器") Case "utility" : Tags.Add("改良") Case "library" : Tags.Add("支持库") - '整合包 + '整合包 Case "multiplayer" : Tags.Add("多人") Case "optimization" : Tags.Add("性能优化") Case "challenging" : Tags.Add("硬核") @@ -387,7 +387,7 @@ Case "adventure" : Tags.Add("冒险") Case "kitchen-sink" : Tags.Add("烹饪") Case "lightweight" : Tags.Add("轻量") - 'FUTURE: Res + 'FUTURE: Res End Select Next If Not Tags.Any() Then Tags.Add("杂项") @@ -1320,6 +1320,7 @@ Retry: Dim RawLoaders As List(Of String) = Data("loaders").Select(Function(v) v.ToString).ToList ModLoaders = New List(Of CompModLoaderType) If RawLoaders.Contains("forge") Then ModLoaders.Add(CompModLoaderType.Forge) + If RawLoaders.Contains("neoforge") Then ModLoaders.Add(CompModLoaderType.NeoForge) If RawLoaders.Contains("fabric") Then ModLoaders.Add(CompModLoaderType.Fabric) If RawLoaders.Contains("quilt") Then ModLoaders.Add(CompModLoaderType.Quilt) #End Region diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb index ef52547..3f9aab0 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb @@ -697,8 +697,8 @@ NextStack: "forge", "setup", "block", "model", "mixin", "event", "unimi", "netty", "world", "gitlab", "common", "server", "config", "loader", "launch", "entity", "assist", "client", "plugin", "modapi", "mojang", "shader", "events", "github", "recipe", "render", "packet", "events", "preinit", "preload", "machine", "reflect", "channel", "general", "handler", "content", "systems", "modules", "service", - "fastutil", "optifine", "internal", "platform", "override", "fabricmc", - "injection", "listeners", "scheduler", "minecraft", "transformer", "transformers", "universal", "multipart", "minecraftforge", "blockentity", "spongepowered", "electronwill" + "fastutil", "optifine", "internal", "platform", "override", "fabricmc", "neoforge", + "injection", "listeners", "scheduler", "minecraft", "transformer", "transformers", "neoforged", "universal", "multipart", "minecraftforge", "blockentity", "spongepowered", "electronwill" }.Contains(Word.ToLower) Then Continue For PossibleWords.Add(Word.Trim) Next diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 9f454a9..1ded676 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -220,7 +220,7 @@ End If Setup.Set("ToolUpdateSnapshotLast", If(Version, "Nothing")) Catch ex As Exception - Throw New Exception("版本列表解析失败", ex) + Throw New Exception("Minecraft 官方源版本列表解析失败", ex) End Try End Sub ''' @@ -237,7 +237,7 @@ '返回 Loader.Output = New DlClientListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Json} Catch ex As Exception - Throw New Exception("版本列表解析失败(" & Json.ToString & ")", ex) + Throw New Exception("Minecraft BMCLAPI 版本列表解析失败(" & Json.ToString & ")", ex) End Try End Sub @@ -288,6 +288,7 @@ ''' Public Value As List(Of DlOptiFineListEntry) End Structure + Public Class DlOptiFineListEntry ''' ''' 显示名称,已去除 HD_U 字样,如“1.12.2 C8”。 @@ -359,29 +360,33 @@ Private Sub DlOptiFineListOfficialMain(Loader As LoaderTask(Of Integer, DlOptiFineListResult)) Dim Result As String = NetGetCodeByClient("https://optifine.net/downloads", Encoding.Default) If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")") - '获取所有版本信息 - Dim Forge As List(Of String) = RegexSearch(Result, "(?<=colForge'>)[^<]*") - Dim ReleaseTime As List(Of String) = RegexSearch(Result, "(?<=colDate'>)[^<]+") - Dim Name As List(Of String) = RegexSearch(Result, "(?<=OptiFine_)[0-9A-Za-z_.]+(?=.jar"")") - If Not ReleaseTime.Count = Name.Count Then Throw New Exception("版本与发布时间数据无法对应") - If Not Forge.Count = Name.Count Then Throw New Exception("版本与 Forge 兼容数据无法对应") - If ReleaseTime.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")") - '转化为列表输出 - Dim Versions As New List(Of DlOptiFineListEntry) - For i = 0 To ReleaseTime.Count - 1 - Name(i) = Name(i).Replace("_", " ") - Dim Entry As New DlOptiFineListEntry With { - .NameDisplay = Name(i).Replace("HD U ", "").Replace(".0 ", " "), - .ReleaseTime = Join({ReleaseTime(i).Split(".")(2), ReleaseTime(i).Split(".")(1), ReleaseTime(i).Split(".")(0)}, "/"), - .IsPreview = Name(i).ContainsF("pre", True), - .Inherit = Name(i).ToString.Split(" ")(0), - .NameFile = If(Name(i).ContainsF("pre", True), "preview_", "") & "OptiFine_" & Name(i).Replace(" ", "_") & ".jar", - .RequiredForgeVersion = Forge(i).Replace("Forge ", "").Replace("#", "")} - If Entry.RequiredForgeVersion.Contains("N/A") Then Entry.RequiredForgeVersion = Nothing - Entry.NameVersion = Entry.Inherit & "-OptiFine_" & Name(i).ToString.Replace(" ", "_").Replace(Entry.Inherit & "_", "") - Versions.Add(Entry) - Next - Loader.Output = New DlOptiFineListResult With {.IsOfficial = True, .SourceName = "OptiFine 官方源", .Value = Versions} + Try + '获取所有版本信息 + Dim Forge As List(Of String) = RegexSearch(Result, "(?<=colForge'>)[^<]*") + Dim ReleaseTime As List(Of String) = RegexSearch(Result, "(?<=colDate'>)[^<]+") + Dim Name As List(Of String) = RegexSearch(Result, "(?<=OptiFine_)[0-9A-Za-z_.]+(?=.jar"")") + If Not ReleaseTime.Count = Name.Count Then Throw New Exception("版本与发布时间数据无法对应") + If Not Forge.Count = Name.Count Then Throw New Exception("版本与 Forge 兼容数据无法对应") + If ReleaseTime.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")") + '转化为列表输出 + Dim Versions As New List(Of DlOptiFineListEntry) + For i = 0 To ReleaseTime.Count - 1 + Name(i) = Name(i).Replace("_", " ") + Dim Entry As New DlOptiFineListEntry With { + .NameDisplay = Name(i).Replace("HD U ", "").Replace(".0 ", " "), + .ReleaseTime = Join({ReleaseTime(i).Split(".")(2), ReleaseTime(i).Split(".")(1), ReleaseTime(i).Split(".")(0)}, "/"), + .IsPreview = Name(i).ContainsF("pre", True), + .Inherit = Name(i).ToString.Split(" ")(0), + .NameFile = If(Name(i).ContainsF("pre", True), "preview_", "") & "OptiFine_" & Name(i).Replace(" ", "_") & ".jar", + .RequiredForgeVersion = Forge(i).Replace("Forge ", "").Replace("#", "")} + If Entry.RequiredForgeVersion.Contains("N/A") Then Entry.RequiredForgeVersion = Nothing + Entry.NameVersion = Entry.Inherit & "-OptiFine_" & Name(i).ToString.Replace(" ", "_").Replace(Entry.Inherit & "_", "") + Versions.Add(Entry) + Next + Loader.Output = New DlOptiFineListResult With {.IsOfficial = True, .SourceName = "OptiFine 官方源", .Value = Versions} + Catch ex As Exception + Throw New Exception("OptiFine 官方源版本列表解析失败(" & Result & ")", ex) + End Try End Sub ''' @@ -407,7 +412,7 @@ Next Loader.Output = New DlOptiFineListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Versions} Catch ex As Exception - Throw New Exception("版本列表解析失败(" & Json.ToString & ")", ex) + Throw New Exception("OptiFine BMCLAPI 版本列表解析失败(" & Json.ToString & ")", ex) End Try End Sub @@ -485,15 +490,61 @@ #Region "DlForgeVersion | Forge 版本列表" - Public Class DlForgeVersionEntry + Public MustInherit Class DlForgelikeEntry + Public IsNeoForge As Boolean ''' - ''' 完整的版本名,如 “14.22.1.2478”。 + ''' 加载器名称。Forge 或 NeoForge。 ''' - Public Version As String + Public ReadOnly Property LoaderName As String + Get + Return If(IsNeoForge, "NeoForge", "Forge") + End Get + End Property + ''' + ''' 文件扩展名。不以小数点开头。 + ''' + Public ReadOnly Property FileExtension As String + Get + If IsNeoForge Then + Return "jar" + Else + Return If(CType(Me, DlForgeVersionEntry).Category = "installer", "jar", "zip") + End If + End Get + End Property + ''' + ''' Forge:MC 版本是否小于 1.13。 + ''' NeoForge:MC 版本是否为 1.20.1。 + ''' + Public ReadOnly Property IsLegacy As Boolean + Get + '虽然很抽象,但确实可以这样判断 + 'Forge:1.13+ 的版本号首位都大于 20 + 'NeoForge:1.20.1 的版本号首位人为规定为 19 开头 + Return Version.Major < 20 + End Get + End Property + ''' + ''' 标准化后的版本号,仅可用于比较与排序。 + ''' 格式:Major.Minor.Build.Revision + ''' Forge:如 “50.1.9.0”(最后一位固定为 0)、“14.22.1.2478”(Legacy)。 + ''' NeoForge:如 “20.4.30.0”(最后一位固定为 0)、“19.47.1.99”(Legacy:第一位固定为 19)。 + ''' + Public Version As Version + ''' + ''' 可对玩家显示的非格式化版本名。 + ''' Forge:如 “50.1.9”、“14.22.1.2478”(Legacy)。 + ''' NeoForge:如 “20.4.30-beta”、“47.1.99”(Legacy)。 + ''' + Public VersionName As String ''' ''' 对应的 Minecraft 版本,如“1.12.2”。 ''' Public Inherit As String + End Class + + Public Class DlForgeVersionEntry + Inherits DlForgelikeEntry ''' ''' 发布时间,格式为“yyyy/MM/dd HH:mm”。 ''' @@ -511,58 +562,21 @@ ''' Public Category As String ''' - ''' 版本分支。若无分支则为 Nothing。 - ''' - Public Branch As String = Nothing - ''' - ''' 是否为新版 Forge。(即为 Minecraft 1.13+) - ''' - Public ReadOnly Property IsNewType As Boolean - Get - Return Version.Split(".")(0) >= 20 - End Get - End Property - ''' - ''' 构建数。 - ''' - Public ReadOnly Property Build As Integer - Get - Dim Version = Me.Version.Split(".") - If Version(0) < 15 Then - Return Version(Version.Count - 1) - Else - Return Version(Version.Count - 1) + 10000 - End If - End Get - End Property - ''' ''' 用于下载的文件版本名。可能在 Version 的基础上添加了分支。 ''' - Public ReadOnly Property FileVersion As String - Get - Return Version & If(Branch Is Nothing, "", "-" & Branch) - End Get - End Property - ''' - ''' 即将下载的文件全名。 - ''' - Public ReadOnly Property FileName As String - Get - Return "forge-" & Inherit & "-" & FileVersion & "-" & Category & "." & FileSuffix - End Get - End Property - ''' - ''' 文件扩展名。 - ''' - Public ReadOnly Property FileSuffix As String - Get - If Category = "installer" Then - Return "jar" - Else - Return "zip" - End If - End Get - End Property + Public FileVersion As String + + Public Sub New(Version As String, Branch As String, Inherit As String) + '司马版本的特殊处理 + If Version = "11.15.1.2318" OrElse Version = "11.15.1.1902" OrElse Version = "11.15.1.1890" Then Branch = "1.8.9" + If Branch Is Nothing AndAlso Inherit = "1.7.10" AndAlso Version.Split(".")(3) >= 1300 Then Branch = "1.7.10" + '为 DlForgelikeEntry 提供所有信息 + IsNeoForge = False + VersionName = Version + Me.Version = New Version(Version) + Me.Inherit = Inherit + FileVersion = Version & If(Branch Is Nothing, "", "-" & Branch) + End Sub End Class ''' @@ -620,8 +634,6 @@ '分支获取 Dim Branch As String = RegexSeek(VersionCode, $"(?<=-{Name}-)[^-""]+(?=-[a-z]+.[a-z]{{3}})") If String.IsNullOrWhiteSpace(Branch) Then Branch = Nothing - If Name = "11.15.1.2318" OrElse Name = "11.15.1.1902" OrElse Name = "11.15.1.1890" Then Branch = "1.8.9" - If Branch Is Nothing AndAlso Inherit = "1.7.10" AndAlso Name.Split(".")(3) >= 1300 Then Branch = "1.7.10" '发布时间获取 Dim ReleaseTimeOriginal = RegexSeek(VersionCode, "(?<=""download-time"" title="")[^""]+") Dim ReleaseTimeSplit = ReleaseTimeOriginal.Split(" -:".ToCharArray) '原格式:"2021-02-15 03:24:02" @@ -651,13 +663,13 @@ Continue For End If '添加进列表 - Versions.Add(New DlForgeVersionEntry With {.Category = Category, .Version = Name, .IsRecommended = IsRecommended, .Hash = MD5.Trim(vbCr, vbLf), .Inherit = Inherit, .ReleaseTime = ReleaseTime, .Branch = Branch}) + Versions.Add(New DlForgeVersionEntry(Name, Branch, Inherit) With {.Category = Category, .IsRecommended = IsRecommended, .Hash = MD5.Trim(vbCr, vbLf), .ReleaseTime = ReleaseTime}) Catch ex As Exception - Throw New Exception("版本信息提取失败(" & VersionCode & ")", ex) + Throw New Exception("Forge 官方源版本信息提取失败(" & VersionCode & ")", ex) End Try Next Catch ex As Exception - Throw New Exception("版本列表解析失败(" & Result & ")", ex) + Throw New Exception("Forge 官方源版本列表解析失败(" & Result & ")", ex) End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") Loader.Output = Versions @@ -700,20 +712,17 @@ End Select Next '获取 Entry - Dim Inherit As String = Loader.Input Dim Branch As String = Token("branch") Dim Name As String = Token("version") - If Name = "11.15.1.2318" OrElse Name = "11.15.1.1902" OrElse Name = "11.15.1.1890" Then Branch = "1.8.9" - If Branch Is Nothing AndAlso Inherit = "1.7.10" AndAlso Name.Split(".")(3) >= 1300 Then Branch = "1.7.10" '基础信息获取 - Dim Entry = New DlForgeVersionEntry With {.Hash = Hash, .Category = Category, .Version = Name, .Branch = Branch, .Inherit = Inherit, .IsRecommended = Recommended = Name} + Dim Entry = New DlForgeVersionEntry(Name, Branch, Loader.Input) With {.Hash = Hash, .Category = Category, .IsRecommended = Recommended = Name} Dim TimeSplit = Token("modified").ToString.Split("-"c, "T"c, ":"c, "."c, " "c, "/"c) Entry.ReleaseTime = Token("modified").ToObject(Of Date).ToLocalTime.ToString("yyyy'/'MM'/'dd HH':'mm") '添加项 Versions.Add(Entry) Next Catch ex As Exception - Throw New Exception("版本列表解析失败(" & Json.ToString & ")", ex) + Throw New Exception("Forge BMCLAPI 版本列表解析失败(" & Json.ToString & ")", ex) End Try If Not Versions.Any() Then Throw New Exception("没有可用版本") Loader.Output = Versions @@ -721,7 +730,7 @@ #End Region -#Region "DlNeoForgeList | NeoForge Minecraft 版本列表" +#Region "DlNeoForgeList | NeoForge 版本列表" Public Structure DlNeoForgeListResult ''' @@ -733,11 +742,47 @@ ''' Public IsOfficial As Boolean ''' - ''' 获取到的数据。 + ''' 所有版本的列表。已经按从新到老排序。 ''' - Public Value As List(Of String) + Public Value As List(Of DlNeoForgeListEntry) End Structure + Public Class DlNeoForgeListEntry + Inherits DlForgelikeEntry + ''' + ''' 是否是 Beta 版。 + ''' + Public IsBeta As Boolean + ''' + ''' API 使用的原始版本字符串,如 “20.4.30-beta”、“1.20.1-47.1.99”(Legacy)。 + ''' + Public ApiName As String + ''' + ''' 文件在官网的基础地址,不包含后缀。 + ''' + Public ReadOnly Property UrlBase As String + Get + Dim PackageName As String = If(IsLegacy, "forge", "neoforge") + Return $"https://maven.neoforged.net/releases/net/neoforged/{PackageName}/{ApiName}/{PackageName}-{ApiName}" + End Get + End Property + + Public Sub New(ApiName As String) + IsNeoForge = True + Me.ApiName = ApiName + IsBeta = ApiName.Contains("beta") + If ApiName.Contains("1.20.1") Then '1.20.1-47.1.99 + VersionName = ApiName.Replace("1.20.1-", "") + Version = New Version("19." & VersionName) + Inherit = "1.20.1" + Else '20.4.30-beta + VersionName = ApiName + Version = New Version(ApiName.Before("-")) + Inherit = $"1.{Version.Major}" & If(Version.Minor = 0, "", "." & Version.Minor) + End If + End Sub + End Class + ''' ''' NeoForge 版本列表,主加载器。 ''' @@ -767,241 +812,47 @@ ''' Public DlNeoForgeListOfficialLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Official", AddressOf DlNeoForgeListOfficialMain) Private Sub DlNeoForgeListOfficialMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) - Dim ResultLatest As String - Dim VersionsJArray As JArray + '获取版本列表 JSON + Dim ResultLatest As String = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True, IsJson:=True) + Dim ResultLegacy As String = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/forge", UseBrowserUserAgent:=True, IsJson:=True) + If ResultLatest.Length < 100 OrElse ResultLegacy.Length < 100 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") + '解析 Try - ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True, IsJson:=True) + Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", + .Value = GetNeoForgeEntries(ResultLatest, ResultLegacy)} Catch ex As Exception - If GetExceptionSummary(ex).Contains("(404)") Then - Throw New Exception("没有可用版本") - Else - Throw - End If + Throw New Exception("NeoForge 官方源版本列表解析失败(" & ResultLatest & vbCrLf & vbCrLf & ResultLegacy & ")", ex) End Try - If ResultLatest.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") - VersionsJArray = GetJson(ResultLatest)("versions") - Dim Versions As New List(Of String) - Versions.Add("1.20.1") - Try - For Each Token As String In VersionsJArray - Dim Version As String = Token.Replace("neoforge-", "") - Dim Inherit As String = $"1.{Version.Split(".")(0)}.{Token.Split(".")(1)}" - If Inherit.EndsWith(".0") Then Inherit = Inherit.Replace(".0", "") - Versions.Add(Inherit) - Next - Versions = Versions.Distinct().ToList() - Catch ex As Exception - Log(ex, LogLevel.Feedback) - End Try - If Not Versions.Any() Then Throw New Exception("没有可用版本") - Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "NeoForge 官方源", .Value = Versions} End Sub ''' ''' NeoForge 版本列表,BMCLAPI。 ''' - Public DlNeoForgeListBmclapiLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Bmclapi", AddressOf DlNeoForgeListBmclapiMain) - Private Sub DlNeoForgeListBmclapiMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) - Dim ResultLatest As String - Dim VersionsJArray As JArray + Public DlNeoForgeListBmclapiLoader As New LoaderTask(Of Integer, DlNeoForgeListResult)("DlNeoForgeList Bmclapi", AddressOf DlNeoForgeListOfficialMain) + Public Sub DlNeoForgeVersionBmclapiMain(Loader As LoaderTask(Of Integer, DlNeoForgeListResult)) + '获取版本列表 JSON + Dim ResultLatest As String = NetGetCodeByDownload("https://bmclapi2.bangbang93.com/neoforge/meta/api/maven/details/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True, IsJson:=True) + Dim ResultLegacy As String = NetGetCodeByDownload("https://bmclapi2.bangbang93.com/neoforge/meta/api/maven/details/releases/net/neoforged/forge", UseBrowserUserAgent:=True, IsJson:=True) + If ResultLatest.Length < 100 OrElse ResultLegacy.Length < 100 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") + '解析 Try - ResultLatest = NetGetCodeByDownload("https://bmclapi2.bangbang93.com/neoforge/meta/api/maven/details/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True, IsJson:=True) + Loader.Output = New DlNeoForgeListResult With {.IsOfficial = True, .SourceName = "BMCLAPI", + .Value = GetNeoForgeEntries(ResultLatest, ResultLegacy)} Catch ex As Exception - If GetExceptionSummary(ex).Contains("(404)") Then - Throw New Exception("没有可用版本") - Else - Throw - End If - End Try - If ResultLatest.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") - VersionsJArray = GetJson(ResultLatest)("name") - Dim Versions As New List(Of String) - Versions.Add("1.20.1") - Try - For Each Token As String In VersionsJArray("name") - Dim Version As String = Token.Replace("neoforge-", "") - Dim Inherit As String = $"1.{Version.Split(".")(0)}.{Token.Split(".")(1)}" - If Inherit.EndsWith(".0") Then Inherit = Inherit.Replace(".0", "") - Versions.Add(Inherit) - Next - Versions = Versions.Distinct().ToList() - Catch ex As Exception - Log(ex, LogLevel.Feedback) + Throw New Exception("NeoForge BMCLAPI 版本列表解析失败(" & ResultLatest & vbCrLf & vbCrLf & ResultLegacy & ")", ex) End Try + End Sub + + Private Function GetNeoForgeEntries(LatestJson As String, LatestLegacyJson As String) As List(Of DlNeoForgeListEntry) + Dim VersionNames = RegexSearch(LatestLegacyJson & LatestJson, + "(?<="")(1\.20\.1-)?\d+\.\d+\.\d+(-beta)?(?="")") '我寻思直接正则就行.jpg + Dim Versions = VersionNames. + Where(Function(name) name <> "47.1.82"). '这个版本虽然在版本列表中,但不能下载 + Select(Function(name) New DlNeoForgeListEntry(name)).ToList If Not Versions.Any() Then Throw New Exception("没有可用版本") - Loader.Output = New DlNeoForgeListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Versions} - End Sub -#End Region - -#Region "DlNeoForgeVersion | NeoForge 版本列表" - - Public Class DlNeoForgeVersionEntry - ''' - ''' 完整的版本名,如 “neoforge-20.4.30-beta”。 - ''' - Public VersionName As String - ''' - ''' 对应的 Minecraft 版本,如“1.20.4”。 - ''' - Public Inherit As String - ''' - ''' 是否是 Beta 版。若未提供则默认为 False。 - ''' - Public IsBeta As Boolean = False - ''' - ''' 标准的版本号,如 “20.4.30”。 - ''' - Public VersionCode As String - Public Structure DlNeoForgeListResult - ''' - ''' 数据来源名称,如“Official”,“BMCLAPI”。 - ''' - Public SourceName As String - ''' - ''' 是否为官方的实时数据。 - ''' - Public IsOfficial As Boolean - ''' - ''' 获取到的数据。 - ''' - Public Value As JObject - End Structure - ''' - ''' 即将下载的文件全名。 - ''' - Public ReadOnly Property FileName As String - Get - If VersionCode.StartsWith("47.") Then 'NeoForge 1.20.1 的版本命名有些特殊... - Return "forge-" & "1.20.1" & "-" & VersionCode & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" - Else - Return "neoforge-" & VersionCode & If(IsBeta, "-beta", "") & "-" & "installer" & "." & "jar" - End If - End Get - End Property - ''' - ''' 文件扩展名 - ''' - Public ReadOnly Property FileSuffix As String = ".jar" - End Class - ''' - ''' NeoForge 版本列表,主加载器。 - ''' - 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) - Select Case Setup.Get("ToolDownloadVersion") - Case 0 - DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 30), - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 60) - }, Loader.IsForceRestarting) - Case 1 - DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 5), - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 35) - }, Loader.IsForceRestarting) - Case Else - DlSourceLoader(Loader, New List(Of KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)) From { - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionOfficialLoader, 60), - New KeyValuePair(Of LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)), Integer)(DlNeoForgeVersionBmclapiLoader, 60) - }, Loader.IsForceRestarting) - End Select - End Sub - - ''' - ''' NeoForge 版本列表,官方源。 - ''' - Public Sub DlNeoForgeVersionOfficialMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) - Dim ResultLatest As String - Dim ResultLegacy As String - Try - ResultLatest = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/neoforge", UseBrowserUserAgent:=True, IsJson:=True) - ResultLegacy = NetGetCodeByDownload("https://maven.neoforged.net/api/maven/versions/releases/net/neoforged/forge", UseBrowserUserAgent:=True, IsJson:=True) - Catch ex As Exception - If GetExceptionSummary(ex).Contains("(404)") Then - Throw New Exception("没有可用版本") - Else - Throw - End If - End Try - If ResultLatest.Length < 50 AndAlso ResultLegacy.Length < 50 Then Throw New Exception("获取到的版本列表长度不足(" & ResultLatest & ")") - Dim ResultLatestJson As JObject = GetJson(ResultLatest) - Dim ResultLegacyJson As JObject = GetJson(ResultLegacy) - Dim VersionsJArray As JArray - Dim IsLegacyNeo As Boolean = False - If Loader.Input IsNot Nothing AndAlso Loader.Input.ToString().Contains("1.20.1") Then - VersionsJArray = ResultLegacyJson("versions") - IsLegacyNeo = True - Else - VersionsJArray = ResultLatestJson("versions") - End If - Dim Versions As New List(Of DlNeoForgeVersionEntry) - Try - For Each Token As String In VersionsJArray - Dim StdVersion As String - Dim IsBeta As Boolean - Dim rawVersion As String = Token - If rawVersion.Contains("-beta") Then - StdVersion = Token.Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") - IsBeta = True - Else - StdVersion = Token.Replace("neoforge-", "").Replace("1.20.1-", "") - IsBeta = False - End If - Dim Inherit As String = $"1.{StdVersion.Split(".")(0)}.{StdVersion.Split(".")(1)}" - If Inherit.EndsWithF(".0") Then Inherit.Remove(Inherit.LastIndexOfF(".0"), 1) - Inherit = If(IsLegacyNeo, "1.20.1", Inherit) - Dim Entry = New DlNeoForgeVersionEntry - If Loader.Input IsNot Nothing Then - If IsLegacyNeo OrElse Inherit.Contains(Loader.Input.ToString().Replace("1.", "")) Then - Entry = New DlNeoForgeVersionEntry With {.VersionName = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .VersionCode = StdVersion} - Versions.Add(Entry) - End If - Else - Entry = New DlNeoForgeVersionEntry With {.VersionName = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .VersionCode = StdVersion} - Versions.Add(Entry) - End If - Next - Catch ex As Exception - Log(ex, LogLevel.Feedback) - End Try - If Not Versions.Any() Then Throw New Exception("没有可用版本") - Dim VersionsArray = Versions.ToList() - VersionsArray.Reverse() - Loader.Output = VersionsArray - End Sub - - ''' - ''' NeoForge 版本列表,BMCLAPI。 - ''' - Public Sub DlNeoForgeVersionBmclapiMain(Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))) - Dim Json As JArray = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/neoforge/list/" & Loader.Input, IsJson:=True) - Dim Versions As New List(Of DlNeoForgeVersionEntry) - Try - For Each Token As JObject In Json - Dim StdVersion As String - Dim IsBeta As Boolean - Dim rawVersion As String = Token("rawVersion") - If rawVersion.Contains("-beta") Then - StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") - IsBeta = True - Else - StdVersion = Token("version").ToString().Replace("neoforge-", "").Replace("1.20.1-", "") - IsBeta = False - End If - Dim Inherit As String = Token("mcversion") - Dim Entry = New DlNeoForgeVersionEntry With {.VersionName = rawVersion, .Inherit = Inherit, .IsBeta = IsBeta, .VersionCode = 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("没有可用版本") - Dim VersionsArray = Versions.ToList() - VersionsArray.Reverse() - Loader.Output = VersionsArray - End Sub + Versions = Versions.OrderByDescending(Function(a) a.Version).ToList + Return Versions + End Function #End Region @@ -1025,6 +876,7 @@ ''' Public OfficialError As Exception End Structure + Public Class DlLiteLoaderListEntry ''' ''' 实际的文件名,如“liteloader-installer-1.12-00-SNAPSHOT.jar”。 @@ -1104,7 +956,7 @@ Next Loader.Output = New DlLiteLoaderListResult With {.IsOfficial = True, .SourceName = "LiteLoader 官方源", .Value = Versions} Catch ex As Exception - Throw New Exception("版本列表解析失败(" & Result.ToString & ")", ex) + Throw New Exception("LiteLoader 官方源版本列表解析失败(" & Result.ToString & ")", ex) End Try End Sub @@ -1132,7 +984,7 @@ Next Loader.Output = New DlLiteLoaderListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Versions} Catch ex As Exception - Throw New Exception("版本列表解析失败(" & Result.ToString & ")", ex) + Throw New Exception("LiteLoader BMCLAPI 版本列表解析失败(" & Result.ToString & ")", ex) End Try End Sub @@ -1190,7 +1042,7 @@ If Output.Value("game") Is Nothing OrElse Output.Value("loader") Is Nothing OrElse Output.Value("installer") Is Nothing Then Throw New Exception("获取到的列表缺乏必要项") Loader.Output = Output Catch ex As Exception - Throw New Exception("列表解析失败(" & Result.ToString & ")", ex) + Throw New Exception("Fabric 官方源版本列表解析失败(" & Result.ToString & ")", ex) End Try End Sub @@ -1205,7 +1057,7 @@ If Output.Value("game") Is Nothing OrElse Output.Value("loader") Is Nothing OrElse Output.Value("installer") Is Nothing Then Throw New Exception("获取到的列表缺乏必要项") Loader.Output = Output Catch ex As Exception - Throw New Exception("列表解析失败(" & Result.ToString & ")", ex) + Throw New Exception("Fabric BMCLAPI 版本列表解析失败(" & Result.ToString & ")", ex) End Try End Sub @@ -1228,25 +1080,25 @@ Public Function DlSourceResourceGet(MojangBase As String) As String() MojangBase = MojangBase.Replace("http://resources.download.minecraft.net", "https://resources.download.minecraft.net") Return { - MojangBase.Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/assets").Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/assets").Replace("https://resources.download.minecraft.net", "https://bmclapi2.bangbang93.com/assets"), - MojangBase - } + MojangBase.Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/assets").Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/assets").Replace("https://resources.download.minecraft.net", "https://bmclapi2.bangbang93.com/assets"), + MojangBase + } End Function Public Function DlSourceLibraryGet(MojangBase As String) As String() Return { - MojangBase.Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/maven").Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/maven").Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/maven"), - MojangBase.Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/libraries").Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/libraries").Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries"), - MojangBase - } + MojangBase.Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/maven").Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/maven").Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/maven"), + MojangBase.Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/libraries").Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/libraries").Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries"), + MojangBase + } End Function Public Function DlSourceLauncherOrMetaGet(MojangBase As String) As String() If MojangBase Is Nothing Then Throw New Exception("无对应的 json 下载地址") Return { - MojangBase.Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com").Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com").Replace("https://launcher.mojang.com", "https://bmclapi2.bangbang93.com").Replace("https://launchermeta.mojang.com", "https://bmclapi2.bangbang93.com"), - MojangBase - } + MojangBase.Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com").Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com").Replace("https://launcher.mojang.com", "https://bmclapi2.bangbang93.com").Replace("https://launchermeta.mojang.com", "https://bmclapi2.bangbang93.com"), + MojangBase + } End Function Private Sub DlSourceLoader(Of InputType, OutputType)(MainLoader As LoaderTask(Of InputType, OutputType), diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb index 8091129..3bf5ef3 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb @@ -1,18 +1,6 @@ Public Module ModJava Public JavaListCacheVersion As Integer = 6 - ''' - ''' 用于在搜索 Java 时进行关键词检测。 - ''' - Public ReadOnly SearchEntryWords As List(Of String) = - New List(Of String) From {"java", "jdk", "env", "环境", "run", "软件", "jre", "mc", - "soft", "cache", "temp", "corretto", "roaming", "users", "craft", "program", "世界", "net", - "游戏", "oracle", "game", "file", "data", "jvm", "服务", "server", "客户", "client", "整合", - "应用", "运行", "前置", "mojang", "官启", "新建文件夹", "eclipse", "microsoft", "hotspot", - "runtime", "x86", "x64", "forge", "原版", "optifine", "官方", "启动", "hmcl", "mod", "高清", - "download", "launch", "程序", "path", "version", "baka", "pcl", "zulu", "local", "packages", - "4297127d64ec6", "国服", "网易", "ext", "netease", "1.", "启动"} - ''' ''' 目前所有可用的 Java。 ''' @@ -252,21 +240,25 @@ Dim UserJava As JavaEntry = Nothing '获取版本独立设置中指定的 Java - If RelatedVersion IsNot Nothing AndAlso Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion).ToString.StartsWithF("{") Then - Try - UserJava = JavaEntry.FromJson(GetJson(Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion))) - UserJava.Check() - Catch ex As ThreadInterruptedException - Throw - Catch ex As Exception - UserJava = Nothing - Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion) - Log(ex, "版本独立设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint) - End Try + Dim VersionSelect As String = "" + If RelatedVersion IsNot Nothing Then + VersionSelect = Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion) + If VersionSelect.StartsWithF("{") Then + Try + UserJava = JavaEntry.FromJson(GetJson(VersionSelect)) + UserJava.Check() + Catch ex As ThreadInterruptedException + Throw + Catch ex As Exception + UserJava = Nothing + Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion) + Log(ex, "版本独立设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint) + End Try + End If End If '获取全局设置中指定的 Java - If UserJava Is Nothing AndAlso Setup.Get("LaunchArgumentJavaSelect") <> "" Then + If UserJava Is Nothing AndAlso VersionSelect <> "" AndAlso Setup.Get("LaunchArgumentJavaSelect") <> "" Then Try UserJava = JavaEntry.FromJson(GetJson(Setup.Get("LaunchArgumentJavaSelect"))) UserJava.Check() @@ -677,13 +669,18 @@ Wait: '若该目录有 Java,则加入结果 If File.Exists(Path & "javaw.exe") Then Results(Path) = Source '查找其下的所有文件夹 + Dim Keywords = {"java", "jdk", "env", "环境", "run", "软件", "jre", "mc", "dragon", + "soft", "cache", "temp", "corretto", "roaming", "users", "craft", "program", "世界", "net", + "游戏", "oracle", "game", "file", "data", "jvm", "服务", "server", "客户", "client", "整合", + "应用", "运行", "前置", "mojang", "官启", "新建文件夹", "eclipse", "microsoft", "hotspot", + "runtime", "x86", "x64", "forge", "原版", "optifine", "官方", "启动", "hmcl", "mod", "高清", + "download", "launch", "程序", "path", "version", "baka", "pcl", "zulu", "local", "packages", + "4297127d64ec6", "国服", "网易", "ext", "netease", "1.", "启动"} For Each FolderInfo As DirectoryInfo In OriginalPath.EnumerateDirectories If FolderInfo.Attributes.HasFlag(FileAttributes.ReparsePoint) Then Continue For '跳过符号链接 Dim SearchEntry = GetFolderNameFromPath(FolderInfo.Name).ToLower '用于搜索的字符串 - If IsFullSearch OrElse - FolderInfo.Parent.Name.ToLower = "users" OrElse - SearchEntryWords.Any(Function(word) SearchEntry.Contains(word)) OrElse '进行关键词检测 - SearchEntry = "bin" Then + If IsFullSearch OrElse FolderInfo.Parent.Name.ToLower = "users" OrElse + Keywords.Any(Function(w) SearchEntry.Contains(w)) OrElse SearchEntry = "bin" Then JavaSearchFolder(FolderInfo, Results, Source) End If Next diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index 130efbb..4d130d4 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -113,19 +113,18 @@ Public Module ModLaunch New LoaderTask(Of Process, Integer)("等待游戏窗口出现", AddressOf McLaunchWait) With {.ProgressWeight = 1}, New LoaderTask(Of Integer, Integer)("结束处理", AddressOf McLaunchEnd) With {.ProgressWeight = 1} } - '内存优化 Select Case Setup.Get("VersionRamOptimize", Version:=McVersionCurrent) Case 0 '全局 - If Setup.Get("LaunchArgumentRam") Then + If Setup.Get("LaunchArgumentRam") Then '使用全局设置 CType(Loaders(2), LoaderCombo(Of String)).Block = False Loaders.Insert(3, New LoaderTask(Of Integer, Integer)("内存优化", AddressOf McLaunchMemoryOptimize) With {.ProgressWeight = 30}) End If Case 1 '开启 CType(Loaders(2), LoaderCombo(Of String)).Block = False Loaders.Insert(3, New LoaderTask(Of Integer, Integer)("内存优化", AddressOf McLaunchMemoryOptimize) With {.ProgressWeight = 30}) + Case 2 '关闭 End Select - Dim LaunchLoader As New LoaderCombo(Of Object)("Minecraft 启动", Loaders) With {.Show = False} If McLoginLoader.State = LoadState.Finished Then McLoginLoader.State = LoadState.Waiting '要求重启登录主加载器,它会自行决定是否启动副加载器 '等待加载器执行并更新 UI @@ -1081,8 +1080,8 @@ SystemBrowser: Case 4 '自定义 Do Until McSkinSex(Uuid) = If(Setup.Get("LaunchSkinSlim"), "Alex", "Steve") - If Uuid.EndsWithF("FFFFF") Then Uuid = Mid(Uuid, 1, 32 - 5) & "00000" - Uuid = Mid(Uuid, 1, 32 - 5) & (Long.Parse(Right(Uuid, 5), Globalization.NumberStyles.AllowHexSpecifier) + 1).ToString("X").PadLeft(5, "0") + If Uuid.EndsWithF("FFFFF") Then Uuid = Uuid.Substring(0, 27) & "00000" + Uuid = Uuid.Substring(0, 27) & (Long.Parse(Uuid.Substring(27), Globalization.NumberStyles.AllowHexSpecifier) + 1).ToString("X").PadLeft(5, "0") Loop End Select Return Uuid diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index 64ffbe8..4afbfd0 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -151,7 +151,7 @@ Public Module ModMinecraft #Region "版本处理" - Public Const McVersionCacheVersion As Integer = 29 + Public Const McVersionCacheVersion As Integer = 30 Private _McVersionCurrent As McVersion Private _McVersionLast = 0 '为 0 以保证与 Nothing 不相同,使得 UI 显示可以正常初始化 @@ -715,8 +715,8 @@ Recheck: 'OptiFine If RealJson.Contains("optifine") Then State = McVersionState.OptiFine - Version.OptiFineVersion = If(RegexSeek(RealJson, "(?<=HD_U_)[^"":/]+"), "未知版本") Version.HasOptiFine = True + Version.OptiFineVersion = If(RegexSeek(RealJson, "(?<=HD_U_)[^"":/]+"), "未知版本") End If 'LiteLoader If RealJson.Contains("liteloader") Then @@ -727,22 +727,20 @@ Recheck: 'FUTURE: [Quilt 支持] 确认这里的玩意儿对不对 If RealJson.Contains("net.fabricmc:fabric-loader") OrElse RealJson.Contains("org.quiltmc:quilt-loader") Then 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") AndAlso Not RealJson.Contains("neoforge") Then + Version.FabricVersion = If(RegexSeek(RealJson, "(?<=(net.fabricmc:fabric-loader:)|(org.quiltmc:quilt-loader:))[0-9\.]+(\+build.[0-9]+)?"), "未知版本").Replace("+build", "") + ElseIf RealJson.Contains("minecraftforge") AndAlso Not RealJson.Contains("net.neoforge") Then State = McVersionState.Forge + Version.HasForge = True 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 '1.20.1 NeoForge Json 内信息不同,为了方便直接截断 orgeVersion;这里的实现比较抽象,正则我写不会 - State = McVersionState.NeoForge '1.20.1 Json 标识:"--fml.forgeVersion" 1.20.1 以上 Json 标识:"--fml.neoForgeVersion" - Dim JsonStr1() As String = RealJson.Replace(" ", "").Split("orgeVersion""," & vbCrLf & """") - Dim JsonStr2() As String = JsonStr1(1).Split("""") - Version.NeoForgeVersion = JsonStr2(0) - If Version.NeoForgeVersion Is Nothing Then Version.NeoForgeVersion = RegexSeek(RealJson, "(?<=orgeVersion"",)[0-9\.]+") - If Version.NeoForgeVersion Is Nothing Then Version.NeoForgeVersion = If(RegexSeek(RealJson, "(?<=net\.minecraftforge:fmlloader:[0-9\.]+-)[0-9\.]+"), "未知版本") + ElseIf RealJson.Contains("net.neoforge") Then + '1.20.1 JSON 范例:"--fml.forgeVersion", "47.1.99" + '1.20.2+ JSON 范例:"--fml.neoForgeVersion", "20.6.119-beta" + State = McVersionState.NeoForge Version.HasNeoForge = True + Version.NeoForgeVersion = If(RegexSeek(RealJson, "(?<=orgeVersion"",[^""]*?"")[^""]+(?="",)"), "未知版本") End If Version.IsApiLoaded = True End Select @@ -987,7 +985,7 @@ ExitDataLoad: ElseIf SubVersions.Length = 3 Then _SortCode = Val(SubVersions(0)) * 1000000 + Val(SubVersions(1)) * 10000 + Val(SubVersions(2)) Else - Throw New Exception(If(HasForge, "无效的 Forge 版本:" & ForgeVersion, "无效的 NeoForge 版本:" & NeoForgeVersion)) + Throw New Exception("无效的 Neo/Forge 版本:" & ForgeVersion) End If ElseIf HasOptiFine Then If OptiFineVersion = "未知版本" Then Return 0 @@ -1433,7 +1431,7 @@ OnLoaded: End Function) End If - 'API 版本:优先按版本排序,此后【先放 Fabric,再放 Forge,再放 NeoForge(按版本号从高到低排序),最后放 LiteLoader(按名称排序)】 + 'API 版本:优先按版本排序,此后【先放 Fabric,再放 Neo/Forge(按版本号从高到低排序),最后放 LiteLoader(按名称排序)】 If ResultVersionList.ContainsKey(McVersionCardType.API) Then ResultVersionList(McVersionCardType.API) = Sort(ResultVersionList(McVersionCardType.API), Function(Left As McVersion, Right As McVersion) @@ -1443,10 +1441,10 @@ OnLoaded: Else If Left.Version.HasFabric Xor Right.Version.HasFabric Then 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 Left.Version.HasForge Xor Right.Version.HasForge Then + Return Left.Version.HasForge ElseIf Not Left.Version.SortCode <> Right.Version.SortCode Then Return Left.Version.SortCode > Right.Version.SortCode Else @@ -1677,7 +1675,7 @@ OnLoaded: Return _Url End Get Set(value As String) - '孤儿 Forge 作者喜欢把没有的 URL 写个空字符串 + '孤儿 Forge 作者喜欢把没有 URL 的写个空字符串 _Url = If(String.IsNullOrWhiteSpace(value), Nothing, value) End Set End Property @@ -1694,15 +1692,6 @@ OnLoaded: End Get End Property ''' - ''' 原 Json 中 Name 项最后一部分的版本号。 - ''' - Public ReadOnly Property Version As String - Get - Dim Splited = OriginalName.Split(":") - Return Splited(Splited.Count - 1) - End Get - End Property - ''' ''' 原 Json 中的 Name 项。 ''' Public OriginalName As String @@ -1783,7 +1772,7 @@ OnLoaded: '根据 Inherit 获取最深层版本 Dim OriginalVersion As McVersion = Version '1.17+ 的 Forge 不寻找 Inherit - If Not (Version.Version.HasForge AndAlso Version.Version.McCodeMain >= 17) Then + If Not ((Version.Version.HasForge OrElse Version.Version.HasNeoForge) AndAlso Version.Version.McCodeMain >= 17) Then Do Until OriginalVersion.InheritVersion = "" If OriginalVersion.InheritVersion = OriginalVersion.Name Then Exit Do OriginalVersion = New McVersion(PathMcFolder & "versions\" & OriginalVersion.InheritVersion & "\") @@ -1868,13 +1857,14 @@ OnLoaded: Try If Library("downloads") IsNot Nothing AndAlso Library("downloads")("artifact") IsNot Nothing Then BasicArray.Add(New McLibToken With { - .IsJumpLoader = IsJumpLoader, - .OriginalName = Library("name"), - .Url = If(RootUrl, Library("downloads")("artifact")("url")), - .LocalPath = If(Library("downloads")("artifact")("path") Is Nothing, McLibGet(Library("name"), CustomMcFolder:=CustomMcFolder), CustomMcFolder & "libraries\" & Library("downloads")("artifact")("path").ToString.Replace("/", "\")), - .Size = Val(Library("downloads")("artifact")("size").ToString), - .IsNatives = False, - .SHA1 = Library("downloads")("artifact")("sha1")?.ToString}) + .IsJumpLoader = IsJumpLoader, + .OriginalName = Library("name"), + .Url = If(RootUrl, Library("downloads")("artifact")("url")), + .LocalPath = If(Library("downloads")("artifact")("path") Is Nothing, McLibGet(Library("name"), + CustomMcFolder:=CustomMcFolder), CustomMcFolder & "libraries\" & Library("downloads")("artifact")("path").ToString.Replace("/", "\")), + .Size = Val(Library("downloads")("artifact")("size").ToString), + .IsNatives = False, + .SHA1 = Library("downloads")("artifact")("sha1")?.ToString}) Else BasicArray.Add(New McLibToken With {.IsJumpLoader = IsJumpLoader, .OriginalName = Library("name"), .Url = RootUrl, .LocalPath = LocalPath, .Size = 0, .IsNatives = False, .SHA1 = Nothing}) End If @@ -1908,15 +1898,25 @@ OnLoaded: '去重 Dim ResultArray As New Dictionary(Of String, McLibToken) + Dim GetVersion = + Function(Token As McLibToken) As String + '测试例: + 'D:\Minecraft\test\libraries\net\neoforged\mergetool\2.0.0\mergetool-2.0.0-api.jar + 'D:\Minecraft\test\libraries\org\apache\commons\commons-collections4\4.2\commons-collections4-4.2.jar + 'D:\Minecraft\test\libraries\com\google\guava\guava\31.1-jre\guava-31.1-jre.jar + Return GetFolderNameFromPath(GetPathFromFullPath(Token.LocalPath)) + End Function For i = 0 To BasicArray.Count - 1 Dim Key As String = BasicArray(i).Name & BasicArray(i).IsNatives.ToString & BasicArray(i).IsJumpLoader.ToString If ResultArray.ContainsKey(Key) Then - If BasicArray(i).Version <> ResultArray(Key).Version AndAlso KeepSameNameDifferentVersionResult Then - Log($"[Minecraft] 发现疑似重复的支持库:{BasicArray(i)} 与 {ResultArray(Key)}") + Dim BasicArrayVersion As String = GetVersion(BasicArray(i)) + Dim ResultArrayVersion As String = GetVersion(ResultArray(Key)) + If BasicArrayVersion <> ResultArrayVersion AndAlso KeepSameNameDifferentVersionResult Then + Log($"[Minecraft] 发现疑似重复的支持库:{BasicArray(i)} ({BasicArrayVersion}) 与 {ResultArray(Key)} ({ResultArrayVersion})") ResultArray.Add(Key & GetUuid(), BasicArray(i)) Else - Log($"[Minecraft] 发现重复的支持库:{BasicArray(i)} 与 {ResultArray(Key)},已忽略其中之一") - If VersionSortBoolean(BasicArray(i).Version, ResultArray(Key).Version) Then + Log($"[Minecraft] 发现重复的支持库:{BasicArray(i)} ({BasicArrayVersion}) 与 {ResultArray(Key)} ({ResultArrayVersion}),已忽略其中之一") + If VersionSortBoolean(BasicArrayVersion, ResultArrayVersion) Then ResultArray(Key) = BasicArray(i) End If End If @@ -1976,6 +1976,7 @@ OnLoaded: End If End If End If + 'Authlib-Injector 文件 If Setup.Get("VersionServerLogin", Version:=Version) = 4 OrElse (PageLinkHiper.HiperState = LoadState.Finished AndAlso Setup.Get("LoginType") = McLoginType.Legacy) Then 'HiPer 登录转接 @@ -2025,8 +2026,13 @@ OnLoaded: If Token.Url IsNot Nothing Then '获取 Url 的真实地址 Urls.Add(Token.Url) - If Token.Url.Contains("launcher.mojang.com/v1/objects") Then Urls = DlSourceLauncherOrMetaGet(Token.Url).ToList() 'Mappings - If Token.Url.Contains("maven") Then Urls.Insert(0, Token.Url.Replace(Mid(Token.Url, 1, Token.Url.IndexOfF("maven")), "https://bmclapi2.bangbang93.com/").Replace("maven.fabricmc.net", "maven").Replace("maven.minecraftforge.net", "maven")) + If Token.Url.Contains("launcher.mojang.com/v1/objects") Then + Urls = DlSourceLauncherOrMetaGet(Token.Url).ToList() 'Mappings + End If + If Token.Url.Contains("maven") Then + Urls.Insert(0, Token.Url.Replace(Mid(Token.Url, 1, Token.Url.IndexOfF("maven")), "https://bmclapi2.bangbang93.com/"). + Replace("maven.fabricmc.net", "maven").Replace("maven.minecraftforge.net", "maven").Replace("maven.neoforged.net/releases", "maven")) + End If End If If Token.LocalPath.Contains("transformer-discovery-service") Then 'Transformer 文件释放 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb index 348d3cb..0f26a62 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb @@ -887,7 +887,7 @@ Finished: ModList.Add(ModEntry) '读取 Comp 缓存 If ModEntry.State = McMod.McModState.Unavaliable Then Continue For - Dim CacheKey = ModEntry.ModrinthHash & PageVersionLeft.Version.Version.McName + Dim CacheKey = ModEntry.ModrinthHash & PageVersionLeft.Version.Version.McName & GetTargetModLoaders().Join("") If Cache.ContainsKey(CacheKey) Then ModEntry.FromJson(Cache(CacheKey)) '如果缓存中的信息在 6 小时以内更新过,则无需重新获取 @@ -923,20 +923,15 @@ Finished: Throw End Try End Sub - '联网加载 Mod 详情 - Private Const LocalModCacheVersion As Integer = 4 + Private Const LocalModCacheVersion As Integer = 5 Public McModDetailLoader As New LoaderTask(Of KeyValuePair(Of List(Of McMod), JObject), Integer)("Mod List Detail Loader", AddressOf McModDetailLoad) Private Sub McModDetailLoad(Loader As LoaderTask(Of KeyValuePair(Of List(Of McMod), JObject), Integer)) Dim Mods As List(Of McMod) = Loader.Input.Key Dim Cache As JObject = Loader.Input.Value '获取作为检查目标的加载器和版本 Dim TargetMcVersion As McVersionInfo = PageVersionLeft.Version.Version - Dim ModLoaders As New List(Of CompModLoaderType) - If TargetMcVersion.HasForge Then ModLoaders.Add(CompModLoaderType.Forge) - If TargetMcVersion.HasFabric Then ModLoaders.Add(CompModLoaderType.Fabric) - If TargetMcVersion.HasLiteLoader Then ModLoaders.Add(CompModLoaderType.LiteLoader) - If Not ModLoaders.Any() Then ModLoaders.AddRange({CompModLoaderType.Forge, CompModLoaderType.Fabric, CompModLoaderType.LiteLoader, CompModLoaderType.Quilt}) + Dim ModLoaders = GetTargetModLoaders() Dim McVersion = TargetMcVersion.McName '暂不向下扩展检查的 MC 小版本 '例如:Mod 在更新 1.16.5 后,对早期的 1.16.2 版本发布了修补补丁,这会导致 PCL 将 1.16.5 版本的 Mod 降级到 1.16.2 @@ -1136,10 +1131,19 @@ Finished: If Not Mods.Any() Then Exit Sub For Each Entry In Mods 'TODO: Bookshelf 的 Logo 会在两个网站间横跳 Entry.CompLoaded = SucceedThreadCount = 2 - Cache(Entry.ModrinthHash & McVersion) = Entry.ToJson() + Cache(Entry.ModrinthHash & McVersion & ModLoaders.Join("")) = Entry.ToJson() Next WriteFile(PathTemp & "Cache\LocalMod.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None))) End Sub + Private Function GetTargetModLoaders() As List(Of CompModLoaderType) + Dim ModLoaders As New List(Of CompModLoaderType) + If PageVersionLeft.Version.Version.HasForge Then ModLoaders.Add(CompModLoaderType.Forge) + If PageVersionLeft.Version.Version.HasNeoForge Then ModLoaders.Add(CompModLoaderType.NeoForge) + If PageVersionLeft.Version.Version.HasFabric Then ModLoaders.Add(CompModLoaderType.Fabric) + If PageVersionLeft.Version.Version.HasLiteLoader Then ModLoaders.Add(CompModLoaderType.LiteLoader) + If Not ModLoaders.Any() Then ModLoaders.AddRange({CompModLoaderType.Forge, CompModLoaderType.NeoForge, CompModLoaderType.Fabric, CompModLoaderType.LiteLoader, CompModLoaderType.Quilt}) + Return ModLoaders + End Function #If DEBUG Then ''' diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index c64aaef..293af35 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -281,19 +281,23 @@ Retry: '建立 CompFile Dim File As New CompFile(ModJson, CompType.Mod) If Not File.Available Then Continue For - '根据 modules 和文件名后缀判断是资源包还是 Mod - Dim IsResourcePack As Boolean + '根据 modules 和文件名后缀判断资源类型 + Dim TargetFolder As String If ModJson("modules").Any Then 'modules 可能返回 null(#1006) Dim ModuleNames = CType(ModJson("modules"), JArray).Select(Function(l) l("name").ToString).ToList - IsResourcePack = - (Not ModuleNames.Contains("META-INF")) AndAlso (Not ModuleNames.Contains("mcmod.info")) AndAlso '不包含 META-INF 或 mcmod.info - ModuleNames.Contains("pack.mcmeta") AndAlso '包含 pack.mcmeta - (Not File.FileName.EndsWithF(".jar", True)) '文件后缀不是 .jar + If ModuleNames.Contains("META-INF") OrElse ModuleNames.Contains("mcmod.info") OrElse + File.FileName.EndsWithF(".jar", True) Then + TargetFolder = "mods" + ElseIf ModuleNames.Contains("pack.mcmeta") Then + TargetFolder = "resourcepacks" + Else + TargetFolder = "shaderpacks" + End If Else - IsResourcePack = False + TargetFolder = "mods" End If '实际的添加 - FileList.Add(Id, File.ToNetFile($"{PathMcFolder}versions\{VersionName}\{If(IsResourcePack, "resourcepacks", "mods")}\")) + FileList.Add(Id, File.ToNetFile($"{PathMcFolder}versions\{VersionName}\{TargetFolder}\")) Task.Progress += 1 / (1 + ModList.Count) Next Task.Output = FileList.Values.ToList diff --git a/Plain Craft Launcher 2/Modules/ModEvent.vb b/Plain Craft Launcher 2/Modules/ModEvent.vb index 77740d5..9e3ed0f 100644 --- a/Plain Craft Launcher 2/Modules/ModEvent.vb +++ b/Plain Craft Launcher 2/Modules/ModEvent.vb @@ -43,7 +43,14 @@ End Sub) Case "启动游戏" - If Data(0) = "\current" Then Data(0) = McVersionCurrent.Name + If Data(0) = "\current" Then + If McVersionCurrent Is Nothing Then + Hint("请先选择一个 Minecraft 版本!", HintType.Critical) + Exit Sub + Else + Data(0) = McVersionCurrent.Name + End If + End If If McLaunchStart(New McLaunchOptions With {.ServerIp = If(Data.Length >= 2, Data(1), Nothing), .Version = New McVersion(Data(0))}) Then Hint("正在启动 " & Data(0) & "……") diff --git a/Plain Craft Launcher 2/Modules/ModMusic.vb b/Plain Craft Launcher 2/Modules/ModMusic.vb index ef89bf3..cc1ace6 100644 --- a/Plain Craft Launcher 2/Modules/ModMusic.vb +++ b/Plain Craft Launcher 2/Modules/ModMusic.vb @@ -69,23 +69,24 @@ Else '有背景音乐 FrmMain.BtnExtraMusic.Show = True - - Dim ToolTipText As String = "正在播放:" & GetFileNameWithoutExtentionFromPath(MusicCurrent) + Dim ToolTipText As String If MusicState = MusicStates.Pause Then FrmMain.BtnExtraMusic.Logo = Logo.IconPlay FrmMain.BtnExtraMusic.LogoScale = 0.8 + ToolTipText = "已暂停:" & GetFileNameWithoutExtentionFromPath(MusicCurrent) If MusicAllList.Count > 1 Then - ToolTipText += vbCrLf & "左键播放,右键播放下一曲。" + ToolTipText += vbCrLf & "左键恢复播放,右键播放下一曲。" Else - ToolTipText += vbCrLf & "左键播放,右键从头重新播放。" + ToolTipText += vbCrLf & "左键恢复播放,右键重新从头播放。" End If Else FrmMain.BtnExtraMusic.Logo = Logo.IconMusic FrmMain.BtnExtraMusic.LogoScale = 1 + ToolTipText = "正在播放:" & GetFileNameWithoutExtentionFromPath(MusicCurrent) If MusicAllList.Count > 1 Then ToolTipText += vbCrLf & "左键暂停,右键播放下一曲。" Else - ToolTipText += vbCrLf & "左键暂停,右键从头重新播放。" + ToolTipText += vbCrLf & "左键暂停,右键重新从头播放。" End If End If FrmMain.BtnExtraMusic.ToolTip = ToolTipText @@ -123,16 +124,14 @@ ''' Public Sub MusicControlNext() If MusicAllList.Count = 1 Then - 'Hint("播放列表中仅有一首歌曲!") MusicStartPlay(MusicCurrent) Hint("重新播放:" & GetFileNameFromPath(MusicCurrent), HintType.Finish) - MusicRefreshUI() Else Dim Address As String = DequeueNextMusicAddress() MusicStartPlay(Address) Hint("正在播放:" & GetFileNameFromPath(Address), HintType.Finish) - MusicRefreshUI() End If + MusicRefreshUI() End Sub #End Region diff --git a/Plain Craft Launcher 2/Modules/ModSecret.vb b/Plain Craft Launcher 2/Modules/ModSecret.vb index d60f952..f6e0a36 100644 --- a/Plain Craft Launcher 2/Modules/ModSecret.vb +++ b/Plain Craft Launcher 2/Modules/ModSecret.vb @@ -252,6 +252,7 @@ Friend Module ModSecret Return False End Function Public Function DonateCodeInput() As Boolean? + Return Nothing End Function #End Region diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index 885e140..c5d5a6d 100644 --- a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb +++ b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb @@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 ' 方法是按如下所示使用“*” - - + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 2e0d06f..b7e5093 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1005,38 +1005,40 @@ Retry: #End Region -#Region "Forge / NeoForge 下载" +#Region "Forgelike 下载" - Public Sub McDownloadForge(IsNeo As Boolean, Optional DownloadForgeInfo As DlForgeVersionEntry = Nothing, Optional DownloadNeoInfo As DlNeoForgeVersionEntry = Nothing) - Dim DownloadInfo = If(IsNeo, DownloadNeoInfo, DownloadForgeInfo) + Public Sub McDownloadForgelike(Info As DlForgelikeEntry) '老版本提示 - If DownloadInfo.Category = "client" Then - If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & - "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", - "版本过老", "继续", "取消") = 1 Then - McDownloadForgeSave(IsNeo, DownloadInfo) + If Not Info.IsNeoForge Then + Dim ForgeInfo As DlForgeVersionEntry = Info + If ForgeInfo.Category = "client" Then + If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & + "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", + "版本过老", "继续", "取消") = 1 Then + McDownloadForgelikeSave(Info) + End If + Exit Sub End If - Exit Sub - End If - If DownloadInfo.Category = "universal" OrElse DownloadInfo.Inherit.StartsWithF("1.5") Then '对该版本自动安装的支持将在之后加入 - If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & - "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", - "版本过老", "继续", "取消") = 1 Then - McDownloadForgeSave(IsNeo, DownloadInfo) + If ForgeInfo.Category = "universal" OrElse ForgeInfo.Inherit.StartsWithF("1.5") Then + If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & + "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", + "版本过老", "继续", "取消") = 1 Then + McDownloadForgelikeSave(Info) + End If + Exit Sub End If - Exit Sub End If '初始化参数 - Dim Id As String = DownloadInfo.Inherit & $"-{If(IsNeo, "neo", "")}forge-" & DownloadInfo.Version - Dim Target As String = PathTemp & $"Cache\Code\{If(IsNeo, "Neo", "")}ForgeInstall-" & DownloadInfo.Version & "_" & GetUuid() & "." & DownloadInfo.FileSuffix - Dim VersionFolder As String = PathMcFolder & "versions\" & Id & "\" - Dim DisplayName As String = $"{If(IsNeo, "Neo", "")}Forge " & DownloadInfo.Inherit & " - " & DownloadInfo.Version + Dim McVersionName As String = $"{Info.Inherit}-{Info.LoaderName.ToLower}-{Info.VersionName}" + Dim TempFolder As String = $"{PathTemp}Cache\Code\{Info.LoaderName}Install-{Info.Version}_{GetUuid()}.{Info.FileExtension}" + Dim McVersionFolder As String = $"{PathMcFolder}versions\{McVersionName}\" + Dim DisplayName As String = $"{Info.LoaderName} {Info.Inherit} - {Info.VersionName}" Try '重复任务检查 SyncLock LoaderTaskbarLock For i = 0 To LoaderTaskbar.Count - 1 - If LoaderTaskbar(i).Name = DisplayName & " 下载" Then + If LoaderTaskbar(i).Name = Info.LoaderName & " 下载" Then Hint("该版本正在下载中!", HintType.Critical) Exit Sub End If @@ -1044,37 +1046,39 @@ Retry: End SyncLock '已有版本检查 - If File.Exists(VersionFolder & Id & ".json") Then - If MyMsgBox("版本 " & Id & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 json 和 jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then - File.Delete(VersionFolder & Id & ".jar") - File.Delete(VersionFolder & Id & ".json") + If File.Exists(McVersionFolder & McVersionName & ".json") Then + If MyMsgBox("版本 " & McVersionName & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 json 和 jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then + File.Delete(McVersionFolder & McVersionName & ".jar") + File.Delete(McVersionFolder & McVersionName & ".json") Else Exit Sub End If End If '启动 - Dim Loader As New LoaderCombo(Of String)(DisplayName & " 下载", McDownloadForgeLoader(IsNeo, DownloadInfo.Version, DownloadInfo.Inherit, DownloadInfo)) With {.OnStateChanged = AddressOf McInstallState} - Loader.Start(VersionFolder) + Dim Loader As New LoaderCombo(Of String)(Info.LoaderName & " 下载", + McDownloadForgelikeLoader(Info.IsNeoForge, If(Info.IsNeoForge, CType(Info, DlNeoForgeListEntry).ApiName, Info.VersionName), Info.Inherit, Info)) With + {.OnStateChanged = AddressOf McInstallState} + Loader.Start(McVersionFolder) LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() FrmMain.BtnExtraDownload.Ribble() Catch ex As Exception - Log(ex, $"开始 {If(IsNeo, "Neo", "")}Forge 下载失败", LogLevel.Feedback) + Log(ex, $"开始 {Info.LoaderName} 下载失败", LogLevel.Feedback) Finally '删除安装包 Try - If File.Exists(Target) Then File.Delete(Target) + If File.Exists(TempFolder) Then File.Delete(TempFolder) Catch End Try End Try End Sub - Public Sub McDownloadForgeSave(IsNeo As Boolean, Optional DownloadForgeInfo As DlForgeVersionEntry = Nothing, Optional DownloadNeoInfo As DlNeoForgeVersionEntry = Nothing) - Dim DownloadInfo = If(IsNeo, DownloadNeoInfo, DownloadForgeInfo) + Public Sub McDownloadForgelikeSave(Info As DlForgelikeEntry) Try - Dim Target As String = SelectAs("选择保存位置", DownloadInfo.FileName, $"{If(IsNeo, "Neo", "")}Forge 文件 (*." & DownloadInfo.FileSuffix & ")|*." & DownloadInfo.FileSuffix) - Dim DisplayName As String = $"{If(IsNeo, "Neo", "")}Forge " & DownloadInfo.Inherit & " - " & If(IsNeo, DownloadInfo.VersionCode, DownloadInfo.Version) + Dim Target As String = SelectAs("选择保存位置", $"{Info.LoaderName}-{Info.Inherit}-{Info.VersionName}.{Info.FileExtension}", + $"{Info.LoaderName} 安装器 (*.{Info.FileExtension})|*.{Info.FileExtension}") + Dim DisplayName As String = $"{Info.LoaderName} {Info.Inherit} - {Info.VersionName}" If Not Target.Contains("\") Then Exit Sub '重复任务检查 @@ -1087,50 +1091,41 @@ Retry: Next End SyncLock - '构造步骤加载器 - Dim Loaders As New List(Of LoaderBase) '获取下载地址 - If IsNeo Then + Dim Files As New List(Of NetFile) + If Info.IsNeoForge Then 'NeoForge - 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) - Dim IsLegacyNeo As Boolean = DownloadInfo.VersionCode.StartsWith("47.") - Files.Add(New NetFile({ - $"https://bmclapi2.bangbang93.com/maven/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}", - $"https://maven.neoforged.net/releases/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}" - }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=If(IsNeo, Nothing, DownloadInfo.Hash)))) - Task.Output = Files - End Sub) With {.ProgressWeight = 0.1, .Show = False}) + Dim Neo As DlNeoForgeListEntry = Info + Dim Url As String = Neo.UrlBase & "-installer.jar" + Files.Add(New NetFile({ + Url.Replace("maven.neoforged.net/releases", "bmclapi2.bangbang93.com/maven"), Url + }, Target, New FileChecker(MinSize:=64 * 1024))) Else 'Forge - Loaders.Add(New LoaderTask(Of DlForgeVersionEntry, List(Of NetFile))("获取下载地址", - Sub(Task As LoaderTask(Of DlForgeVersionEntry, List(Of NetFile))) - Dim Files As New List(Of NetFile) - Files.Add(New NetFile({ - "https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName, - "https://files.minecraftforge.net/maven/net/minecraftforge/forge/" & DownloadInfo.Inherit & "-" & DownloadInfo.FileVersion & "/" & DownloadInfo.FileName - }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=If(IsNeo, Nothing, DownloadInfo.Hash)))) - Task.Output = Files - End Sub) With {.ProgressWeight = 0.1, .Show = False}) + Dim Forge As DlForgeVersionEntry = Info + Files.Add(New NetFile({ + $"https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/{Forge.Inherit}-{Forge.FileVersion}/forge-{Forge.Inherit}-{Forge.FileVersion}-{Forge.Category}.{Forge.FileExtension}", + $"https://files.minecraftforge.net/maven/net/minecraftforge/forge/{Forge.Inherit}-{Forge.FileVersion}/forge-{Forge.Inherit}-{Forge.FileVersion}-{Forge.Category}.{Forge.FileExtension}" + }, Target, New FileChecker(MinSize:=64 * 1024, Hash:=Forge.Hash))) End If - '下载 - Loaders.Add(New LoaderDownload("下载主文件", New List(Of NetFile)) With {.ProgressWeight = 6}) + + '构造加载器 + Dim Loaders As New List(Of LoaderBase) + Loaders.Add(New LoaderDownload("下载主文件", Files) With {.ProgressWeight = 6}) '启动 - Dim Loader = If(IsNeo, New LoaderCombo(Of DlNeoForgeVersionEntry)(DisplayName & " 下载", Loaders) With {.OnStateChanged = AddressOf DownloadStateSave}, - New LoaderCombo(Of DlForgeVersionEntry)(DisplayName & " 下载", Loaders) With {.OnStateChanged = AddressOf DownloadStateSave}) - Loader.Start(DownloadInfo) + Dim Loader = New LoaderCombo(Of DlForgelikeEntry)(DisplayName & " 下载", Loaders) With {.OnStateChanged = AddressOf DownloadStateSave} + Loader.Start(Info) LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() FrmMain.BtnExtraDownload.Ribble() Catch ex As Exception - Log(ex, $"开始 {If(IsNeo, "Neo", "")}Forge 下载失败", LogLevel.Feedback) + Log(ex, $"开始 {Info.LoaderName} 安装器下载失败", LogLevel.Feedback) End Try End Sub - Private Sub ForgeInjector(Target As String, Task As LoaderTask(Of Boolean, Boolean), McFolder As String, UseJavaWrapper As Boolean, IsNeoForge As Boolean) + Private Sub ForgelikeInjector(Target As String, Task As LoaderTask(Of Boolean, Boolean), McFolder As String, UseJavaWrapper As Boolean, IsNeoForge As Boolean) '选择 Java Dim Java As JavaEntry SyncLock JavaLock @@ -1185,7 +1180,7 @@ Retry: Else LastResults.Enqueue(e.Data) If LastResults.Count > 100 Then LastResults.Dequeue() - ForgeInjectorLine(e.Data, Task) + ForgelikeInjectorLine(e.Data, Task) End If Catch ex As ObjectDisposedException Catch ex As Exception @@ -1208,7 +1203,7 @@ Retry: Else LastResults.Enqueue(e.Data) If LastResults.Count > 100 Then LastResults.Dequeue() - ForgeInjectorLine(e.Data, Task) + ForgelikeInjectorLine(e.Data, Task) End If Catch ex As ObjectDisposedException Catch ex As Exception @@ -1246,7 +1241,7 @@ Retry: End Using End SyncLock End Sub - Private Sub ForgeInjectorLine(Content As String, Task As LoaderTask(Of Boolean, Boolean)) + Private Sub ForgelikeInjectorLine(Content As String, Task As LoaderTask(Of Boolean, Boolean)) If Content.StartsWithF(" Data") OrElse Content.StartsWithF(" Slim") Then If ModeDebug Then Log("[Installer] " & Content) ElseIf Content.StartsWithF(" Reading patch ") Then @@ -1292,87 +1287,85 @@ Retry: End Sub ''' - ''' 获取下载某个 Forge / NeoForge 版本的加载器列表。 + ''' 获取下载某个 Forgelike 版本的加载器列表。 ''' - Private Function McDownloadForgeLoader(IsNeo As Boolean, Version As String, Inherit As String, Optional DownloadForgeInfo As DlForgeVersionEntry = Nothing, Optional DownloadNeoInfo As DlNeoForgeVersionEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) + Private Function McDownloadForgelikeLoader(IsNeoForge As Boolean, Version As String, Inherit As String, Optional Info As DlForgelikeEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) '参数初始化 - Dim DownloadInfo = If(IsNeo, DownloadNeoInfo, DownloadForgeInfo) - If IsNeo Then '兜底,有的时候 DownloadInfo 可能是空的 - If DownloadNeoInfo Is Nothing Then - DownloadInfo = New DlNeoForgeVersionEntry With {.VersionName = Version} - Version = Version.Replace("neoforge-", "").Replace("-beta", "").Replace("1.20.1-", "") - DownloadInfo.VersionCode = Version - If Version.Contains("-beta") Then DownloadInfo.IsBeta = True - Else - DownloadInfo = DownloadNeoInfo - Version = DownloadInfo.VersionCode - End If - Else - DownloadInfo = DownloadForgeInfo - End If McFolder = If(McFolder, PathMcFolder) - If Not IsNeo AndAlso Version.StartsWithF("1.") AndAlso Version.Contains("-") Then + If IsNeoForge AndAlso Info Is Nothing Then + '需要传入 API Name,但整合包版本可能不以 1.20.1- 开头,所以需要进行特别处理 + If Inherit = "1.20.1" AndAlso Not Version.StartsWithF("1.20.1-") Then + Info = New DlNeoForgeListEntry("1.20.1-" & Version) + Else + Info = New DlNeoForgeListEntry(Version) + End If + End If + If Not IsNeoForge AndAlso 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 - Dim LoaderName As String = If(IsNeo, "NeoForge", "Forge") + Dim LoaderName As String = If(IsNeoForge, "NeoForge", "Forge") Dim IsCustomFolder As Boolean = McFolder <> PathMcFolder - Dim Id As String = If(IsNeo, DownloadInfo.VersionName, Inherit & "-forge-" & Version) - Dim InstallerAddress As String = PathTemp & $"Cache\Code\{LoaderName}Install-" & Version & "_" & RandomInteger(0, 100000) - Dim VersionFolder As String = McFolder & "versions\" & Id & "\" - Dim DisplayName As String = $"{LoaderName} " & Inherit & " - " & Version + Dim InstallerAddress As String = $"{PathTemp}Cache\Code\{LoaderName}Install-{Version}_{RandomInteger(0, 100000)}" + Dim VersionName As String = If(IsNeoForge, "neoforge-" & Version.Replace("1.20.1-", ""), "forge-" & Version) + Dim VersionFolder As String = $"{McFolder}versions\{VersionName}\" + Log($"[Download] Forgelike 安装目标版本文件夹:{VersionFolder}") + Dim DisplayName As String = $"{LoaderName} {Inherit} - {Version}" Dim Loaders As New List(Of LoaderBase) - Dim LibVersionFolder As String = PathMcFolder & "versions\" & Id & "\" '作为 Lib 文件目标的版本文件夹 + Dim LibVersionFolder As String = $"{PathMcFolder}versions\{VersionName}\" '作为 Lib 文件目标的版本文件夹 - '获取下载信息 - If DownloadInfo Is Nothing Then + '获取 Forge 下载信息 + If Info Is Nothing Then Loaders.Add(New LoaderTask(Of String, String)($"获取 {LoaderName} 详细信息", Sub(Task As LoaderTask(Of String, String)) - '获取 Forge / NeoForge 版本列表 - Dim ForgeLoader = If(IsNeo, New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("McDownloadNeoForgeLoader " & Inherit, AddressOf DlNeoForgeVersionMain), New LoaderTask(Of String, List(Of DlForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlForgeVersionMain)) + '获取 Forge 对应 MC 版本列表 + Dim ForgeLoader = New LoaderTask(Of String, List(Of DlForgeVersionEntry))("McDownloadForgeLoader " & Inherit, AddressOf DlForgeVersionMain) ForgeLoader.WaitForExit(Inherit) Task.Progress = 0.8 '查找对应版本 For Each ForgeVersion In ForgeLoader.Output - If ForgeVersion.Version = Version Then - DownloadInfo = ForgeVersion + If VersionSortInteger(ForgeVersion.Version.ToString, Version) = 0 Then + Info = ForgeVersion Exit Sub End If Next Throw New Exception($"未能找到 {LoaderName} " & Inherit & "-" & Version & " 的详细信息!") End Sub) With {.ProgressWeight = 3}) End If - '下载 Forge / NeoForge 主文件 + '下载 Forgelike 主文件 Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"准备下载 {LoaderName}", - Sub(Task As LoaderTask(Of String, List(Of NetFile))) - '启动依赖版本的下载 - If ClientDownloadLoader Is Nothing Then - If IsCustomFolder Then Throw New Exception("如果没有指定原版下载器,则不能指定 MC 安装文件夹") - ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, Inherit) - End If - '添加主文件 - Dim Files - If IsNeo Then 'NeoForge - Dim IsLegacyNeo As Boolean = DownloadInfo.VersionCode.StartsWith("47.") - Files = New List(Of NetFile) From {New NetFile({ - $"https://bmclapi2.bangbang93.com/maven/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}", - $"https://maven.neoforged.net/releases/net/neoforged/{If(IsLegacyNeo, "", "neo")}forge/{If(IsLegacyNeo, "1.20.1-", "")}{DownloadInfo.VersionCode}{If(DownloadInfo.IsBeta, "-beta", "")}/{DownloadInfo.FileName}" - }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=If(IsNeo, Nothing, DownloadInfo.Hash)))} - Else 'Forge - Files = 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 - }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=If(IsNeo, Nothing, DownloadInfo.Hash)))} - End If - Task.Output = Files - End Sub) With {.ProgressWeight = 0.5, .Show = False}) + Sub(Task As LoaderTask(Of String, List(Of NetFile))) + '启动依赖版本的下载 + If ClientDownloadLoader Is Nothing Then + If IsCustomFolder Then Throw New Exception("如果没有指定原版下载器,则不能指定 MC 安装文件夹") + ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, Inherit) + End If + '添加主文件下载 + Dim Files As New List(Of NetFile) + If Info.IsNeoForge Then + 'NeoForge + Dim Neo As DlNeoForgeListEntry = Info + Dim Url As String = Neo.UrlBase & "-installer.jar" + Files.Add(New NetFile({ + Url.Replace("maven.neoforged.net/releases", "bmclapi2.bangbang93.com/maven"), Url + }, InstallerAddress, New FileChecker(MinSize:=64 * 1024))) + Else + 'Forge + Dim Forge As DlForgeVersionEntry = Info + Files.Add(New NetFile({ + $"https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/{Forge.Inherit}-{Forge.FileVersion}/forge-{Forge.Inherit}-{Forge.FileVersion}-{Forge.Category}.{Forge.FileExtension}", + $"https://files.minecraftforge.net/maven/net/minecraftforge/forge/{Forge.Inherit}-{Forge.FileVersion}/forge-{Forge.Inherit}-{Forge.FileVersion}-{Forge.Category}.{Forge.FileExtension}" + }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=Forge.Hash))) + End If + Task.Output = Files + End Sub) With {.ProgressWeight = 0.5, .Show = False}) Loaders.Add(New LoaderDownload($"下载 {LoaderName} 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) '安装(仅在新版安装时需要原版 Jar) - If Version.Before(".") >= 20 Then - Log($"[Download] 检测为{If(IsNeo, " Neo", "新版 ")}Forge:" & Version) + If IsNeoForge OrElse Version.Before(".") >= 20 Then + Log($"[Download] 检测为{If(IsNeoForge, " Neo", "新版 ")}Forge:" & Version) Dim Libs As List(Of McLibToken) = Nothing Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"分析 {LoaderName} 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) @@ -1400,10 +1393,10 @@ Retry: Log("[Download] 需要下载 Mappings:" & Address) End If Task.Progress = 0.8 - '去除其中的原始 Forge / NeoForge 项 + '去除其中的原始 Forgelike 项 For i = 0 To Libs.Count - 1 - If Libs(i).LocalPath.EndsWithF($"{If(IsNeo, "neo", "")}forge-" & Inherit & "-" & Version & ".jar") OrElse - Libs(i).LocalPath.EndsWithF("forge-" & Inherit & "-" & Version & "-client.jar") Then + If Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{Version}.jar") OrElse + Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{Version}-client.jar") Then Log($"[Download] 已从待下载 {LoaderName} 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug) Libs.RemoveAt(i) Exit For @@ -1411,7 +1404,7 @@ Retry: Next Task.Output = McLibFixFromLibToken(Libs, PathMcFolder) Catch ex As Exception - Throw New Exception($"获取{If(IsNeo, " Neo", "新版 ")}Forge 支持库列表失败", ex) + Throw New Exception($"获取{If(IsNeoForge, " Neo", "新版 ")}Forge 支持库列表失败", ex) Finally '释放文件 If Installer IsNot Nothing Then Installer.Dispose() @@ -1420,7 +1413,7 @@ Retry: Loaders.Add(New LoaderDownload($"下载 {LoaderName} 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 12}) Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)($"获取 {LoaderName} 支持库文件", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) -#Region "Forge / NeoForge 文件" +#Region "Forgelike 文件" If IsCustomFolder Then For Each LibFile As McLibToken In Libs Dim RealPath As String = LibFile.LocalPath.Replace(PathMcFolder, McFolder) @@ -1436,8 +1429,8 @@ Retry: '等待原版文件下载完成 If ClientDownloadLoader Is Nothing Then Exit Sub 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 + 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] {LoaderName} 安装正在等待原版文件下载完成") Do While TargetLoaders.Any AndAlso Not Task.IsAborted TargetLoaders = TargetLoaders.Where(Function(l) l.State <> LoadState.Finished).ToList @@ -1458,14 +1451,13 @@ Retry: End SyncLock #End Region End Sub) With {.ProgressWeight = 0.1, .Show = False}) - Loaders.Add(New LoaderTask(Of Boolean, Boolean)(If(IsNeo, "安装 NeoForge", "安装 Forge(方式 A)"), + Loaders.Add(New LoaderTask(Of Boolean, Boolean)(If(IsNeoForge, "安装 NeoForge", "安装 Forge(方式 A)"), Sub(Task As LoaderTask(Of Boolean, Boolean)) Dim Installer As ZipArchive = Nothing Try - Log($"[Download] 开始进行{If(IsNeo, " Neo", "新版方式 ")}Forge 安装:" & InstallerAddress) + Log($"[Download] 开始进行 Forgelike 安装:" & InstallerAddress) '记录当前文件夹列表(在新建目标文件夹之前) - Dim OldList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories. - Select(Function(i) i.FullName).ToList() + Dim OldList = New DirectoryInfo(McFolder & "versions\").EnumerateDirectories.Select(Function(i) i.FullName).ToList() '解压并获取信息 Installer = New ZipArchive(New FileStream(InstallerAddress, FileMode.Open)) Dim Json As JObject = GetJson(ReadFile(Installer.GetEntry("install_profile.json").Open)) @@ -1483,7 +1475,7 @@ Retry: WriteFile(PathTemp & "Cache\forge_installer.jar", GetResources("ForgeInstaller")) Task.Progress = 0.06 '运行注入器 - ForgeInjector(InstallerAddress, Task, McFolder, UseJavaWrapper, False) + ForgelikeInjector(InstallerAddress, Task, McFolder, UseJavaWrapper, IsNeoForge) Task.Progress = 0.97 Catch ex As Exception If UseJavaWrapper Then @@ -1500,11 +1492,13 @@ Retry: If DeltaList.Count > 1 Then '它可能和 OptiFine 安装同时运行,导致增加的文件不止一个(这导致了 #151) '也可能是因为 Forge 安装器的 Bug,生成了一个名字错误的文件夹,所以需要检查文件夹是否为空 - DeltaList = DeltaList.Where(Function(l) l.Name.Contains($"{If(IsNeo, "neo", "")}forge") AndAlso l.EnumerateFiles.Any).ToList + DeltaList = DeltaList.Where(Function(l) l.Name.ContainsF("forge", True) AndAlso l.EnumerateFiles.Any).ToList End If - If DeltaList.Count = 1 Then '如果没有新增文件夹,那么预测的文件夹名就是正确的 + If DeltaList.Count = 1 Then + '如果没有新增文件夹,那么预测的文件夹名就是正确的 + '如果只新增 1 个文件夹,那么拷贝 json 文件 Dim JsonFile As FileInfo = DeltaList(0).EnumerateFiles.First() - WriteFile(VersionFolder & Id & ".json", ReadFile(JsonFile.FullName)) + WriteFile(VersionFolder & VersionName & ".json", ReadFile(JsonFile.FullName)) End If '新建 mods 文件夹 Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\") @@ -1522,7 +1516,7 @@ Retry: End Sub) With {.ProgressWeight = 10}) Else Log("[Download] 检测为非新版 Forge:" & Version) - Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("安装 Forge(方式 B)", + Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)($"安装 {LoaderName}(方式 B)", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) Dim Installer As ZipArchive = Nothing Try @@ -1535,12 +1529,12 @@ Retry: Directory.CreateDirectory(VersionFolder) Task.Progress = 0.5 If Json("install") Is Nothing Then - '中版格式 - Log("[Download] 进行中版方式安装:" & InstallerAddress) + '中版:Legacy 方式 1 + Log("[Download] 开始进行 Forge 安装,Legacy 方式 1:" & InstallerAddress) '建立 Json 文件 Dim JsonVersion As JObject = GetJson(ReadFile(Installer.GetEntry(Json("json").ToString.TrimStart("/")).Open)) - JsonVersion("id") = Id - WriteFile(VersionFolder & Id & ".json", JsonVersion.ToString) + JsonVersion("id") = VersionName + WriteFile(VersionFolder & VersionName & ".json", JsonVersion.ToString) Task.Progress = 0.6 '解压支持库文件 Installer.Dispose() @@ -1548,17 +1542,17 @@ Retry: CopyDirectory(InstallerAddress & "_unrar\maven\", McFolder & "libraries\") DeleteDirectory(InstallerAddress & "_unrar\") Else - '旧版格式 - Log("[Download] 进行旧版方式安装:" & InstallerAddress) + '旧版:Legacy 方式 2 + Log("[Download] 开始进行 Forge 安装,Legacy 方式 2:" & 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 + Json("versionInfo")("id") = VersionName If Json("versionInfo")("inheritsFrom") Is Nothing Then CType(Json("versionInfo"), JObject).Add("inheritsFrom", Inherit) - WriteFile(VersionFolder & Id & ".json", Json("versionInfo").ToString) + WriteFile(VersionFolder & VersionName & ".json", Json("versionInfo").ToString) End If '新建 mods 文件夹 Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\") @@ -1589,16 +1583,16 @@ Retry: #Region "Forge 下载菜单" - Public Sub ForgeDownloadListItemPreload(Stack As StackPanel, Entrys As List(Of DlForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) + Public Sub ForgeDownloadListItemPreload(Stack As StackPanel, Entries As List(Of DlForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) '获取推荐版本与最新版本 Dim FreshVersion As DlForgeVersionEntry = Nothing - If Entrys.Any Then - FreshVersion = Entrys(0) + If Entries.Any Then + FreshVersion = Entries(0) Else Log("[System] 未找到可用的 Forge 版本", LogLevel.Debug) End If Dim RecommendedVersion As DlForgeVersionEntry = Nothing - For Each Entry In Entrys + For Each Entry In Entries If Entry.IsRecommended Then RecommendedVersion = Entry Next '若推荐版本与最新版本为同一版本,则仅显示推荐版本 @@ -1615,15 +1609,14 @@ Retry: Stack.Children.Add(Fresh) End If '添加间隔 - Stack.Children.Add(New TextBlock With {.Text = "全部版本 (" & Entrys.Count & ")", .HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(6, 13, 0, 4)}) + Stack.Children.Add(New TextBlock With {.Text = "全部版本 (" & Entries.Count & ")", .HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(6, 13, 0, 4)}) End Sub Public Function ForgeDownloadListItem(Entry As DlForgeVersionEntry, 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, - .Info = If(Entry.ReleaseTime = "", - If(ModeDebug, "种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), ""), - "发布于 " & Entry.ReleaseTime & If(ModeDebug, ",种类:" & Entry.Category & If(Entry.Branch Is Nothing, "", ",开发分支:" & Entry.Branch), "")), + .Title = Entry.VersionName, .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, + .Info = {If(Entry.ReleaseTime = "", "", "发布于 " & Entry.ReleaseTime), If(ModeDebug, "种类:" & Entry.Category, "")}. + Where(Function(d) d <> "").Join(","), .Logo = PathImage & "Blocks/Anvil.png" } AddHandler NewItem.Click, OnClick @@ -1666,7 +1659,7 @@ 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://files.minecraftforge.net/maven/net/minecraftforge/forge/{Version.Inherit}-{Version.VersionName}/forge-{Version.Inherit}-{Version.VersionName}-changelog.txt") End Sub Public Sub ForgeSave_Click(sender As Object, e As RoutedEventArgs) Dim Version As DlForgeVersionEntry @@ -1677,7 +1670,7 @@ Retry: Else Version = sender.Parent.Parent.Tag End If - McDownloadForgeSave(False, DownloadForgeInfo:=Version) + McDownloadForgelikeSave(Version) End Sub #End Region @@ -1741,19 +1734,17 @@ Retry: #Region "NeoForge 下载菜单" - Public Sub NeoForgeDownloadListItemPreload(Stack As StackPanel, Entrys As List(Of DlNeoForgeVersionEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) + Public Sub NeoForgeDownloadListItemPreload(Stack As StackPanel, Entries As List(Of DlNeoForgeListEntry), OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) '获取最新稳定版和测试版 - Dim FreshStableVersion As DlNeoForgeVersionEntry = Nothing - Dim FreshBetaVersion As DlNeoForgeVersionEntry = Nothing - If Entrys.Any Then - Dim VersionsArray = Entrys.ToList() - VersionsArray.Reverse() - For Each Entry In VersionsArray + Dim FreshStableVersion As DlNeoForgeListEntry = Nothing + Dim FreshBetaVersion As DlNeoForgeListEntry = Nothing + If Entries.Any() Then + For Each Entry In Entries.ToList() If Entry.IsBeta Then - FreshBetaVersion = Entry + If FreshBetaVersion Is Nothing Then FreshBetaVersion = Entry Else - If Entry.VersionCode.Contains("47.1.82") Then Continue For FreshStableVersion = Entry + Exit For End If Next Else @@ -1762,22 +1753,22 @@ Retry: '显示各个版本 If FreshStableVersion IsNot Nothing Then Dim Fresh = NeoForgeDownloadListItem(FreshStableVersion, OnClick, IsSaveOnly) - Fresh.Info = "最新版" & If(Fresh.Info = "", "", "," & Fresh.Info) + Fresh.Info = If(Fresh.Info = "", "最新稳定版", "最新" & Fresh.Info) Stack.Children.Add(Fresh) End If If FreshBetaVersion IsNot Nothing Then Dim Fresh = NeoForgeDownloadListItem(FreshBetaVersion, OnClick, IsSaveOnly) - Fresh.Info = "最新版" & If(Fresh.Info = "", "", "," & Fresh.Info) + Fresh.Info = If(Fresh.Info = "", "最新测试版", "最新" & Fresh.Info) Stack.Children.Add(Fresh) End If '添加间隔 - Stack.Children.Add(New TextBlock With {.Text = "全部版本 (" & Entrys.Count & ")", .HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(6, 13, 0, 4)}) + Stack.Children.Add(New TextBlock With {.Text = "全部版本 (" & Entries.Count & ")", .HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(6, 13, 0, 4)}) End Sub - Public Function NeoForgeDownloadListItem(Entry As DlNeoForgeVersionEntry, OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) As MyListItem + Public Function NeoForgeDownloadListItem(Info As DlNeoForgeListEntry, OnClick As MyListItem.ClickEventHandler, IsSaveOnly As Boolean) As MyListItem '建立控件 Dim NewItem As New MyListItem With { - .Title = If(Entry.IsBeta, Entry.VersionCode & "-beta", Entry.VersionCode), .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Entry, - .Info = If(Entry.IsBeta, "测试版", "稳定版"), + .Title = Info.VersionName, .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Info, + .Info = If(Info.IsBeta, "测试版", "稳定版"), .Logo = PathImage & "Blocks/NeoForge.png" } AddHandler NewItem.Click, OnClick @@ -1812,26 +1803,26 @@ Retry: sender.Buttons = {BtnInfo} End Sub Private Sub NeoForgeLog_Click(sender As Object, e As RoutedEventArgs) - Dim Version As DlNeoForgeVersionEntry + Dim Info As DlNeoForgeListEntry If sender.Tag IsNot Nothing Then - Version = sender.Tag + Info = sender.Tag ElseIf sender.Parent.Tag IsNot Nothing Then - Version = sender.Parent.Tag + Info = sender.Parent.Tag Else - Version = sender.Parent.Parent.Tag + Info = sender.Parent.Parent.Tag End If - OpenWebsite("https://maven.neoforged.net/releases/net/neoforged/neoforge/" & Version.VersionCode & "/" & Version.VersionName & "-changelog.txt") + OpenWebsite(Info.UrlBase & "-changelog.txt") End Sub Public Sub NeoForgeSave_Click(sender As Object, e As RoutedEventArgs) - Dim Version As DlNeoForgeVersionEntry + Dim Info As DlNeoForgeListEntry If sender.Tag IsNot Nothing Then - Version = sender.Tag + Info = sender.Tag ElseIf sender.Parent.Tag IsNot Nothing Then - Version = sender.Parent.Tag + Info = sender.Parent.Tag Else - Version = sender.Parent.Parent.Tag + Info = sender.Parent.Parent.Tag End If - McDownloadForgeSave(True, DownloadNeoInfo:=Version) + McDownloadForgelikeSave(Info) End Sub #End Region @@ -2009,7 +2000,7 @@ Retry: ''' ''' 欲下载的 NeoForge。 ''' - Public NeoForgeEntry As DlNeoForgeVersionEntry = Nothing + Public NeoForgeEntry As DlNeoForgeListEntry = Nothing ''' ''' 欲下载的 Fabric Loader 版本名。 @@ -2111,7 +2102,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 OrElse Request.NeoForgeEntry IsNot Nothing) Then + If PathTemp.Contains(" ") AndAlso (Request.OptiFineEntry IsNot Nothing OrElse Request.ForgeEntry IsNot Nothing OrElse Request.NeoForgeEntry IsNot Nothing) Then PathInstallTemp = OsDrive & "ProgramData\PCL\Install\" Else PathInstallTemp = PathTemp & "Install\" @@ -2146,11 +2137,11 @@ Retry: End If If Request.OptiFineEntry IsNot Nothing Then OptiFineFolder = TempMcFolder & "versions\" & Request.OptiFineEntry.NameVersion Dim ForgeFolder As String = Nothing - If Request.ForgeEntry IsNot Nothing Then Request.ForgeVersion = If(Request.ForgeVersion, Request.ForgeEntry.Version) + If Request.ForgeEntry IsNot Nothing Then Request.ForgeVersion = If(Request.ForgeVersion, Request.ForgeEntry.VersionName) 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.VersionName) - If Request.NeoForgeVersion IsNot Nothing Then NeoForgeFolder = TempMcFolder & "versions\" & If(Request.NeoForgeVersion.StartsWithF("1.20.1") OrElse Request.NeoForgeVersion.StartsWithF("47."), "1.20.1-forge-", "") & Request.NeoForgeVersion.Replace("1.20.1-forge-", "").Replace("1.20.1-", "") + If Request.NeoForgeVersion IsNot Nothing Then NeoForgeFolder = TempMcFolder & "versions\neoforge-" & 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 @@ -2168,7 +2159,6 @@ 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 Request.NeoForgeVersion IsNot Nothing Then Log("[Download] NeoForge 版本:" & Request.NeoForgeVersion) If FabricFolder IsNot Nothing Then Log("[Download] Fabric 缓存:" & FabricFolder) If LiteLoaderFolder IsNot Nothing Then Log("[Download] LiteLoader 缓存:" & LiteLoaderFolder) Log("[Download] 对应的原版版本:" & Request.MinecraftName) @@ -2203,11 +2193,11 @@ Retry: End If 'Forge If Request.ForgeVersion IsNot Nothing Then - LoaderList.Add(New LoaderCombo(Of String)("下载 Forge " & Request.ForgeVersion, McDownloadForgeLoader(False, 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}) + LoaderList.Add(New LoaderCombo(Of String)("下载 Forge " & Request.ForgeVersion, McDownloadForgelikeLoader(False, 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, McDownloadForgeLoader(True, 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}) + LoaderList.Add(New LoaderCombo(Of String)("下载 NeoForge " & Request.NeoForgeVersion, McDownloadForgelikeLoader(True, 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 @@ -2227,7 +2217,7 @@ Retry: 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.NeoForgeVersion IsNot Nothing) 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}) @@ -2335,7 +2325,7 @@ Retry: End If #End Region -#Region "处理 Json 文件" +#Region "处理 JSON 文件" '获取 minecraftArguments Dim AllArguments As String = If(MinecraftJson("minecraftArguments"), " ").ToString & " " & diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadClient.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadClient.xaml.vb index 519b862..95b18d0 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadClient.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadClient.xaml.vb @@ -87,7 +87,7 @@ PanMain.Children.Add(NewCard) Next Catch ex As Exception - Log(ex, "可视化版本列表出错", LogLevel.Feedback) + Log(ex, "可视化 MC 版本列表出错", LogLevel.Feedback) End Try End Sub diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb index 1fa91e3..0302160 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb @@ -177,17 +177,18 @@ End Sub) With {.ProgressWeight = 0.1}) '启动 - Dim Loader As New LoaderCombo(Of String)(LoaderName, Loaders) With {.OnStateChanged = Sub(MyLoader) - Select Case MyLoader.State - Case LoadState.Failed - Hint(MyLoader.Name & "失败:" & GetExceptionSummary(MyLoader.Error), HintType.Critical) - Case LoadState.Aborted - Hint(MyLoader.Name & "已取消!", HintType.Info) - Case LoadState.Loading - Exit Sub '不重新加载版本列表 - End Select - McInstallFailedClearFolder(MyLoader) - End Sub} + Dim Loader As New LoaderCombo(Of String)(LoaderName, Loaders) With {.OnStateChanged = + Sub(MyLoader) + Select Case MyLoader.State + Case LoadState.Failed + Hint(MyLoader.Name & "失败:" & GetExceptionSummary(MyLoader.Error), HintType.Critical) + Case LoadState.Aborted + Hint(MyLoader.Name & "已取消!", HintType.Info) + Case LoadState.Loading + Exit Sub '不重新加载版本列表 + End Select + McInstallFailedClearFolder(MyLoader) + End Sub} Loader.Start(PathMcFolder & "versions\" & VersionName & "\") LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() @@ -197,7 +198,7 @@ Log(ex, "下载资源整合包失败", LogLevel.Feedback) End Try End Sub - 'Mod 下载;整合包另存为 + 'Mod、资源包下载;整合包另存为 Public Shared CachedFolder As String = Nothing '仅在本次缓存的下载文件夹 Public Sub Save_Click(sender As Object, e As EventArgs) Dim File As CompFile = If(TypeOf sender Is MyListItem, sender, sender.Parent).Tag @@ -211,10 +212,10 @@ '获取 Mod 所需的加载器种类 Dim AllowForge As Boolean? = Nothing, AllowFabric As Boolean? = Nothing If File.ModLoaders.Any Then '从文件中获取 - AllowForge = File.ModLoaders.Contains(CompModLoaderType.Forge) + AllowForge = File.ModLoaders.Contains(CompModLoaderType.Forge) OrElse File.ModLoaders.Contains(CompModLoaderType.NeoForge) AllowFabric = File.ModLoaders.Contains(CompModLoaderType.Fabric) ElseIf Project.ModLoaders.Any Then '从工程中获取 - AllowForge = Project.ModLoaders.Contains(CompModLoaderType.Forge) + AllowForge = Project.ModLoaders.Contains(CompModLoaderType.Forge) OrElse File.ModLoaders.Contains(CompModLoaderType.NeoForge) AllowFabric = Project.ModLoaders.Contains(CompModLoaderType.Fabric) End If If AllowForge IsNot Nothing AndAlso Not AllowForge AndAlso @@ -230,7 +231,7 @@ If File.GameVersions.Any(Function(v) v.Contains(".")) AndAlso Not File.GameVersions.Any(Function(v) v.Contains(".") AndAlso v.Split(".")(1) = Version.Version.McCodeMain.ToString) Then Return False If AllowForge Is Nothing OrElse AllowFabric Is Nothing Then Return True - If AllowForge AndAlso Version.Version.HasForge Then Return True + If AllowForge AndAlso (Version.Version.HasForge OrElse Version.Version.HasNeoForge) Then Return True If AllowFabric AndAlso Version.Version.HasFabric Then Return True Return False End Function @@ -260,10 +261,11 @@ Log("[Comp] 由于当前版本不兼容,使用当前的 MC 文件夹作为默认下载位置") End If Else '选择 Mod 数量最多的版本 - Dim SelectedVersion = SuitableVersions.OrderBy(Function(v) - Dim Info As New DirectoryInfo(v.PathIndie & "mods\") - Return If(Info.Exists, Info.GetFiles().Length, -1) - End Function).LastOrDefault() + Dim SelectedVersion = SuitableVersions.OrderBy( + Function(v) + Dim Info As New DirectoryInfo(v.PathIndie & "mods\") + Return If(Info.Exists, Info.GetFiles().Length, -1) + End Function).LastOrDefault() DefaultFolder = SelectedVersion.PathIndie & "mods\" Directory.CreateDirectory(DefaultFolder) Log("[Comp] 使用适合的游戏版本作为默认下载位置(" & SelectedVersion.Name & ")") diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadForge.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadForge.xaml.vb index 78541a0..2b4c8e3 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadForge.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadForge.xaml.vb @@ -33,7 +33,7 @@ ' PanMain.Children.Insert(0, CardWarn) 'End If Catch ex As Exception - Log(ex, "可视化版本列表出错", LogLevel.Feedback) + Log(ex, "可视化 Forge 版本列表出错", LogLevel.Feedback) End Try End Sub @@ -56,7 +56,7 @@ End Sub Public Sub DownloadStart(sender As MyListItem, e As Object) - McDownloadForge(sender.Tag) + McDownloadForgelike(sender.Tag) End Sub '介绍栏 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml index 1cf0a2d..6c7a800 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml @@ -20,6 +20,7 @@ + @@ -94,7 +95,7 @@ + Data="F1 M2,0 L0,2 8,10 0,18 2,20 10,12 18,20 20,18 12,10 20,2 18,0 10,8 2,0Z" /> diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 0539f22..1304527 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -10,6 +10,7 @@ DlOptiFineListLoader.Start() DlLiteLoaderListLoader.Start() DlFabricListLoader.Start() + DlNeoForgeListLoader.Start() '重载预览 TextSelectName.ValidateRules = New ObjectModel.Collection(Of Validate) From {New ValidateFolderName(PathMcFolder & "versions")} @@ -26,6 +27,7 @@ LoadLiteLoader.State = DlLiteLoaderListLoader LoadFabric.State = DlFabricListLoader LoadFabricApi.State = DlFabricApiLoader + LoadNeoForge.State = DlNeoForgeListLoader LoadOptiFabric.State = DlOptiFabricLoader End Sub @@ -74,13 +76,6 @@ ForgeLoader.Start(SelectedMinecraftId) End If - '启动 NeoForge 加载 - If SelectedMinecraftId.StartsWith("1.") AndAlso Int(SelectedMinecraftId.Split(".")(1)) > 19 Then - Dim NeoForgeLoader = New LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))("DlNeoForgeVersion " & SelectedMinecraftId, AddressOf DlNeoForgeVersionMain) - LoadNeoForge.State = NeoForgeLoader - NeoForgeLoader.Start(SelectedMinecraftId) - End If - '启动 Fabric API、OptiFabric 加载 DlFabricApiLoader.Start() DlOptiFabricLoader.Start() @@ -88,34 +83,36 @@ AniStart({ AaOpacity(PanMinecraft, -PanMinecraft.Opacity, 100, 10), AaTranslateX(PanMinecraft, -50 - CType(PanMinecraft.RenderTransform, TranslateTransform).X, 110, 10), - AaCode(Sub() - PanBack.ScrollToHome() - TextSelectName.Validate() - OptiFine_Loaded() - LiteLoader_Loaded() - Forge_Loaded() - NeoForge_Loaded() - Fabric_Loaded() - FabricApi_Loaded() - OptiFabric_Loaded() - SelectReload() - End Sub, After:=True), + AaCode( + Sub() + PanBack.ScrollToHome() + TextSelectName.Validate() + OptiFine_Loaded() + LiteLoader_Loaded() + Forge_Loaded() + NeoForge_Loaded() + Fabric_Loaded() + FabricApi_Loaded() + OptiFabric_Loaded() + SelectReload() + End Sub, After:=True), AaOpacity(PanSelect, 1 - PanSelect.Opacity, 250, 150), AaTranslateX(PanSelect, -CType(PanSelect.RenderTransform, TranslateTransform).X, 500, 150, Ease:=New AniEaseOutBack(AniEasePower.Weak)), - AaCode(Sub() - PanMinecraft.Visibility = Visibility.Collapsed - PanBack.IsHitTestVisible = True - '初始化 Binding - If IsFirstLoaded Then Exit Sub - IsFirstLoaded = True - BtnOptiFineClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardOptiFine.MainTextBlock, .Mode = BindingMode.OneWay}) - BtnLiteLoaderClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardLiteLoader.MainTextBlock, .Mode = BindingMode.OneWay}) - BtnForgeClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardForge.MainTextBlock, .Mode = BindingMode.OneWay}) - BtnNeoForgeClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardNeoForge.MainTextBlock, .Mode = BindingMode.OneWay}) - BtnFabricClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardFabric.MainTextBlock, .Mode = BindingMode.OneWay}) - BtnFabricApiClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardFabricApi.MainTextBlock, .Mode = BindingMode.OneWay}) - BtnOptiFabricClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardOptiFabric.MainTextBlock, .Mode = BindingMode.OneWay}) - End Sub,, True) + AaCode( + Sub() + PanMinecraft.Visibility = Visibility.Collapsed + PanBack.IsHitTestVisible = True + '初始化 Binding + If IsFirstLoaded Then Exit Sub + IsFirstLoaded = True + BtnOptiFineClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardOptiFine.MainTextBlock, .Mode = BindingMode.OneWay}) + BtnLiteLoaderClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardLiteLoader.MainTextBlock, .Mode = BindingMode.OneWay}) + BtnForgeClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardForge.MainTextBlock, .Mode = BindingMode.OneWay}) + BtnNeoForgeClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardNeoForge.MainTextBlock, .Mode = BindingMode.OneWay}) + BtnFabricClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardFabric.MainTextBlock, .Mode = BindingMode.OneWay}) + BtnFabricApiClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardFabricApi.MainTextBlock, .Mode = BindingMode.OneWay}) + BtnOptiFabricClearInner.SetBinding(Shapes.Path.FillProperty, New Binding("Foreground") With {.Source = CardOptiFabric.MainTextBlock, .Mode = BindingMode.OneWay}) + End Sub,, True) }, "FrmDownloadInstall SelectPageSwitch", True) End Sub Public Sub ExitSelectPage() @@ -224,7 +221,7 @@ End Sub 'NeoForge - Private SelectedNeoForge As DlNeoForgeVersionEntry = Nothing + Private SelectedNeoForge As DlNeoForgeListEntry = Nothing Private Sub SetNeoForgeInfoShow(IsShow As String) If PanNeoForgeInfo.Tag = IsShow Then Exit Sub PanNeoForgeInfo.Tag = IsShow @@ -368,13 +365,14 @@ Else BtnForgeClear.Visibility = Visibility.Visible ImgForge.Visibility = Visibility.Visible - LabForge.Text = SelectedForge.Version + LabForge.Text = SelectedForge.VersionName LabForge.Foreground = ColorGray1 End If 'NeoForge If Not SelectedMinecraftId.Contains("1.") OrElse Val(SelectedMinecraftId.Split(".")(1)) <= 19 Then CardNeoForge.Visibility = Visibility.Collapsed Else + CardNeoForge.Visibility = Visibility.Visible Dim NeoForgeError As String = LoadNeoForgeGetError() CardNeoForge.MainSwap.Visibility = If(NeoForgeError Is Nothing, Visibility.Visible, Visibility.Collapsed) If NeoForgeError IsNot Nothing Then CardNeoForge.IsSwaped = True @@ -387,7 +385,7 @@ Else BtnNeoForgeClear.Visibility = Visibility.Visible ImgNeoForge.Visibility = Visibility.Visible - LabNeoForge.Text = SelectedNeoForge.VersionCode & If(SelectedNeoForge.IsBeta, "-beta", "") + LabNeoForge.Text = SelectedNeoForge.VersionName LabNeoForge.Foreground = ColorGray1 End If End If @@ -461,9 +459,16 @@ HintFabricAPI.Visibility = Visibility.Collapsed End If If SelectedFabric IsNot Nothing AndAlso SelectedOptiFine IsNot Nothing AndAlso SelectedOptiFabric Is Nothing Then - HintOptiFabric.Visibility = Visibility.Visible + If SelectedMinecraftId.StartsWith("1.14") OrElse SelectedMinecraftId.StartsWith("1.15") Then + HintOptiFabric.Visibility = Visibility.Collapsed + HintOptiFabricOld.Visibility = Visibility.Visible + Else + HintOptiFabric.Visibility = Visibility.Visible + HintOptiFabricOld.Visibility = Visibility.Collapsed + End If Else HintOptiFabric.Visibility = Visibility.Collapsed + HintOptiFabricOld.Visibility = Visibility.Collapsed End If If SelectedMinecraftId.Contains("1.") AndAlso Val(SelectedMinecraftId.Split(".")(1)) >= 16 AndAlso SelectedOptiFine IsNot Nothing AndAlso (SelectedForge IsNot Nothing OrElse SelectedFabric IsNot Nothing) Then @@ -500,10 +505,10 @@ Name += "-Fabric " & SelectedFabric.Replace("+build", "") End If If SelectedForge IsNot Nothing Then - Name += "-Forge_" & SelectedForge.Version + Name += "-Forge_" & SelectedForge.VersionName End If If SelectedNeoForge IsNot Nothing Then - Name += "-NeoForge_" & SelectedNeoForge.VersionCode & If(SelectedNeoForge.IsBeta, "-beta", "") + Name += "-NeoForge_" & SelectedNeoForge.VersionName End If If SelectedLiteLoader IsNot Nothing Then Name += "-LiteLoader" @@ -522,10 +527,10 @@ Info += ", Fabric " & SelectedFabric.Replace("+build", "") End If If SelectedForge IsNot Nothing Then - Info += ", Forge " & SelectedForge.Version + Info += ", Forge " & SelectedForge.VersionName End If If SelectedNeoForge IsNot Nothing Then - Info += ", NeoForge " & SelectedNeoForge.VersionCode & If(SelectedNeoForge.IsBeta, "-beta", "") + Info += ", NeoForge " & SelectedNeoForge.VersionName End If If SelectedLiteLoader IsNot Nothing Then Info += ", LiteLoader" @@ -683,6 +688,7 @@ ''' 获取 OptiFine 的加载异常信息。若正常则返回 Nothing。 ''' Private Function LoadOptiFineGetError() As String + If SelectedNeoForge IsNot Nothing Then Return "与 NeoForge 不兼容" If LoadOptiFine Is Nothing OrElse LoadOptiFine.State.LoadingState = MyLoading.MyLoadingState.Run Then Return "正在获取版本列表……" If LoadOptiFine.State.LoadingState = MyLoading.MyLoadingState.Error Then Return "获取版本列表失败:" & CType(LoadOptiFine.State, Object).Error.Message '检查 Forge 1.13 - 1.14.3:全部不兼容 @@ -718,10 +724,11 @@ Private Function IsOptiFineSuitForForge(OptiFine As DlOptiFineListEntry, Forge As DlForgeVersionEntry) If Forge.Inherit <> OptiFine.Inherit Then Return False '不是同一个大版本 If OptiFine.RequiredForgeVersion Is Nothing Then Return False '不兼容 Forge - Return (OptiFine.RequiredForgeVersion.Contains(".") AndAlso 'XX.X.XXX - VersionSortInteger(Forge.Version, OptiFine.RequiredForgeVersion) >= 0) OrElse - (Not OptiFine.RequiredForgeVersion.Contains(".") AndAlso '#XXXX - Forge.Version.After(".") >= OptiFine.RequiredForgeVersion) + If OptiFine.RequiredForgeVersion.Contains(".") Then 'XX.X.XXX + Return VersionSortInteger(Forge.Version.ToString, OptiFine.RequiredForgeVersion) >= 0 + Else 'XXXX + Return Forge.Version.Revision >= OptiFine.RequiredForgeVersion + End If End Function '限制展开 @@ -744,11 +751,12 @@ Next If Not Versions.Any() Then Exit Sub '排序 - Versions = Sort(Versions, Function(Left As DlOptiFineListEntry, Right As DlOptiFineListEntry) As Boolean - If Not Left.IsPreview AndAlso Right.IsPreview Then Return True - If Left.IsPreview AndAlso Not Right.IsPreview Then Return False - Return VersionSortBoolean(Left.NameDisplay, Right.NameDisplay) - End Function) + Versions = Sort(Versions, + Function(Left As DlOptiFineListEntry, Right As DlOptiFineListEntry) As Boolean + If Not Left.IsPreview AndAlso Right.IsPreview Then Return True + If Left.IsPreview AndAlso Not Right.IsPreview Then Return False + Return VersionSortBoolean(Left.NameDisplay, Right.NameDisplay) + End Function) '可视化 PanOptiFine.Children.Clear() For Each Version In Versions @@ -791,7 +799,6 @@ If LoadLiteLoader Is Nothing OrElse LoadLiteLoader.State.LoadingState = MyLoading.MyLoadingState.Run Then Return "正在获取版本列表……" If LoadLiteLoader.State.LoadingState = MyLoading.MyLoadingState.Error Then Return "获取版本列表失败:" & CType(LoadLiteLoader.State, Object).Error.Message For Each Version As DlLiteLoaderListEntry In DlLiteLoaderListLoader.Output.Value - If SelectedNeoForge IsNot Nothing Then Return "与 NeoForge 不兼容" If Version.Inherit = SelectedMinecraftId Then Return Nothing Next Return "没有可用版本" @@ -892,16 +899,15 @@ If SelectedMinecraftId <> Loader.Input Then Exit Sub If Loader.State <> LoadState.Finished Then Exit Sub '获取要显示的版本 - Dim Versions As New List(Of DlForgeVersionEntry) - Versions.AddRange(Loader.Output) '复制数组,以免 Output 在实例化后变空 + Dim Versions = Loader.Output.ToList '复制数组,以免 Output 在实例化后变空 If Not Loader.Output.Any() Then Exit Sub PanForge.Children.Clear() - Versions = Sort(Versions, Function(a, b) New Version(a.Version) > New Version(b.Version)). - Where(Function(v) - If v.Category = "universal" OrElse v.Category = "client" Then Return False '跳过无法自动安装的版本 - If SelectedOptiFine IsNot Nothing AndAlso Not IsOptiFineSuitForForge(SelectedOptiFine, v) Then Return False - Return True - End Function).ToList + Versions = Sort(Versions, Function(a, b) a.Version > b.Version).Where( + Function(v) + If v.Category = "universal" OrElse v.Category = "client" Then Return False '跳过无法自动安装的版本 + If SelectedOptiFine IsNot Nothing AndAlso Not IsOptiFineSuitForForge(SelectedOptiFine, v) Then Return False + Return True + End Function).ToList() ForgeDownloadListItemPreload(PanForge, Versions, AddressOf Forge_Selected, False) For Each Version In Versions PanForge.Children.Add(ForgeDownloadListItem(Version, AddressOf Forge_Selected, False)) @@ -936,25 +942,16 @@ ''' Private Function LoadNeoForgeGetError() As String If Not SelectedMinecraftId.StartsWith("1.") Then Return "没有可用版本" - If Not LoadNeoForge.State.IsLoader Then Return "正在获取版本列表……" - Dim Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)) = LoadNeoForge.State - If SelectedMinecraftId <> Loader.Input Then Return "正在获取版本列表……" - If Loader.State = LoadState.Loading Then Return "正在获取版本列表……" - If Loader.State = LoadState.Failed Then - Dim ErrorMessage As String = Loader.Error.Message - If ErrorMessage.Contains("没有可用版本") Then - Return "没有可用版本" - Else - Return "获取版本列表失败:" & ErrorMessage - End If - End If - If Loader.State <> LoadState.Finished Then Return "获取版本列表失败:未知错误,状态为 " & GetStringFromEnum(Loader.State) - For Each Version In Loader.Output - If SelectedForge IsNot Nothing Then Return "与 Forge 不兼容" - If SelectedFabric IsNot Nothing Then Return "与 Fabric 不兼容" + If SelectedOptiFine IsNot Nothing Then Return "与 OptiFine 不兼容" + If SelectedForge IsNot Nothing Then Return "与 Forge 不兼容" + If SelectedFabric IsNot Nothing Then Return "与 Fabric 不兼容" + If LoadNeoForge Is Nothing OrElse LoadNeoForge.State.LoadingState = MyLoading.MyLoadingState.Run Then Return "正在获取版本列表……" + If LoadNeoForge.State.LoadingState = MyLoading.MyLoadingState.Error Then Return "获取版本列表失败:" & CType(LoadNeoForge.State, Object).Error.Message + If DlNeoForgeListLoader.Output.Value.Any(Function(v) v.Inherit = SelectedMinecraftId) Then Return Nothing - Next - Return False + Else + Return "没有可用版本" + End If End Function '限制展开 @@ -965,18 +962,14 @@ ''' ''' 尝试重新可视化 NeoForge 版本列表。 ''' - Private Sub NeoForge_Loaded() Handles LoadForge.StateChanged + Private Sub NeoForge_Loaded() Handles LoadNeoForge.StateChanged Try - If Not LoadNeoForge.State.IsLoader Then Exit Sub - Dim Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)) = LoadNeoForge.State - If SelectedMinecraftId <> Loader.Input Then Exit Sub - If Loader.State <> LoadState.Finished Then Exit Sub - '获取要显示的版本 - Dim Versions As New List(Of DlNeoForgeVersionEntry) - Versions.AddRange(Loader.Output) '复制数组,以免 Output 在实例化后变空 - If Not Loader.Output.Any() Then Exit Sub + '获取版本列表 + If DlNeoForgeListLoader.State <> LoadState.Finished Then Exit Sub + Dim Versions = DlNeoForgeListLoader.Output.Value.Where(Function(v) v.Inherit = SelectedMinecraftId).ToList + If Not Versions.Any() Then Exit Sub + '可视化 PanNeoForge.Children.Clear() - NeoForgeDownloadListItemPreload(PanNeoForge, Versions, AddressOf NeoForge_Selected, False) For Each Version In Versions PanNeoForge.Children.Add(NeoForgeDownloadListItem(Version, AddressOf NeoForge_Selected, False)) @@ -1013,9 +1006,8 @@ If LoadFabric.State.LoadingState = MyLoading.MyLoadingState.Error Then Return "获取版本列表失败:" & CType(LoadFabric.State, Object).Error.Message For Each Version As JObject In DlFabricListLoader.Output.Value("game") If Version("version").ToString = SelectedMinecraftId.Replace("∞", "infinite").Replace("Combat Test 7c", "1.16_combat-3") Then - If SelectedNeoForge IsNot Nothing Then Return "与 NeoForge 不兼容" If SelectedForge IsNot Nothing Then Return "与 Forge 不兼容" - 'If SelectedOptiFine IsNot Nothing Then Return "与 OptiFine 不兼容" + If SelectedNeoForge IsNot Nothing Then Return "与 NeoForge 不兼容" Return Nothing End If Next @@ -1202,6 +1194,7 @@ ''' 获取 OptiFabric 的加载异常信息。若正常则返回 Nothing。 ''' Private Function LoadOptiFabricGetError() As String + If SelectedMinecraftId.StartsWith("1.14") OrElse SelectedMinecraftId.StartsWith("1.15") Then Return "不兼容老版本 Fabric,请手动下载 OptiFabric Origins" If LoadOptiFabric Is Nothing OrElse LoadOptiFabric.State.LoadingState = MyLoading.MyLoadingState.Run Then Return "正在获取版本列表……" If LoadOptiFabric.State.LoadingState = MyLoading.MyLoadingState.Error Then Return "获取版本列表失败:" & CType(LoadOptiFabric.State, Object).Error.Message If DlOptiFabricLoader.Output Is Nothing Then @@ -1247,7 +1240,8 @@ PanOptiFabric.Children.Add(OptiFabricDownloadListItem(Version, AddressOf OptiFabric_Selected)) Next '自动选择 OptiFabric - If Not AutoSelectedOptiFabric Then + If Not AutoSelectedOptiFabric AndAlso + Not (SelectedMinecraftId.StartsWith("1.14") OrElse SelectedMinecraftId.StartsWith("1.15")) Then '1.14~15 不自动选择 AutoSelectedOptiFabric = True Log($"[Download] 已自动选择 OptiFabric:{CType(PanOptiFabric.Children(0), MyListItem).Title}") OptiFabric_Selected(PanOptiFabric.Children(0), Nothing) @@ -1279,7 +1273,7 @@ End Sub Private Sub BtnSelectStart_Click() Handles BtnSelectStart.Click '确认版本隔离 - If (SelectedForge IsNot Nothing OrElse SelectedFabric IsNot Nothing OrElse SelectedNeoForge IsNot Nothing) AndAlso + If (SelectedForge IsNot Nothing OrElse SelectedNeoForge IsNot Nothing OrElse SelectedFabric IsNot Nothing) AndAlso (Setup.Get("LaunchArgumentIndie") = 0 OrElse Setup.Get("LaunchArgumentIndie") = 2) Then If MyMsgBox("你尚未开启版本隔离,这会导致多个 MC 共用同一个 Mod 文件夹。" & vbCrLf & "因此在切换 MC 版本时,MC 会因为读取到与当前版本不符的 Mod 而崩溃。" & vbCrLf & diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml index f4b7653..8a64667 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml @@ -43,48 +43,47 @@ - - - - - - - - - + - + - - + - + - + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb index 8d1e2e2..2658c33 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb @@ -72,17 +72,19 @@ FrmMain.PageRight = Target CType(FrmMain.PanMainRight.Child, MyPageRight).PageOnExit() AniStart({ - AaCode(Sub() - CType(FrmMain.PanMainRight.Child, MyPageRight).PageOnForceExit() - FrmMain.PanMainRight.Child = FrmMain.PageRight - FrmMain.PageRight.Opacity = 0 - End Sub, 130), - AaCode(Sub() - '延迟触发页面通用动画,以使得在 Loaded 事件中加载的控件得以处理 - FrmMain.PageRight.Opacity = 1 - FrmMain.PageRight.PageOnEnter() - End Sub, 30, True) - }, "PageLeft PageChange") + AaCode( + Sub() + CType(FrmMain.PanMainRight.Child, MyPageRight).PageOnForceExit() + FrmMain.PanMainRight.Child = FrmMain.PageRight + FrmMain.PageRight.Opacity = 0 + End Sub, 130), + AaCode( + Sub() + '延迟触发页面通用动画,以使得在 Loaded 事件中加载的控件得以处理 + FrmMain.PageRight.Opacity = 1 + FrmMain.PageRight.PageOnEnter() + End Sub, 30, True) + }, "PageLeft PageChange") End Sub #End Region @@ -163,11 +165,12 @@ ItemForge.Visibility = Visibility.Visible ItemNeoForge.Visibility = Visibility.Visible ItemLiteLoader.Visibility = Visibility.Visible - RunInThread(Sub() - Thread.Sleep(20) - RunInUiWait(Sub() ItemClient.SetChecked(True, True, True)) - AniControlEnabled -= 1 - End Sub) + RunInThread( + Sub() + Thread.Sleep(20) + RunInUiWait(Sub() ItemClient.SetChecked(True, True, True)) + AniControlEnabled -= 1 + End Sub) End Sub '折叠手动安装 Private Sub LabHand_Click(sender As Object, e As MouseButtonEventArgs) Handles LabHand.MouseLeftButtonUp @@ -178,15 +181,16 @@ LabHand.Visibility = Visibility.Collapsed ItemClient.Visibility = Visibility.Collapsed ItemOptiFine.Visibility = Visibility.Collapsed + ItemNeoForge.Visibility = Visibility.Collapsed ItemFabric.Visibility = Visibility.Collapsed ItemForge.Visibility = Visibility.Collapsed - ItemNeoForge.Visibility = Visibility.Collapsed ItemLiteLoader.Visibility = Visibility.Collapsed - RunInThread(Sub() - Thread.Sleep(20) - RunInUiWait(Sub() ItemInstall.SetChecked(True, True, True)) - AniControlEnabled -= 1 - End Sub) + RunInThread( + Sub() + Thread.Sleep(20) + RunInUiWait(Sub() ItemInstall.SetChecked(True, True, True)) + AniControlEnabled -= 1 + End Sub) End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLiteLoader.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLiteLoader.xaml.vb index 9a73bbe..ac18c47 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLiteLoader.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLiteLoader.xaml.vb @@ -38,7 +38,7 @@ PanMain.Children.Add(NewCard) Next Catch ex As Exception - Log(ex, "可视化版本列表出错", LogLevel.Feedback) + Log(ex, "可视化 LiteLoader 版本列表出错", LogLevel.Feedback) End Try End Sub diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml index 814d1c8..4483c5d 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml @@ -33,6 +33,7 @@ + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb index b77199a..db3f168 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb @@ -40,12 +40,14 @@ Visibility.Visible, Visibility.Collapsed) LabPage.Text = Page + 1 BtnPageFirst.IsEnabled = Page > 1 - BtnPageFirst.Opacity = If(BtnPageFirst.IsEnabled, 1, 0.2) + BtnPageFirst.Opacity = If(Page > 1, 1, 0.2) BtnPageLeft.IsEnabled = Page > 0 - BtnPageLeft.Opacity = If(BtnPageLeft.IsEnabled, 1, 0.2) - BtnPageRight.IsEnabled = Storage.Results.Count > PageSize * (Page + 1) OrElse - Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal - BtnPageRight.Opacity = If(BtnPageRight.IsEnabled, 1, 0.2) + BtnPageLeft.Opacity = If(Page > 0, 1, 0.2) + Dim IsRightEnabled As Boolean = '由于 WPF 的未知 bug,读取到的 IsEnabled 可能是错误的值(#3319) + Storage.Results.Count > PageSize * (Page + 1) OrElse + Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal + BtnPageRight.IsEnabled = IsRightEnabled + BtnPageRight.Opacity = If(IsRightEnabled, 1, 0.2) '错误信息 If Storage.ErrorMessage Is Nothing Then HintError.Visibility = Visibility.Collapsed @@ -89,11 +91,12 @@ Page = NewPage FrmMain.BackToTop() Log($"[Download] Mod 切换到第 {Page + 1} 页") - RunInThread(Sub() - Thread.Sleep(100) '等待向上滚的动画结束 - RunInUi(Sub() CardPages.IsEnabled = True) - Loader.Start() - End Sub) + RunInThread( + Sub() + Thread.Sleep(100) '等待向上滚的动画结束 + RunInUi(Sub() CardPages.IsEnabled = True) + Loader.Start() + End Sub) End Sub #Region "搜索" diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml index f72fb9d..f9b7bc3 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml @@ -8,22 +8,20 @@ - + - + - - + - + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb index bdd3b01..064dda5 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadNeoForge.xaml.vb @@ -10,12 +10,17 @@ Private Sub Load_OnFinish() '结果数据化 Try - Dim Versions = Sort(DlNeoForgeListLoader.Output.Value, AddressOf VersionSortBoolean) + '归类 + Dim Dict = DlNeoForgeListLoader.Output.Value.GroupBy(Function(d) d.Inherit).OrderByDescending(Function(g) g.Key). + ToDictionary(Function(g) g.Key, Function(g) g.ToList()) + '清空当前 PanMain.Children.Clear() - For Each Version As String In Versions + '转化为 UI + For Each Pair As KeyValuePair(Of String, List(Of DlNeoForgeListEntry)) In Dict + If Not Pair.Value.Any() Then Continue For '增加卡片 - Dim NewCard As New MyCard With {.Title = Version.Replace("_p", " P"), .Margin = New Thickness(0, 0, 0, 15), .SwapType = 13} - Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = Version} + Dim NewCard As New MyCard With {.Title = Pair.Key & " (" & Pair.Value.Count & ")", .Margin = New Thickness(0, 0, 0, 15), .SwapType = 13} + Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = Pair.Value} NewCard.Children.Add(NewStack) NewCard.SwapControl = NewStack NewCard.IsSwaped = True @@ -25,30 +30,5 @@ Log(ex, "可视化 NeoForge 版本列表出错", LogLevel.Feedback) End Try End Sub - Public Sub NeoForge_StateChanged(sender As MyLoading, newState As MyLoading.MyLoadingState, oldState As MyLoading.MyLoadingState) - If newState <> MyLoading.MyLoadingState.Stop Then Exit Sub - Dim Card As MyCard = CType(sender.Parent, FrameworkElement).Parent - Dim Loader As LoaderTask(Of String, List(Of DlNeoForgeVersionEntry)) = sender.State - '载入列表 - Card.SwapControl.Children.Clear() - Card.SwapControl.Tag = Loader.Output - Card.SwapType = 14 - Card.StackInstall() - End Sub - Public Sub NeoForge_Click(sender As MyLoading, e As MouseButtonEventArgs) - If sender.State.LoadingState = MyLoading.MyLoadingState.Error Then - CType(sender.State, LoaderTask(Of String, List(Of DlNeoForgeVersionEntry))).Start(IsForceRestart:=True) - End If - End Sub - Private Sub NeoForge_Selected(sender As MyListItem, e As EventArgs) - McDownloadForgeSave(True, sender.Tag) - End Sub - Public Sub DownloadStart(sender As MyListItem, e As Object) - McDownloadForge(True, 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 +End Class \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadOptiFine.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadOptiFine.xaml.vb index 0fc791c..27c2fd4 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadOptiFine.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadOptiFine.xaml.vb @@ -13,7 +13,7 @@ '归类 Dim Dict As New Dictionary(Of String, List(Of DlOptiFineListEntry)) Dict.Add("快照版本", New List(Of DlOptiFineListEntry)) - For VersionCode As Integer = 30 To 0 Step -1 + For VersionCode As Integer = 50 To 0 Step -1 Dict.Add("1." & VersionCode, New List(Of DlOptiFineListEntry)) Next For Each Version As DlOptiFineListEntry In DlOptiFineListLoader.Output.Value @@ -42,14 +42,10 @@ PanMain.Children.Add(NewCard) Next Catch ex As Exception - Log(ex, "可视化版本列表出错", LogLevel.Feedback) + Log(ex, "可视化 OptiFine 版本列表出错", LogLevel.Feedback) End Try End Sub - Public Sub DownloadStart(sender As MyListItem, e As Object) - McDownloadOptiFine(sender.Tag) - End Sub - Private Sub BtnWeb_Click(sender As Object, e As EventArgs) Handles BtnWeb.Click OpenWebsite("https://www.optifine.net/") End Sub diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml index a59954f..1ed768b 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml @@ -32,6 +32,7 @@ + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb index d9cbd06..6ec8a31 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb @@ -39,12 +39,14 @@ Visibility.Visible, Visibility.Collapsed) LabPage.Text = Page + 1 BtnPageFirst.IsEnabled = Page > 1 - BtnPageFirst.Opacity = If(BtnPageFirst.IsEnabled, 1, 0.2) + BtnPageFirst.Opacity = If(Page > 1, 1, 0.2) BtnPageLeft.IsEnabled = Page > 0 - BtnPageLeft.Opacity = If(BtnPageLeft.IsEnabled, 1, 0.2) - BtnPageRight.IsEnabled = Storage.Results.Count > PageSize * (Page + 1) OrElse - Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal - BtnPageRight.Opacity = If(BtnPageRight.IsEnabled, 1, 0.2) + BtnPageLeft.Opacity = If(Page > 0, 1, 0.2) + Dim IsRightEnabled As Boolean = '由于 WPF 的未知 bug,读取到的 IsEnabled 可能是错误的值(#3319) + Storage.Results.Count > PageSize * (Page + 1) OrElse + Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal + BtnPageRight.IsEnabled = IsRightEnabled + BtnPageRight.Opacity = If(IsRightEnabled, 1, 0.2) '错误信息 If Storage.ErrorMessage Is Nothing Then HintError.Visibility = Visibility.Collapsed diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index c0d838b..1cd098d 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -241,7 +241,7 @@ Retry: {"Translator-Chinese", "Crowdin 中文翻译者披风"}, {"Translator", "Crowdin 翻译者披风"}, {"Cobalt", "Cobalt 披风"}, {"Vanilla", "原版披风"}, {"Minecon2011", "Minecon 2011 参与者披风"}, {"Minecon2012", "Minecon 2012 参与者披风"}, {"Minecon2013", "Minecon 2013 参与者披风"}, {"Minecon2015", "Minecon 2015 参与者披风"}, {"Minecon2016", "Minecon 2016 参与者披风"}, - {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower's","追随者披风"} + {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower's", "追随者披风"} } Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}} For Each Cape In SkinData("capes") diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb index 8da1fc5..5efe384 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb @@ -27,15 +27,16 @@ ''' 刷新自定义主页。 ''' Private Sub Refresh() Handles Me.Loaded - RunInNewThread(Sub() - Try - SyncLock RefreshLock - RefreshReal() - End SyncLock - Catch ex As Exception - Log(ex, "加载 PCL 主页自定义信息失败", LogLevel.Msgbox) - End Try - End Sub, $"刷新自定义主页 #{GetUuid()}") + RunInNewThread( + Sub() + Try + SyncLock RefreshLock + RefreshReal() + End SyncLock + Catch ex As Exception + Log(ex, "加载 PCL 主页自定义信息失败", LogLevel.Msgbox) + End Try + End Sub, $"刷新自定义主页 #{GetUuid()}") End Sub Private Sub RefreshReal() Dim Content As String = "" @@ -155,7 +156,6 @@ Download: Else Log(ex, $"联网下载自定义主页失败({Address})") End If - Address = "" End Try End Sub @@ -204,7 +204,7 @@ Download: End If Content = "" & Content & "" Content = HelpArgumentReplace(Content) - Log($"[Page] 实例化:加载自定义主页 UI,最终内容长度:{Content.Count}") + Log($"[Page] 实例化:加载自定义主页 UI 开始,最终内容长度:{Content.Count}") Try PanCustom.Children.Add(GetObjectFromXML(Content)) Catch ex As Exception diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb index 4bf92e2..e61fa4e 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb @@ -39,14 +39,15 @@ Public Shared Function GetLoginData() As McLoginMs If FrmLoginMs Is Nothing Then Return New McLoginMs With {.OAuthRefreshToken = Setup.Get("CacheMsOAuthRefresh"), .UserName = Setup.Get("CacheMsName")} Dim Result As McLoginMs = Nothing - RunInUiWait(Sub() - If FrmLoginMs.ComboAccounts.SelectedIndex = 0 Then - Result = New McLoginMs - Else - Dim Item As MyListItem = FrmLoginMs.ComboAccounts.SelectedItem - Result = New McLoginMs With {.OAuthRefreshToken = Item.Tag, .UserName = Item.Title} - End If - End Sub) + RunInUiWait( + Sub() + If FrmLoginMs.ComboAccounts.SelectedIndex = 0 Then + Result = New McLoginMs + Else + Dim Item As MyListItem = FrmLoginMs.ComboAccounts.SelectedItem + Result = New McLoginMs With {.OAuthRefreshToken = Item.Tag, .UserName = Item.Title} + End If + End Sub) Return Result End Function ''' diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml index a404b44..b586851 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml @@ -104,139 +104,312 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb b/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb index afc5db4..5b88927 100644 --- a/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb @@ -38,23 +38,23 @@ CardName = "常规版本" Case McVersionCardType.API Dim IsForgeExists As Boolean = False - Dim IsNeoExists As Boolean = False + Dim IsNeoForgeExists As Boolean = False Dim IsFabricExists As Boolean = False Dim IsLiteExists As Boolean = False For Each Version As McVersion In Card.Value If Version.Version.HasFabric Then IsFabricExists = True If Version.Version.HasLiteLoader Then IsLiteExists = True If Version.Version.HasForge Then IsForgeExists = True - If Version.Version.HasNeoForge Then IsNeoExists = True + If Version.Version.HasNeoForge Then IsNeoForgeExists = True Next - If If(IsLiteExists, 1, 0) + If(IsForgeExists, 1, 0) + If(IsFabricExists, 1, 0) + If(IsNeoExists, 1, 0) > 1 Then + If If(IsLiteExists, 1, 0) + If(IsForgeExists, 1, 0) + If(IsFabricExists, 1, 0) + If(IsNeoForgeExists, 1, 0) > 1 Then CardName = "可安装 Mod" ElseIf IsForgeExists Then CardName = "Forge 版本" + ElseIf IsNeoForgeExists Then + CardName = "NeoForge 版本" ElseIf IsLiteExists Then CardName = "LiteLoader 版本" - ElseIf IsNeoExists Then - CardName = "NeoForge 版本" Else CardName = "Fabric 版本" End If @@ -214,8 +214,8 @@ FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadInstall) End Sub + '修改此代码时,同时修改 PageVersionOverall 中的代码 Public Shared Sub DeleteVersion(Item As MyListItem, Version As McVersion) - '修改此代码时,同时修改 PageVersionOverall 中的代码 Try Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown Dim IsHintIndie As Boolean = Version.State <> McVersionState.Error AndAlso Version.PathIndie <> PathMcFolder diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb index 99b962a..fe721e6 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb @@ -206,10 +206,8 @@ SliderRamCustom.MaxValue = Math.Floor((RamTotal - 1.5) / 0.5) + 12 ElseIf RamTotal <= 16 Then SliderRamCustom.MaxValue = Math.Floor((RamTotal - 8) / 1) + 25 - ElseIf RamTotal <= 32 Then - SliderRamCustom.MaxValue = Math.Floor((RamTotal - 16) / 2) + 33 Else - SliderRamCustom.MaxValue = Math.Min(Math.Floor((RamTotal - 32) / 4) + 41, 49) + SliderRamCustom.MaxValue = Math.Min(Math.Floor((RamTotal - 16) / 2) + 33, 41) End If '设置文本 LabRamGame.Text = If(RamGame = Math.Floor(RamGame), RamGame & ".0", RamGame) & " GB" & @@ -259,7 +257,6 @@ End If If RamTextLeft <> Left Then RamTextLeft = Left - 'If AniControlEnabled = 0 Then Select Case Left Case 0 AniStart({ @@ -280,22 +277,6 @@ AaOpacity(LabRamUsedTitle, 0.7 - LabRamUsedTitle.Opacity, 100) }, "SetupLaunch Ram TextLeft") End Select - 'Else - ' Select Case Left - ' Case 0 - ' LabRamUsed.Opacity = 0 - ' LabRamTotal.Opacity = 0 - ' LabRamUsedTitle.Opacity = 0 - ' Case 1 - ' LabRamUsed.Opacity = 1 - ' LabRamTotal.Opacity = 0 - ' LabRamUsedTitle.Opacity = 0.7 - ' Case 2 - ' LabRamUsed.Opacity = 1 - ' LabRamTotal.Opacity = 1 - ' LabRamUsedTitle.Opacity = 0.7 - ' End Select - 'End If End If '右侧 Dim Right As Integer @@ -404,15 +385,14 @@ PreFin: RamGive = (Value - 12) * 0.5 + 1.5 ElseIf Value <= 33 Then RamGive = (Value - 25) * 1 + 8 - ElseIf Value <= 41 Then - RamGive = (Value - 33) * 2 + 16 Else - RamGive = (Value - 41) * 4 + 32 + RamGive = (Value - 33) * 2 + 16 End If End If '若使用 32 位 Java,则限制为 1G If If(Is32BitJava, Not JavaIs64Bit(If(UseVersionJavaSetup, Version, Nothing))) Then RamGive = Math.Min(1, RamGive) - Return RamGive + '封顶 32G + Return Math.Min(32, RamGive) End Function #End Region @@ -557,8 +537,8 @@ PreFin: Private Sub CheckArgumentRam_Change() Handles CheckArgumentRam.Change If AniControlEnabled <> 0 Then Exit Sub If Not CheckArgumentRam.Checked Then Return - If MyMsgBox("内存优化耗时较长,这会拖慢游戏的启动过程,建议仅在电脑内存不充裕时开启此选项。" & vbCrLf & - "如果你在使用机械硬盘,这还可能会导致一小段时间的严重卡顿。" & + If MyMsgBox("内存优化会显著延长启动耗时,建议仅在内存不足时开启。" & vbCrLf & + "如果你在使用机械硬盘,这还可能导致一小段时间的严重卡顿。" & If(IsAdmin(), "", $"{vbCrLf}{vbCrLf}每次启动游戏,PCL 都需要申请管理员权限以进行内存优化。{vbCrLf}若想自动授予权限,可以右键 PCL,打开 属性 → 兼容性 → 以管理员身份运行此程序。"), "提醒", "确定", "取消") = 2 Then CheckArgumentRam.Checked = False diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb index 181eb95..74d1cd2 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb @@ -41,8 +41,8 @@ '设置解锁 If Not RadioLauncherTheme8.IsEnabled Then LabLauncherTheme8Copy.ToolTip = "累积赞助达到 ¥23.33 后,在爱发电私信发送【解锁码】以解锁。" & vbCrLf & "右键打开赞助页面,如果觉得 PCL 做得还不错就支持一下吧 =w=!" RadioLauncherTheme8.ToolTip = "累积赞助达到 ¥23.33 后,在爱发电私信发送【解锁码】以解锁" - If Not RadioLauncherTheme9.IsEnabled Then LabLauncherTheme9Copy.ToolTip = "· 反馈一个 Bug,在 Issue 标记为 [已完成] 后回复 Issue 要求解锁(右键打开反馈页面)" & vbCrLf & "· 向帮助库提交 Pull Request,在龙猫合并后解锁" - RadioLauncherTheme9.ToolTip = "· 反馈一个 Bug,在反馈标记为 [完成] 后回复 Issue 要求解锁" & vbCrLf & "· 向帮助库提交 Pull Request,在龙猫合并后解锁" + If Not RadioLauncherTheme9.IsEnabled Then LabLauncherTheme9Copy.ToolTip = "· 反馈一个 Bug,在标记为 [完成] 后回复识别码要求解锁(右键打开反馈页面)" & vbCrLf & "· 提交一个 Pull Request,在合并后回复识别码要求解锁" + RadioLauncherTheme9.ToolTip = "· 反馈一个 Bug,在标记为 [完成] 后回复识别码要求解锁" & vbCrLf & "· 提交一个 Pull Request,在合并后回复识别码要求解锁" '极客蓝的处理在 ThemeCheck 中 End Sub @@ -83,7 +83,11 @@ MusicRefreshUI() '主页 - ComboCustomPreset.SelectedIndex = Setup.Get("UiCustomPreset") + Try + ComboCustomPreset.SelectedIndex = Setup.Get("UiCustomPreset") + Catch + Setup.Reset("UiCustomPreset") + End Try CType(FindName("RadioCustomType" & Setup.Load("UiCustomType")), MyRadioBox).Checked = True TextCustomNet.Text = Setup.Get("UiCustomNet") diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb index 9af7c14..c909f09 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb @@ -607,8 +607,10 @@ If ModEntry.Comp IsNot Nothing Then '跳转到 Mod 下载页面 FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail, - .Additional = {ModEntry.Comp, New List(Of String), PageVersionLeft.Version.Version.McName, - If(PageVersionLeft.Version.Version.HasForge, CompModLoaderType.Forge, If(PageVersionLeft.Version.Version.HasFabric, CompModLoaderType.Fabric, CompModLoaderType.Any))}}) + .Additional = {ModEntry.Comp, New List(Of String), PageVersionLeft.Version.Version.McName, + If(PageVersionLeft.Version.Version.HasForge, CompModLoaderType.Forge, + If(PageVersionLeft.Version.Version.HasNeoForge, CompModLoaderType.NeoForge, + If(PageVersionLeft.Version.Version.HasFabric, CompModLoaderType.Fabric, CompModLoaderType.Any)))}}) Else '获取信息 Dim ContentLines As New List(Of String) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml index 77a6099..1daef41 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml @@ -22,7 +22,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml.vb index e4fc8ec..4619d5b 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml.vb @@ -127,6 +127,8 @@ '重命名主文件夹 My.Computer.FileSystem.RenameDirectory(OldPath, TempName) My.Computer.FileSystem.RenameDirectory(TempPath, NewName) + '清理 ini 缓存 + IniClearCache(PageVersionLeft.Version.Path & "PCL\Setup.ini") '遍历重命名所有文件与文件夹 For Each Entry As DirectoryInfo In New DirectoryInfo(NewPath).EnumerateDirectories If Not Entry.Name.Contains(OldName) Then Continue For @@ -292,16 +294,17 @@ End SyncLock '启动 Dim Loader As New LoaderCombo(Of String)(PageVersionLeft.Version.Name & " 文件补全", DlClientFix(PageVersionLeft.Version, True, AssetsIndexExistsBehaviour.AlwaysDownload, False)) - Loader.OnStateChanged = Sub() - Select Case Loader.State - Case LoadState.Finished - Hint(Loader.Name & "成功!", HintType.Finish) - Case LoadState.Failed - Hint(Loader.Name & "失败:" & GetExceptionSummary(Loader.Error), HintType.Critical) - Case LoadState.Aborted - Hint(Loader.Name & "已取消!", HintType.Info) - End Select - End Sub + Loader.OnStateChanged = + Sub() + Select Case Loader.State + Case LoadState.Finished + Hint(Loader.Name & "成功!", HintType.Finish) + Case LoadState.Failed + Hint(Loader.Name & "失败:" & GetExceptionSummary(Loader.Error), HintType.Critical) + Case LoadState.Aborted + Hint(Loader.Name & "已取消!", HintType.Info) + End Select + End Sub Loader.Start(PageVersionLeft.Version.Name) LoaderTaskbarAdd(Loader) FrmMain.BtnExtraDownload.ShowRefresh() @@ -312,8 +315,8 @@ End Sub '删除版本 + '修改此代码时,同时修改 PageSelectRight 中的代码 Private Sub BtnManageDelete_Click(sender As Object, e As EventArgs) Handles BtnManageDelete.Click - '修改此代码时,同时修改 PageSelectRight 中的代码 Try Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown Dim IsHintIndie As Boolean = PageVersionLeft.Version.State <> McVersionState.Error AndAlso PageVersionLeft.Version.PathIndie <> PathMcFolder @@ -321,6 +324,7 @@ If(IsHintIndie, vbCrLf & "由于该版本开启了版本隔离,删除版本时该版本对应的存档、资源包、Mod 等文件也将被一并删除!", ""), "版本删除确认", , "取消",, IsHintIndie OrElse IsShiftPressed) Case 1 + IniClearCache(PageVersionLeft.Version.Path & "PCL\Setup.ini") If IsShiftPressed Then DeleteDirectory(PageVersionLeft.Version.Path) Hint("版本 " & PageVersionLeft.Version.Name & " 已永久删除!", HintType.Finish) diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml index 93592a7..6dfb1fa 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml @@ -77,6 +77,22 @@ + + + + + + + + + + + + + + + + @@ -106,22 +122,6 @@ - - - - - - - - - - - - - - - - @@ -226,4 +226,4 @@ - + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb index 8fbb4aa..8351759 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb @@ -165,10 +165,8 @@ SliderRamCustom.MaxValue = Math.Floor((RamTotal - 1.5) / 0.5) + 12 ElseIf RamTotal <= 16 Then SliderRamCustom.MaxValue = Math.Floor((RamTotal - 8) / 1) + 25 - ElseIf RamTotal <= 32 Then - SliderRamCustom.MaxValue = Math.Floor((RamTotal - 16) / 2) + 33 Else - SliderRamCustom.MaxValue = Math.Min(Math.Floor((RamTotal - 32) / 4) + 41, 49) + SliderRamCustom.MaxValue = Math.Min(Math.Floor((RamTotal - 16) / 2) + 33, 41) End If '设置文本 LabRamGame.Text = If(RamGame = Math.Floor(RamGame), RamGame & ".0", RamGame) & " GB" & @@ -356,12 +354,13 @@ PreFin: ElseIf Value <= 41 Then RamGive = (Value - 33) * 2 + 16 Else - RamGive = (Value - 41) * 4 + 32 + RamGive = (Value - 33) * 2 + 16 End If End If '若使用 32 位 Java,则限制为 1G If If(Is32BitJava, Not JavaIs64Bit(PageVersionLeft.Version)) Then RamGive = Math.Min(1, RamGive) - Return RamGive + '封顶 32G + Return Math.Min(32, RamGive) End Function #End Region diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 7331061..58259ad 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -185,6 +185,9 @@ MyIconTextButton.xaml + + + @@ -229,9 +232,6 @@ MyCompItem.xaml - - PageDownloadNeoForge.xaml - PageDownloadMod.xaml @@ -244,6 +244,9 @@ PageDownloadCompDetail.xaml + + PageDownloadNeoForge.xaml + PageDownloadPack.xaml @@ -469,6 +472,7 @@ FormMain.xaml Code + MSBuild:Compile Designer @@ -477,10 +481,6 @@ MSBuild:Compile Designer - - MSBuild:Compile - Designer - Designer MSBuild:Compile @@ -497,6 +497,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -922,6 +926,9 @@ + + + diff --git a/Plain Craft Launcher 2/Resources/Custom.xaml b/Plain Craft Launcher 2/Resources/Custom.xaml index 81664c6..94e27d4 100644 --- a/Plain Craft Launcher 2/Resources/Custom.xaml +++ b/Plain Craft Launcher 2/Resources/Custom.xaml @@ -79,11 +79,11 @@ + Text="启动 1.20.1 并进入 Hypixel" EventType="启动游戏" EventData="1.20.1|mc.hypixel.net" ToolTip="服务器 IP:mc.hypixel.net" /> + Text="启动当前选中版本并进入 Hypixel" EventType="启动游戏" EventData="\current|mc.hypixel.net" ToolTip="启动当前版本" /> @@ -184,30 +184,30 @@ - - + - + - + - + - + - + - + - + - + - + - - + + + From 514bd156796b92922bf6bf43e908ba6be74bbff5 Mon Sep 17 00:00:00 2001 From: 3gf8jv4dv <158490944+3gf8jv4dv@users.noreply.github.com> Date: Sat, 6 Jul 2024 03:00:41 +0000 Subject: [PATCH 77/87] Change a comma to half-width --- Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index 1cd098d..91f0bc6 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -241,7 +241,7 @@ Retry: {"Translator-Chinese", "Crowdin 中文翻译者披风"}, {"Translator", "Crowdin 翻译者披风"}, {"Cobalt", "Cobalt 披风"}, {"Vanilla", "原版披风"}, {"Minecon2011", "Minecon 2011 参与者披风"}, {"Minecon2012", "Minecon 2012 参与者披风"}, {"Minecon2013", "Minecon 2013 参与者披风"}, {"Minecon2015", "Minecon 2015 参与者披风"}, {"Minecon2016", "Minecon 2016 参与者披风"}, - {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower's", "追随者披风"} + {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, {"Follower's", "追随者披风"} } Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}} For Each Cape In SkinData("capes") From 8e3af89bd3721dc04480e5a2e85e3858be57559b Mon Sep 17 00:00:00 2001 From: youzi-2333 Date: Sat, 6 Jul 2024 22:34:12 +0800 Subject: [PATCH 78/87] =?UTF-8?q?:sparkles:=20=E5=AE=8C=E6=88=90=20#3066?= =?UTF-8?q?=20=E8=87=AA=E5=8A=A8=E5=AE=89=E8=A3=85=20modpack.zip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/PageLaunch/PageLaunchLeft.xaml.vb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb index c7da13c..777ed52 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb @@ -57,6 +57,7 @@ Log("[Launch] 自动选择 Minecraft 版本:" & Version.Path) End If End If + RunInUi( Sub() McVersionCurrent = Version '绕这一圈是为了避免 McVersionCheck 触发第二次版本改变 @@ -72,6 +73,21 @@ If LoginType = McLoginType.Legacy OrElse LoginType = McLoginType.Ms Then CType(FindName("RadioLoginType" & LoginType), MyRadioButton).Checked = True RefreshPage(False, False) + '整合包安装 + If McVersionList.Count = 0 AndAlso File.Exists(Path & "modpack.zip") Then + If MyMsgBox("即将自动安装整合包,是否继续?", Button2:="取消") = 1 Then + If Not Directory.Exists(Path & ".minecraft\") Then + Directory.CreateDirectory(Path & ".minecraft\") + Directory.CreateDirectory(Path & ".minecraft\versions\") + Setup.Set("LaunchFolderSelect", "$.minecraft\") + McFolderLauncherProfilesJsonCreate(Path & ".minecraft\") + End If + McFolderListLoader.Start(IsForceRestart:=True) + + RunInNewThread(Sub() ModpackInstall(Path & "modpack.zip", ShowHint:=False), "Modpack Auto Install") + End If + End If + AniControlEnabled -= 1 End Sub From 7ee533ca43eb907cf284deb037d50e0dd93b360d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=99=E8=85=BE=E7=8C=AB=E8=B7=83?= <1043137532@qq.com> Date: Sun, 7 Jul 2024 02:17:36 +0800 Subject: [PATCH 79/87] 2.8.1 --- Plain Craft Launcher 2/FormMain.xaml.vb | 5 + .../Modules/Base/ModBase.vb | 6 +- .../My Project/AssemblyInfo.vb | 4 +- .../Pages/PageDownload/ModDownloadLib.vb | 216 ++++++------------ .../PageDownload/PageDownloadForge.xaml.vb | 4 - .../Pages/PageOther/PageOtherAbout.xaml.vb | 2 +- .../Pages/PageSetup/PageSetupUI.xaml.vb | 73 +++--- .../PageVersion/PageVersionSetup.xaml.vb | 2 - 8 files changed, 115 insertions(+), 197 deletions(-) diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 71b426d..d1196f6 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -115,6 +115,11 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- + If LastVersion < 328 Then 'Snapshot 2.8.1 + If LastVersion = 327 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复无法安装 Forge 1.12.2- 的 Bug")) + If LastVersion = 327 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复无法输入解锁码的 Bug")) + If LastVersion = 327 Then BugCount += 1 + End If If LastVersion < 327 Then 'Snapshot 2.8.0 FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "NeoForge 兼容与自动安装")) FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "支持编译、运行 PCL 开源代码")) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 89f1887..22df84a 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -11,12 +11,12 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.8.0" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.8.0." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.8.1" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.8.1." & VersionBranchCode '标准格式的四段式版本号 #If BETA Then Public Const VersionCode As Integer = 326 'Release #Else - Public Const VersionCode As Integer = 327 'Snapshot + Public Const VersionCode As Integer = 328 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index c5d5a6d..3c21a88 100644 --- a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb +++ b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb @@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 ' 方法是按如下所示使用“*” - - + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index b7e5093..66c686c 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1007,73 +1007,6 @@ Retry: #Region "Forgelike 下载" - Public Sub McDownloadForgelike(Info As DlForgelikeEntry) - '老版本提示 - If Not Info.IsNeoForge Then - Dim ForgeInfo As DlForgeVersionEntry = Info - If ForgeInfo.Category = "client" Then - If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & - "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", - "版本过老", "继续", "取消") = 1 Then - McDownloadForgelikeSave(Info) - End If - Exit Sub - End If - If ForgeInfo.Category = "universal" OrElse ForgeInfo.Inherit.StartsWithF("1.5") Then - If MyMsgBox("该 Forge 版本过于古老,PCL 暂不支持该版本的自动安装。" & vbCrLf & - "若你仍然希望继续,PCL 将把安装程序下载到你指定的位置,但不会进行安装。", - "版本过老", "继续", "取消") = 1 Then - McDownloadForgelikeSave(Info) - End If - Exit Sub - End If - End If - '初始化参数 - Dim McVersionName As String = $"{Info.Inherit}-{Info.LoaderName.ToLower}-{Info.VersionName}" - Dim TempFolder As String = $"{PathTemp}Cache\Code\{Info.LoaderName}Install-{Info.Version}_{GetUuid()}.{Info.FileExtension}" - Dim McVersionFolder As String = $"{PathMcFolder}versions\{McVersionName}\" - Dim DisplayName As String = $"{Info.LoaderName} {Info.Inherit} - {Info.VersionName}" - Try - - '重复任务检查 - SyncLock LoaderTaskbarLock - For i = 0 To LoaderTaskbar.Count - 1 - If LoaderTaskbar(i).Name = Info.LoaderName & " 下载" Then - Hint("该版本正在下载中!", HintType.Critical) - Exit Sub - End If - Next - End SyncLock - - '已有版本检查 - If File.Exists(McVersionFolder & McVersionName & ".json") Then - If MyMsgBox("版本 " & McVersionName & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 json 和 jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then - File.Delete(McVersionFolder & McVersionName & ".jar") - File.Delete(McVersionFolder & McVersionName & ".json") - Else - Exit Sub - End If - End If - - '启动 - Dim Loader As New LoaderCombo(Of String)(Info.LoaderName & " 下载", - McDownloadForgelikeLoader(Info.IsNeoForge, If(Info.IsNeoForge, CType(Info, DlNeoForgeListEntry).ApiName, Info.VersionName), Info.Inherit, Info)) With - {.OnStateChanged = AddressOf McInstallState} - Loader.Start(McVersionFolder) - LoaderTaskbarAdd(Loader) - FrmMain.BtnExtraDownload.ShowRefresh() - FrmMain.BtnExtraDownload.Ribble() - - Catch ex As Exception - Log(ex, $"开始 {Info.LoaderName} 下载失败", LogLevel.Feedback) - Finally - '删除安装包 - Try - If File.Exists(TempFolder) Then File.Delete(TempFolder) - Catch - End Try - End Try - End Sub Public Sub McDownloadForgelikeSave(Info As DlForgelikeEntry) Try Dim Target As String = SelectAs("选择保存位置", $"{Info.LoaderName}-{Info.Inherit}-{Info.VersionName}.{Info.FileExtension}", @@ -1242,79 +1175,74 @@ Retry: End SyncLock End Sub Private Sub ForgelikeInjectorLine(Content As String, Task As LoaderTask(Of Boolean, Boolean)) - If Content.StartsWithF(" Data") OrElse Content.StartsWithF(" Slim") Then - If ModeDebug Then Log("[Installer] " & Content) - ElseIf Content.StartsWithF(" Reading patch ") Then - If ModeDebug Then Log("[Installer] " & Content) - Task.Progress = 0.86 - Else - Select Case Content - Case "Extracting json" - Log("[Installer] " & Content) - Task.Progress = 0.07 - Case "Downloading libraries" - Log("[Installer] " & Content) - Task.Progress = 0.08 - Case " File exists: Checksum validated." - If ModeDebug Then Log("[Installer] " & Content) - Task.Progress += 0.003 - Case "Building Processors" - Task.Progress = 0.38 - Case "Task: DOWNLOAD_MOJMAPS" 'B - Task.Progress = 0.4 - Case "Task: MERGE_MAPPING" 'B - Task.Progress = 0.6 - Case "Splitting: " - Task.Progress = 0.62 - Case "Parameter Annotations" 'B - Task.Progress = 0.66 - Case "Processing Complete" 'B - Task.Progress = 0.7 - Case "Remapping final jar" 'A - Task.Progress = 0.72 - Case "Remapping jar... 50%" 'A - Task.Progress = 0.76 - Case "Remapping jar... 100%" 'A - Task.Progress = 0.81 - Case "Injecting profile" - Task.Progress = 0.91 - Case Else - If ModeDebug Then Log("[Installer] " & Content) - Exit Sub - End Select - Log("[Installer] " & Content) - End If + Select Case Content + Case "Extracting json" + Log("[Installer] " & Content) + Task.Progress = 0.07 + Case "Downloading libraries" + Log("[Installer] " & Content) + Task.Progress = 0.08 + Case " File exists: Checksum validated." + If ModeDebug Then Log("[Installer] " & Content) + Task.Progress += 0.003 + Case "Building Processors" + Task.Progress = 0.18 + Case "Task: DOWNLOAD_MOJMAPS" 'B + Task.Progress = 0.2 + Case "Task: MERGE_MAPPING" 'B + Task.Progress = 0.3 + Case "Splitting: " + Task.Progress = 0.35 + Case "Parameter Annotations" 'B + Task.Progress = 0.4 + Case "Processing Complete" 'B + Task.Progress = 0.5 + Case "log: null" 'new + Task.Progress = 0.5 + Case "Sorting" 'new + Task.Progress = 0.65 + Case "Remapping final jar" 'A + Task.Progress = 0.72 + Case "Remapping jar... 50%" 'A + Task.Progress = 0.76 + Case "Remapping jar... 100%" 'A + Task.Progress = 0.81 + Case "Injecting profile" + Task.Progress = 0.91 + Case Else + If ModeDebug Then Log("[Installer] " & Content) + Exit Sub + End Select + Log("[Installer] " & Content) End Sub ''' ''' 获取下载某个 Forgelike 版本的加载器列表。 ''' - Private Function McDownloadForgelikeLoader(IsNeoForge As Boolean, Version As String, Inherit As String, Optional Info As DlForgelikeEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase) + Private Function McDownloadForgelikeLoader(IsNeoForge As Boolean, LoaderVersion As String, TargetVersion As String, Inherit As String, Optional Info As DlForgelikeEntry = Nothing, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional ClientFolder As String = Nothing) As List(Of LoaderBase) '参数初始化 McFolder = If(McFolder, PathMcFolder) If IsNeoForge AndAlso Info Is Nothing Then '需要传入 API Name,但整合包版本可能不以 1.20.1- 开头,所以需要进行特别处理 - If Inherit = "1.20.1" AndAlso Not Version.StartsWithF("1.20.1-") Then - Info = New DlNeoForgeListEntry("1.20.1-" & Version) + If Inherit = "1.20.1" AndAlso Not LoaderVersion.StartsWithF("1.20.1-") Then + Info = New DlNeoForgeListEntry("1.20.1-" & LoaderVersion) Else - Info = New DlNeoForgeListEntry(Version) + Info = New DlNeoForgeListEntry(LoaderVersion) End If End If - If Not IsNeoForge AndAlso Version.StartsWithF("1.") AndAlso Version.Contains("-") Then + If Not IsNeoForge AndAlso LoaderVersion.StartsWithF("1.") AndAlso LoaderVersion.Contains("-") Then '类似 1.19.3-41.2.8 格式,优先使用 Version 中要求的版本而非 Inherit(例如 1.19.3 却使用了 1.19 的 Forge) - Inherit = Version.Before("-") - Version = Version.After("-") + Inherit = LoaderVersion.Before("-") + LoaderVersion = LoaderVersion.After("-") End If Dim LoaderName As String = If(IsNeoForge, "NeoForge", "Forge") Dim IsCustomFolder As Boolean = McFolder <> PathMcFolder - Dim InstallerAddress As String = $"{PathTemp}Cache\Code\{LoaderName}Install-{Version}_{RandomInteger(0, 100000)}" - Dim VersionName As String = If(IsNeoForge, "neoforge-" & Version.Replace("1.20.1-", ""), "forge-" & Version) - Dim VersionFolder As String = $"{McFolder}versions\{VersionName}\" - Log($"[Download] Forgelike 安装目标版本文件夹:{VersionFolder}") - Dim DisplayName As String = $"{LoaderName} {Inherit} - {Version}" + Dim InstallerAddress As String = $"{PathTemp}Cache\Code\{LoaderName}Install-{LoaderVersion}_{RandomInteger(0, 100000)}" + Dim VersionFolder As String = $"{McFolder}versions\{TargetVersion}\" + Dim DisplayName As String = $"{LoaderName} {Inherit} - {LoaderVersion}" Dim Loaders As New List(Of LoaderBase) - Dim LibVersionFolder As String = $"{PathMcFolder}versions\{VersionName}\" '作为 Lib 文件目标的版本文件夹 + Dim LibVersionFolder As String = $"{PathMcFolder}versions\{TargetVersion}\" '作为 Lib 文件目标的版本文件夹 '获取 Forge 下载信息 If Info Is Nothing Then @@ -1326,12 +1254,12 @@ Retry: Task.Progress = 0.8 '查找对应版本 For Each ForgeVersion In ForgeLoader.Output - If VersionSortInteger(ForgeVersion.Version.ToString, Version) = 0 Then + If VersionSortInteger(ForgeVersion.Version.ToString, LoaderVersion) = 0 Then Info = ForgeVersion Exit Sub End If Next - Throw New Exception($"未能找到 {LoaderName} " & Inherit & "-" & Version & " 的详细信息!") + Throw New Exception($"未能找到 {LoaderName} " & Inherit & "-" & LoaderVersion & " 的详细信息!") End Sub) With {.ProgressWeight = 3}) End If '下载 Forgelike 主文件 @@ -1364,8 +1292,8 @@ Retry: Loaders.Add(New LoaderDownload($"下载 {LoaderName} 主文件", New List(Of NetFile)) With {.ProgressWeight = 9}) '安装(仅在新版安装时需要原版 Jar) - If IsNeoForge OrElse Version.Before(".") >= 20 Then - Log($"[Download] 检测为{If(IsNeoForge, " Neo", "新版 ")}Forge:" & Version) + If IsNeoForge OrElse LoaderVersion.Before(".") >= 20 Then + Log($"[Download] 检测为{If(IsNeoForge, " Neo", "新版 ")}Forge:" & LoaderVersion) Dim Libs As List(Of McLibToken) = Nothing Loaders.Add(New LoaderTask(Of String, List(Of NetFile))($"分析 {LoaderName} 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) @@ -1395,8 +1323,8 @@ Retry: Task.Progress = 0.8 '去除其中的原始 Forgelike 项 For i = 0 To Libs.Count - 1 - If Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{Version}.jar") OrElse - Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{Version}-client.jar") Then + If Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{LoaderVersion}.jar") OrElse + Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{LoaderVersion}-client.jar") Then Log($"[Download] 已从待下载 {LoaderName} 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug) Libs.RemoveAt(i) Exit For @@ -1498,7 +1426,14 @@ Retry: '如果没有新增文件夹,那么预测的文件夹名就是正确的 '如果只新增 1 个文件夹,那么拷贝 json 文件 Dim JsonFile As FileInfo = DeltaList(0).EnumerateFiles.First() - WriteFile(VersionFolder & VersionName & ".json", ReadFile(JsonFile.FullName)) + WriteFile(VersionFolder & TargetVersion & ".json", ReadFile(JsonFile.FullName)) + Log($"[Download] 已拷贝新增的版本 JSON 文件:{JsonFile.FullName} -> {VersionFolder}{TargetVersion}.json") + ElseIf DeltaList.Count > 1 Then + '新增了多个文件夹 + Log($"[Download] 有多个疑似的新增版本,无法确定:{DeltaList.Select(Function(d) d.Name).Join(";")}") + Else + '没有新增文件夹 + Log("[Download] 未找到新增的版本文件夹") End If '新建 mods 文件夹 Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\") @@ -1515,8 +1450,8 @@ Retry: End Try End Sub) With {.ProgressWeight = 10}) Else - Log("[Download] 检测为非新版 Forge:" & Version) - Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)($"安装 {LoaderName}(方式 B)", + Log("[Download] 检测为非新版 Forge:" & LoaderVersion) + Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)($"安装 {LoaderName}(方式 B)", Sub(Task As LoaderTask(Of List(Of NetFile), Boolean)) Dim Installer As ZipArchive = Nothing Try @@ -1533,8 +1468,8 @@ Retry: Log("[Download] 开始进行 Forge 安装,Legacy 方式 1:" & InstallerAddress) '建立 Json 文件 Dim JsonVersion As JObject = GetJson(ReadFile(Installer.GetEntry(Json("json").ToString.TrimStart("/")).Open)) - JsonVersion("id") = VersionName - WriteFile(VersionFolder & VersionName & ".json", JsonVersion.ToString) + JsonVersion("id") = TargetVersion + WriteFile(VersionFolder & TargetVersion & ".json", JsonVersion.ToString) Task.Progress = 0.6 '解压支持库文件 Installer.Dispose() @@ -1550,9 +1485,9 @@ Retry: WriteFile(JarAddress, Installer.GetEntry(Json("install")("filePath")).Open) Task.Progress = 0.9 '建立 Json 文件 - Json("versionInfo")("id") = VersionName + Json("versionInfo")("id") = TargetVersion If Json("versionInfo")("inheritsFrom") Is Nothing Then CType(Json("versionInfo"), JObject).Add("inheritsFrom", Inherit) - WriteFile(VersionFolder & VersionName & ".json", Json("versionInfo").ToString) + WriteFile(VersionFolder & TargetVersion & ".json", Json("versionInfo").ToString) End If '新建 mods 文件夹 Directory.CreateDirectory(New McVersion(VersionFolder).GetPathIndie(True) & "mods\") @@ -1569,11 +1504,6 @@ Retry: 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))($"分析 {LoaderName} 支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(New McVersion(VersionFolder))) With {.ProgressWeight = 1, .Show = False}) - Loaders.Add(New LoaderDownload($"下载 {LoaderName} 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 11}) - End If End If Return Loaders @@ -2138,7 +2068,7 @@ Retry: If Request.OptiFineEntry IsNot Nothing Then OptiFineFolder = TempMcFolder & "versions\" & Request.OptiFineEntry.NameVersion Dim ForgeFolder As String = Nothing If Request.ForgeEntry IsNot Nothing Then Request.ForgeVersion = If(Request.ForgeVersion, Request.ForgeEntry.VersionName) - If Request.ForgeVersion IsNot Nothing Then ForgeFolder = TempMcFolder & "versions\" & Request.MinecraftName & "-forge-" & Request.ForgeVersion + If Request.ForgeVersion IsNot Nothing Then ForgeFolder = TempMcFolder & "versions\forge-" & Request.ForgeVersion Dim NeoForgeFolder As String = Nothing If Request.NeoForgeEntry IsNot Nothing Then Request.NeoForgeVersion = If(Request.NeoForgeVersion, Request.NeoForgeEntry.VersionName) If Request.NeoForgeVersion IsNot Nothing Then NeoForgeFolder = TempMcFolder & "versions\neoforge-" & Request.NeoForgeVersion @@ -2193,11 +2123,11 @@ Retry: End If 'Forge If Request.ForgeVersion IsNot Nothing Then - LoaderList.Add(New LoaderCombo(Of String)("下载 Forge " & Request.ForgeVersion, McDownloadForgelikeLoader(False, 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}) + LoaderList.Add(New LoaderCombo(Of String)("下载 Forge " & Request.ForgeVersion, McDownloadForgelikeLoader(False, Request.ForgeVersion, "forge-" & Request.ForgeVersion, Request.MinecraftName, Request.ForgeEntry, TempMcFolder, ClientLoader, Request.TargetVersionFolder)) 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, McDownloadForgelikeLoader(True, 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}) + LoaderList.Add(New LoaderCombo(Of String)("下载 NeoForge " & Request.NeoForgeVersion, McDownloadForgelikeLoader(True, Request.NeoForgeVersion, "neoforge-" & Request.NeoForgeVersion, Request.MinecraftName, Request.NeoForgeEntry, TempMcFolder, ClientLoader, Request.TargetVersionFolder)) 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 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadForge.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadForge.xaml.vb index 2b4c8e3..354fe86 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadForge.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadForge.xaml.vb @@ -55,10 +55,6 @@ Card.StackInstall() End Sub - Public Sub DownloadStart(sender As MyListItem, e As Object) - McDownloadForgelike(sender.Tag) - End Sub - '介绍栏 Private Sub BtnWeb_Click(sender As Object, e As EventArgs) Handles BtnWeb.Click OpenWebsite("https://files.minecraftforge.net") diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb index 40afd2e..b8a84e6 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb @@ -27,7 +27,7 @@ Public Shared Sub CopyUniqueAddress() Handles BtnDonateCopy.Click ClipboardSet(UniqueAddress) End Sub - Private Sub DonateCodeInput() Handles BtnDonateInput.Click + Private Sub BtnDonateCodeInput_Click() Handles BtnDonateInput.Click DonateCodeInput() End Sub diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb index 74d1cd2..a283e57 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb @@ -364,27 +364,28 @@ Refresh: End Sub Private Sub BtnMusicClear_Click(sender As Object, e As EventArgs) Handles BtnMusicClear.Click If MyMsgBox("即将删除背景音乐文件夹中的所有文件。" & vbCrLf & "此操作不可撤销,是否确定?", "警告",, "取消", IsWarn:=True) = 1 Then - RunInThread(Sub() - Hint("正在删除背景音乐……") - '停止播放音乐 - MusicNAudio = Nothing - MusicWaitingList = New List(Of String) - MusicAllList = New List(Of String) - Thread.Sleep(200) - '删除文件 - Try - DeleteDirectory(Path & "PCL\Musics") - Hint("背景音乐已删除!", HintType.Finish) - Catch ex As Exception - Log(ex, "删除背景音乐失败", LogLevel.Msgbox) - End Try - Try - Directory.CreateDirectory(Path & "PCL\Musics") - RunInUi(Sub() MusicRefreshPlay(False)) - Catch ex As Exception - Log(ex, "重建背景音乐文件夹失败", LogLevel.Msgbox) - End Try - End Sub) + RunInThread( + Sub() + Hint("正在删除背景音乐……") + '停止播放音乐 + MusicNAudio = Nothing + MusicWaitingList = New List(Of String) + MusicAllList = New List(Of String) + Thread.Sleep(200) + '删除文件 + Try + DeleteDirectory(Path & "PCL\Musics") + Hint("背景音乐已删除!", HintType.Finish) + Catch ex As Exception + Log(ex, "删除背景音乐失败", LogLevel.Msgbox) + End Try + Try + Directory.CreateDirectory(Path & "PCL\Musics") + RunInUi(Sub() MusicRefreshPlay(False)) + Catch ex As Exception + Log(ex, "重建背景音乐文件夹失败", LogLevel.Msgbox) + End Try + End Sub) End If End Sub Private Sub CheckMusicStart_Change() Handles CheckMusicStart.Change @@ -427,9 +428,9 @@ Refresh: RadioLauncherTheme5Gray.Opacity -= 0.23 RadioLauncherTheme5.Opacity += 0.23 AniStart({ - AaOpacity(RadioLauncherTheme5Gray, 1, 1000), - AaOpacity(RadioLauncherTheme5, -1, 1000) - }, "ThemeUnlock") + AaOpacity(RadioLauncherTheme5Gray, 1, 1000), + AaOpacity(RadioLauncherTheme5, -1, 1000) + }, "ThemeUnlock") If RadioLauncherTheme5Gray.Opacity < 0.08 Then ThemeUnlock(5, UnlockHint:="隐藏主题 玄素黑 已解锁!") AniStop("ThemeUnlock") @@ -668,18 +669,10 @@ Refresh: '滑动条 Private Sub SliderLoad() - SliderMusicVolume.GetHintText = Function(Value As Integer) - Return Math.Ceiling(Value * 0.1) & "%" - End Function - SliderLauncherOpacity.GetHintText = Function(Value As Integer) - Return Math.Round(40 + Value * 0.1) & "%" - End Function - SliderLauncherHue.GetHintText = Function(Value As Integer) - Return Value & "°" - End Function - SliderLauncherSat.GetHintText = Function(Value As Integer) - Return Value & "%" - End Function + SliderMusicVolume.GetHintText = Function(v) Math.Ceiling(v * 0.1) & "%" + SliderLauncherOpacity.GetHintText = Function(v) Math.Round(40 + v * 0.1) & "%" + SliderLauncherHue.GetHintText = Function(v) v & "°" + SliderLauncherSat.GetHintText = Function(v) v & "%" SliderLauncherDelta.GetHintText = Function(Value As Integer) If Value > 90 Then Return "+" & (Value - 90) @@ -698,12 +691,8 @@ Refresh: Return Value - 20 End If End Function - SliderBackgroundOpacity.GetHintText = Function(Value As Integer) - Return Math.Round(Value * 0.1) & "%" - End Function - SliderBackgroundBlur.GetHintText = Function(Value As Integer) - Return Value & " 像素" - End Function + SliderBackgroundOpacity.GetHintText = Function(v) Math.Round(v * 0.1) & "%" + SliderBackgroundBlur.GetHintText = Function(v) v & " 像素" End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb index 8351759..ae11fc8 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb @@ -351,8 +351,6 @@ PreFin: RamGive = (Value - 12) * 0.5 + 1.5 ElseIf Value <= 33 Then RamGive = (Value - 25) * 1 + 8 - ElseIf Value <= 41 Then - RamGive = (Value - 33) * 2 + 16 Else RamGive = (Value - 33) * 2 + 16 End If From 7a7370582cccec032983affe722278599636ae9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=B3=E7=B3=96=E9=85=B8=E8=8F=8C?= Date: Mon, 8 Jul 2024 04:07:18 +0800 Subject: [PATCH 80/87] Update ModModpack.vb --- Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 293af35..43e8e70 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -195,7 +195,7 @@ Retry: End If Try Log("[ModPack] 整合包 Forge 版本:" & Id) - ForgeVersion = Id.Split("-")(1) + ForgeVersion = Id.Remove(0, 6) Exit For Catch ex As Exception Log(ex, "读取整合包 Forge 版本失败:" & Id) @@ -204,7 +204,7 @@ Retry: 'NeoForge 指定 Try Log("[ModPack] 整合包 NeoForge 版本:" & Id) - NeoForgeVersion = Id.Split("-")(1) + NeoForgeVersion = Id.Remove(0, 9) Exit For Catch ex As Exception Log(ex, "读取整合包 NeoForge 版本失败:" & Id) @@ -213,7 +213,7 @@ Retry: 'Fabric 指定 Try Log("[ModPack] 整合包 Fabric 版本:" & Id) - FabricVersion = Id.Split("-")(1) + FabricVersion = Id.Remove(0, 7) Exit For Catch ex As Exception Log(ex, "读取整合包 Fabric 版本失败:" & Id) From 9ab43a72f2081f0720ca4c4d05030895cbcef496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=B3=E7=B3=96=E9=85=B8=E8=8F=8C?= Date: Tue, 9 Jul 2024 00:25:22 +0800 Subject: [PATCH 81/87] Update PageDownloadInstall.xaml.vb Fix #4202 --- .../Pages/PageDownload/PageDownloadInstall.xaml.vb | 1 + 1 file changed, 1 insertion(+) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 1304527..cf63dcb 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -724,6 +724,7 @@ Private Function IsOptiFineSuitForForge(OptiFine As DlOptiFineListEntry, Forge As DlForgeVersionEntry) If Forge.Inherit <> OptiFine.Inherit Then Return False '不是同一个大版本 If OptiFine.RequiredForgeVersion Is Nothing Then Return False '不兼容 Forge + If OptiFine.RequiredForgeVersion = "" Then Return True If OptiFine.RequiredForgeVersion.Contains(".") Then 'XX.X.XXX Return VersionSortInteger(Forge.Version.ToString, OptiFine.RequiredForgeVersion) >= 0 Else 'XXXX From f68978f7d8e15d9b7594793eeedf35ecb413d153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=B3=E7=B3=96=E9=85=B8=E8=8F=8C?= Date: Wed, 10 Jul 2024 18:41:45 +0800 Subject: [PATCH 82/87] Update PageDownloadInstall.xaml.vb removed extra space --- .../Pages/PageDownload/PageDownloadInstall.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index cf63dcb..9d05282 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -724,7 +724,7 @@ Private Function IsOptiFineSuitForForge(OptiFine As DlOptiFineListEntry, Forge As DlForgeVersionEntry) If Forge.Inherit <> OptiFine.Inherit Then Return False '不是同一个大版本 If OptiFine.RequiredForgeVersion Is Nothing Then Return False '不兼容 Forge - If OptiFine.RequiredForgeVersion = "" Then Return True + If OptiFine.RequiredForgeVersion = "" Then Return True If OptiFine.RequiredForgeVersion.Contains(".") Then 'XX.X.XXX Return VersionSortInteger(Forge.Version.ToString, OptiFine.RequiredForgeVersion) >= 0 Else 'XXXX From 8ea99d21bebc3e450a61180a27e676082e92e3f9 Mon Sep 17 00:00:00 2001 From: killcerr Date: Wed, 10 Jul 2024 19:41:26 +0800 Subject: [PATCH 83/87] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=BB=9D=E5=AF=B9=E8=B7=AF=E5=BE=84=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 58259ad..c829231 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -38,7 +38,7 @@ false false true - D:\Minecraft\程序\ + .\Output\ Plain Craft Launcher 2.xml 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314 false @@ -55,7 +55,7 @@ false false true - D:\Minecraft\程序\ + .\Output\ Plain Craft Launcher 2.xml 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314 false @@ -100,7 +100,7 @@ false - D:\Minecraft\程序\ + .\Output\ Plain Craft Launcher 2.xml true 1 @@ -111,7 +111,7 @@ false - D:\Minecraft\程序\ + .\Output\ Plain Craft Launcher 2.xml true 1 @@ -129,7 +129,7 @@ - D:\Minecraft\程序\ + .\Output\ RELEASE,BY_UPDATE Plain Craft Launcher 2.xml true From d108b62eeda9cb1c22035fac916de947f667ce66 Mon Sep 17 00:00:00 2001 From: killcerr <93478098+killcerr@users.noreply.github.com> Date: Wed, 10 Jul 2024 19:44:33 +0800 Subject: [PATCH 84/87] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=BB=9D=E5=AF=B9=E8=B7=AF=E5=BE=84=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Output/empty.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 Plain Craft Launcher 2/Output/empty.txt diff --git a/Plain Craft Launcher 2/Output/empty.txt b/Plain Craft Launcher 2/Output/empty.txt new file mode 100644 index 0000000..2540025 --- /dev/null +++ b/Plain Craft Launcher 2/Output/empty.txt @@ -0,0 +1 @@ +为了让git创建此文件夹,所以保留此文件 From ea2b7298e92928a2598a12444cf5bbc461a67ec1 Mon Sep 17 00:00:00 2001 From: killcerr <93478098+killcerr@users.noreply.github.com> Date: Wed, 10 Jul 2024 19:57:02 +0800 Subject: [PATCH 85/87] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=BB=9D=E5=AF=B9=E8=B7=AF=E5=BE=84=E5=AF=BC=E8=87=B4=E7=9A=84?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Output/empty.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Plain Craft Launcher 2/Output/empty.txt diff --git a/Plain Craft Launcher 2/Output/empty.txt b/Plain Craft Launcher 2/Output/empty.txt deleted file mode 100644 index 2540025..0000000 --- a/Plain Craft Launcher 2/Output/empty.txt +++ /dev/null @@ -1 +0,0 @@ -为了让git创建此文件夹,所以保留此文件 From b8c512c04c49ccb0ae60b3472682212814e3b3fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B9=B3=E7=B3=96=E9=85=B8=E8=8F=8C?= Date: Thu, 11 Jul 2024 10:36:32 +0800 Subject: [PATCH 86/87] Update ModModpack.vb MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将原先使用的.Remove方法替换为.Replace方法。 --- Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 43e8e70..12284ab 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -195,7 +195,7 @@ Retry: End If Try Log("[ModPack] 整合包 Forge 版本:" & Id) - ForgeVersion = Id.Remove(0, 6) + ForgeVersion = Id.Replace("forge-", "") Exit For Catch ex As Exception Log(ex, "读取整合包 Forge 版本失败:" & Id) @@ -204,7 +204,7 @@ Retry: 'NeoForge 指定 Try Log("[ModPack] 整合包 NeoForge 版本:" & Id) - NeoForgeVersion = Id.Remove(0, 9) + NeoForgeVersion = Id.Replace("neoforge-", "") Exit For Catch ex As Exception Log(ex, "读取整合包 NeoForge 版本失败:" & Id) @@ -213,7 +213,7 @@ Retry: 'Fabric 指定 Try Log("[ModPack] 整合包 Fabric 版本:" & Id) - FabricVersion = Id.Remove(0, 7) + FabricVersion = Id.Replace("fabric-", "") Exit For Catch ex As Exception Log(ex, "读取整合包 Fabric 版本失败:" & Id) From 5436c5ec8aeb3de1192cd5a53a53ff8d6f85da16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=99=E8=85=BE=E7=8C=AB=E8=B7=83?= <1043137532@qq.com> Date: Thu, 11 Jul 2024 20:13:26 +0800 Subject: [PATCH 87/87] 2.8.2 --- Plain Craft Launcher 2/FormMain.xaml.vb | 14 +++++ .../Modules/Base/ModBase.vb | 37 +++++++++---- .../Modules/Minecraft/ModComp.vb | 18 +++---- .../Modules/Minecraft/ModDownload.vb | 18 +++++-- .../Modules/Minecraft/ModLaunch.vb | 4 +- .../Modules/Minecraft/ModModpack.vb | 2 +- Plain Craft Launcher 2/Modules/ModEvent.vb | 42 ++++++++------- .../My Project/AssemblyInfo.vb | 4 +- .../Pages/PageDownload/ModDownloadLib.vb | 46 ++-------------- .../PageDownload/PageDownloadInstall.xaml.vb | 2 +- .../Pages/PageLaunch/PageLaunchLeft.xaml.vb | 51 +++++++++--------- .../Pages/PageSetup/PageSetupUI.xaml.vb | 2 +- .../Plain Craft Launcher 2.vbproj | 10 ++-- Plain Craft Launcher 2/Resources/Custom.xaml | 4 +- Plain Craft Launcher 2/Resources/Help.zip | Bin 76876 -> 76889 bytes 15 files changed, 130 insertions(+), 124 deletions(-) diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index d1196f6..ae44e45 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -10,6 +10,12 @@ Public Class FormMain Dim FeatureList As New List(Of KeyValuePair(Of Integer, String)) '统计更新日志条目 #If BETA Then + If LastVersion < 330 Then 'Release 2.8.2 + FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "NeoForge 兼容与自动安装")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "支持编译、运行 PCL 开源代码")) + FeatureCount += 15 + BugCount += 22 + End If If LastVersion < 326 Then 'Release 2.7.4 FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "会自动隐藏明显不可用的自动安装选项")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化正版登录流程和 MC 性能")) @@ -115,6 +121,14 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- + If LastVersion < 329 Then 'Snapshot 2.8.2 + If LastVersion >= 327 Then + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复无法安装 Beta 版 NeoForge 的整合包的 Bug")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复自动安装无法选择部分 OptiFine 的 Bug")) + End If + FeatureCount += 4 + BugCount += 8 + End If If LastVersion < 328 Then 'Snapshot 2.8.1 If LastVersion = 327 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复无法安装 Forge 1.12.2- 的 Bug")) If LastVersion = 327 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复无法输入解锁码的 Bug")) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 22df84a..30cb7bd 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -11,12 +11,12 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.8.1" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.8.1." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.8.2" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.8.2." & VersionBranchCode '标准格式的四段式版本号 #If BETA Then - Public Const VersionCode As Integer = 326 'Release + Public Const VersionCode As Integer = 330 'Release #Else - Public Const VersionCode As Integer = 328 'Snapshot + Public Const VersionCode As Integer = 329 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName @@ -86,7 +86,7 @@ Public Module ModBase ''' ''' 系统盘盘符,以 \ 结尾。例如 “C:\”。 ''' - Public OsDrive As String = Environment.GetLogicalDrives().First.ToUpper.First & ":\" + Public OsDrive As String = Environment.GetLogicalDrives().Where(Function(p) Directory.Exists(p)).First.ToUpper.First & ":\" '#3799 ''' ''' 程序的缓存文件夹路径,以 \ 结尾。 ''' @@ -1257,12 +1257,19 @@ Re: Dim DeletedCount As Integer = 0 Dim Temp As String() Temp = Directory.GetFiles(Path) - For Each str As String In Temp + For Each FilePath As String In Temp + Dim RetriedFile As Boolean = False +RetryFile: Try - File.Delete(str) + File.Delete(FilePath) DeletedCount += 1 Catch ex As Exception - If IgnoreIssue Then + If Not RetriedFile Then + RetriedFile = True + Log(ex, $"删除文件失败,将在 0.3s 后重试({FilePath})") + Thread.Sleep(300) + GoTo RetryFile + ElseIf IgnoreIssue Then Log(ex, "删除单个文件可忽略地失败") Else Throw @@ -1273,10 +1280,17 @@ Re: For Each str As String In Temp DeleteDirectory(str, IgnoreIssue) Next + Dim RetriedDir As Boolean = False +RetryDir: Try Directory.Delete(Path, True) Catch ex As Exception - If IgnoreIssue Then + If Not RetriedDir Then + RetriedDir = True + Log(ex, $"删除文件夹失败,将在 0.3s 后重试({Path})") + Thread.Sleep(300) + GoTo RetryDir + ElseIf IgnoreIssue Then Log(ex, "删除单个文件夹可忽略地失败") Else Throw @@ -1652,7 +1666,10 @@ Re: ''' 为字符串进行 XML 转义。 ''' Public Function EscapeXML(Str As String) As String - Return Str.Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("'", "'").Replace("""", """).Replace(vbCrLf, " ") + If Str.StartsWithF("{") Then Str = "{}" & Str '#4187 + Return Str. + Replace("&", "&").Replace("<", "<").Replace(">", ">").Replace("'", "'"). + Replace("""", """).Replace(vbCrLf, " ") End Function '正则 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb index 5d32043..44ce4d0 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb @@ -629,19 +629,19 @@ NoSubtitle: If Id = Project.Id Then Return True '相同实例 '提取字符串中的字母和数字 Dim GetRaw = - Function(Data As String) As String - Dim Result As New StringBuilder() - For Each r As Char In Data.Where(Function(c) Char.IsLetterOrDigit(c)) - Result.Append(r) - Next - Return Result.ToString.ToLower - End Function + Function(Data As String) As String + Dim Result As New StringBuilder() + For Each r As Char In Data.Where(Function(c) Char.IsLetterOrDigit(c)) + Result.Append(r) + Next + Return Result.ToString.ToLower + End Function '来自不同的网站 If FromCurseForge = Project.FromCurseForge Then Return False 'Mod 加载器一致 - If ModLoaders.Count <> Project.ModLoaders.Count OrElse ModLoaders.Except(Project.ModLoaders).Count > 0 Then Return False + If ModLoaders.Count <> Project.ModLoaders.Count OrElse ModLoaders.Except(Project.ModLoaders).Any() Then Return False 'MC 版本一致 - If GameVersions.Count <> Project.GameVersions.Count OrElse GameVersions.Except(Project.GameVersions).Count > 0 Then Return False + If GameVersions.Count <> Project.GameVersions.Count OrElse GameVersions.Except(Project.GameVersions).Any() Then Return False 'MCMOD 翻译名 / 原名 / 描述文本 / Slug 的英文部分相同 If TranslatedName = Project.TranslatedName OrElse RawName = Project.RawName OrElse Description = Project.Description OrElse diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 1ded676..2398e57 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -8,9 +8,13 @@ ''' Public Function DlClientJarGet(Version As McVersion, ReturnNothingOnFileUseable As Boolean) As NetFile '获取底层继承版本 - Do While Not String.IsNullOrEmpty(Version.InheritVersion) - Version = New McVersion(Version.InheritVersion) - Loop + Try + Do While Not String.IsNullOrEmpty(Version.InheritVersion) + Version = New McVersion(Version.InheritVersion) + Loop + Catch ex As Exception + Log(ex, "获取底层继承版本失败") + End Try '检查 Json 是否标准 If Version.JsonObject("downloads") Is Nothing OrElse Version.JsonObject("downloads")("client") Is Nothing OrElse Version.JsonObject("downloads")("client")("url") Is Nothing Then Throw New Exception("底层版本 " & Version.Name & " 中无 jar 文件下载信息") @@ -610,7 +614,9 @@ Public Sub DlForgeVersionOfficialMain(Loader As LoaderTask(Of String, List(Of DlForgeVersionEntry))) Dim Result As String Try - Result = NetGetCodeByDownload("https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_" & Loader.Input & ".html", UseBrowserUserAgent:=True) + Result = NetGetCodeByDownload("https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_" & + Loader.Input.Replace("-", "_") & '兼容 Forge 1.7.10-pre4,#4057 + ".html", UseBrowserUserAgent:=True) Catch ex As Exception If GetExceptionSummary(ex).Contains("(404)") Then Throw New Exception("没有可用版本") @@ -679,7 +685,9 @@ ''' Forge 版本列表,BMCLAPI。 ''' Public Sub DlForgeVersionBmclapiMain(Loader As LoaderTask(Of String, List(Of DlForgeVersionEntry))) - Dim Json As JArray = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/forge/minecraft/" & Loader.Input, IsJson:=True) + Dim Json As JArray = NetGetCodeByRequestRetry("https://bmclapi2.bangbang93.com/forge/minecraft/" & + Loader.Input.Replace("-", "_"), '兼容 Forge 1.7.10-pre4,#4057 + IsJson:=True) Dim Versions As New List(Of DlForgeVersionEntry) Try Dim Recommended As String = McDownloadForgeRecommendedGet(Loader.Input) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index 4d130d4..163f498 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -1278,7 +1278,9 @@ SystemBrowser: Public Function ExtractJavaWrapper() As String Dim WrapperPath As String = GetJavaWrapperDir() & "\JavaWrapper.jar" SyncLock ExtractJavaWrapperLock '避免 OptiFine 和 Forge 安装时同时释放 Java Wrapper 导致冲突 - WriteFile(WrapperPath, GetResources("JavaWrapper")) + If Not WriteFile(WrapperPath, GetResources("JavaWrapper")) Then + Throw New FileNotFoundException("释放 Java Wrapper 失败") + End If End SyncLock Log("[Java] 已释放 Java Wrapper:" & WrapperPath) Return WrapperPath diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 12284ab..7dacc5d 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -25,6 +25,7 @@ Public Module ModModpack Archive = New ZipArchive(New FileStream(File, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) '从根目录判断整合包类型 If Archive.GetEntry("mcbbs.packmeta") IsNot Nothing Then PackType = 3 : Exit Try 'MCBBS 整合包(优先于 manifest.json 判断) + If Archive.GetEntry("mmc-pack.json") IsNot Nothing Then PackType = 2 : Exit Try 'MMC 整合包(优先于 manifest.json 判断,#4194) If Archive.GetEntry("modrinth.index.json") IsNot Nothing Then PackType = 4 : Exit Try 'Modrinth 整合包 If Archive.GetEntry("manifest.json") IsNot Nothing Then Dim Json As JObject = GetJson(ReadFile(Archive.GetEntry("manifest.json").Open, Encoding.UTF8)) @@ -35,7 +36,6 @@ Public Module ModModpack End If End If If Archive.GetEntry("modpack.json") IsNot Nothing Then PackType = 1 : Exit Try 'HMCL 整合包 - If Archive.GetEntry("mmc-pack.json") IsNot Nothing Then PackType = 2 : Exit Try 'MMC 整合包 '从一级目录判断整合包类型 For Each Entry In Archive.Entries Dim FullNames As String() = Entry.FullName.Split("/") diff --git a/Plain Craft Launcher 2/Modules/ModEvent.vb b/Plain Craft Launcher 2/Modules/ModEvent.vb index 9e3ed0f..e5282a9 100644 --- a/Plain Craft Launcher 2/Modules/ModEvent.vb +++ b/Plain Craft Launcher 2/Modules/ModEvent.vb @@ -21,26 +21,28 @@ OpenWebsite(Data(0)) Case "打开文件", "打开帮助" - RunInThread(Sub() - Try - '确认实际路径 - Dim ActualPaths = GetEventAbsoluteUrls(Data(0), Type) - Dim Location = ActualPaths(0), WorkingDir = ActualPaths(1) - '执行 - If Type = "打开文件" Then - Dim Info As New ProcessStartInfo With { - .Arguments = If(Data.Length >= 2, Data(1), ""), - .FileName = Location, - .WorkingDirectory = WorkingDir - } - Process.Start(Info) - Else '打开帮助 - PageOtherHelp.EnterHelpPage(Location) - End If - Catch ex As Exception - Log(ex, "执行打开类自定义事件失败", LogLevel.Msgbox) - End Try - End Sub) + RunInThread( + Sub() + Try + '确认实际路径 + Dim ActualPaths = GetEventAbsoluteUrls(Data(0), Type) + Dim Location = ActualPaths(0), WorkingDir = ActualPaths(1) + Log($"[Control] 打开类自定义事件实际路径:{Location},工作目录:{WorkingDir}") + '执行 + If Type = "打开文件" Then + Dim Info As New ProcessStartInfo With { + .Arguments = If(Data.Length >= 2, Data(1), ""), + .FileName = Location, + .WorkingDirectory = WorkingDir + } + Process.Start(Info) + Else '打开帮助 + PageOtherHelp.EnterHelpPage(Location) + End If + Catch ex As Exception + Log(ex, "执行打开类自定义事件失败", LogLevel.Msgbox) + End Try + End Sub) Case "启动游戏" If Data(0) = "\current" Then diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index 3c21a88..5a7874b 100644 --- a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb +++ b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb @@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 ' 方法是按如下所示使用“*” - - + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 66c686c..866c3e1 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -316,46 +316,6 @@ Public Module ModDownloadLib #Region "OptiFine 下载" - Public Sub McDownloadOptiFine(DownloadInfo As DlOptiFineListEntry) - Try - Dim Id As String = DownloadInfo.NameVersion - Dim VersionFolder As String = PathMcFolder & "versions\" & Id & "\" - Dim IsNewVersion As Boolean = Val(DownloadInfo.Inherit.Split(".")(1)) >= 14 - Dim Target As String = If(IsNewVersion, - PathTemp & "Cache\Code\" & DownloadInfo.NameVersion & "_" & GetUuid(), - PathMcFolder & "libraries\optifine\OptiFine\" & DownloadInfo.NameFile.Replace("OptiFine_", "").Replace(".jar", "").Replace("preview_", "") & "\" & DownloadInfo.NameFile.Replace("OptiFine_", "OptiFine-").Replace("preview_", "")) - - '重复任务检查 - SyncLock LoaderTaskbarLock - For i = 0 To LoaderTaskbar.Count - 1 - If LoaderTaskbar(i).Name = "OptiFine " & DownloadInfo.NameDisplay & " 下载" Then - Hint("该版本正在下载中!", HintType.Critical) - Exit Sub - End If - Next - End SyncLock - - '已有版本检查 - If File.Exists(VersionFolder & Id & ".json") Then - If MyMsgBox("版本 " & Id & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 json 和 jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then - File.Delete(VersionFolder & Id & ".jar") - File.Delete(VersionFolder & Id & ".json") - Else - Exit Sub - End If - End If - - '启动 - Dim Loader As New LoaderCombo(Of String)("OptiFine " & DownloadInfo.NameDisplay & " 下载", McDownloadOptiFineLoader(DownloadInfo)) With {.OnStateChanged = AddressOf McInstallState} - Loader.Start(VersionFolder) - LoaderTaskbarAdd(Loader) - FrmMain.BtnExtraDownload.ShowRefresh() - FrmMain.BtnExtraDownload.Ribble() - - Catch ex As Exception - Log(ex, "开始 OptiFine 下载失败", LogLevel.Feedback) - End Try - End Sub Private Sub McDownloadOptiFineSave(DownloadInfo As DlOptiFineListEntry) Try Dim Id As String = DownloadInfo.NameVersion @@ -1282,9 +1242,11 @@ Retry: Else 'Forge Dim Forge As DlForgeVersionEntry = Info + Dim FileName As String = + $"{Forge.Inherit.Replace("-", "_")}-{Forge.FileVersion}/forge-{Forge.Inherit.Replace("-", "_")}-{Forge.FileVersion}-{Forge.Category}.{Forge.FileExtension}" Files.Add(New NetFile({ - $"https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/{Forge.Inherit}-{Forge.FileVersion}/forge-{Forge.Inherit}-{Forge.FileVersion}-{Forge.Category}.{Forge.FileExtension}", - $"https://files.minecraftforge.net/maven/net/minecraftforge/forge/{Forge.Inherit}-{Forge.FileVersion}/forge-{Forge.Inherit}-{Forge.FileVersion}-{Forge.Category}.{Forge.FileExtension}" + $"https://bmclapi2.bangbang93.com/maven/net/minecraftforge/forge/{FileName}", + $"https://files.minecraftforge.net/maven/net/minecraftforge/forge/{FileName}" }, InstallerAddress, New FileChecker(MinSize:=64 * 1024, Hash:=Forge.Hash))) End If Task.Output = Files diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index 9d05282..9cf83e2 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -724,7 +724,7 @@ Private Function IsOptiFineSuitForForge(OptiFine As DlOptiFineListEntry, Forge As DlForgeVersionEntry) If Forge.Inherit <> OptiFine.Inherit Then Return False '不是同一个大版本 If OptiFine.RequiredForgeVersion Is Nothing Then Return False '不兼容 Forge - If OptiFine.RequiredForgeVersion = "" Then Return True + If String.IsNullOrWhiteSpace(OptiFine.RequiredForgeVersion) Then Return True '#4183 If OptiFine.RequiredForgeVersion.Contains(".") Then 'XX.X.XXX Return VersionSortInteger(Forge.Version.ToString, OptiFine.RequiredForgeVersion) >= 0 Else 'XXXX diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb index 777ed52..60005b2 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb @@ -21,6 +21,19 @@ '加载版本 RunInNewThread( Sub() + ''自动整合包安装:准备 + 'Dim PackInstallPath As String = Nothing + 'If File.Exists(Path & "modpack.zip") Then PackInstallPath = Path & "modpack.zip" + 'If File.Exists(Path & "modpack.mrpack") Then PackInstallPath = Path & "modpack.mrpack" + 'If PackInstallPath IsNot Nothing Then + ' Log("[Launch] 需自动安装整合包:" & PackInstallPath, LogLevel.Debug) + ' If Not Directory.Exists(Path & ".minecraft\") Then + ' Directory.CreateDirectory(Path & ".minecraft\") + ' Directory.CreateDirectory(Path & ".minecraft\versions\") + ' McFolderLauncherProfilesJsonCreate(Path & ".minecraft\") + ' End If + ' Setup.Set("LaunchFolderSelect", "$.minecraft\") + 'End If '确认 Minecraft 文件夹存在 PathMcFolder = Setup.Get("LaunchFolderSelect").ToString.Replace("$", Path) If PathMcFolder = "" OrElse Not Directory.Exists(PathMcFolder) Then @@ -35,17 +48,21 @@ End If Log("[Launch] Minecraft 文件夹:" & PathMcFolder) If Setup.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(500, 3000)) + ''自动整合包安装 + 'If PackInstallPath IsNot Nothing Then + ' If ModpackInstall(PackInstallPath) Then + ' Log("[Launch] 自动安装整合包成功:" & PackInstallPath) + ' File.Delete(PackInstallPath) + ' Else + ' Log("[Launch] 自动安装整合包失败:" & PackInstallPath) + ' End If + 'End If '确认 Minecraft 版本存在 Dim Selection As String = Setup.Get("LaunchVersionSelect") - Dim Version As McVersion - If Selection = "" Then - Version = Nothing - Else - Version = New McVersion(Selection) - End If - If IsNothing(Version) OrElse Not (Version.Path.StartsWith(PathMcFolder) AndAlso Version.Check) Then + Dim Version As McVersion = If(Selection = "", Nothing, New McVersion(Selection)) + If Version Is Nothing OrElse Not (Version.Path.StartsWith(PathMcFolder) AndAlso Version.Check) Then '无效的版本 - Log("[Launch] Minecraft 版本无效" & If(IsNothing(Version), ",没有有效版本", ":" & Version.Path), If(IsNothing(Version), LogLevel.Normal, LogLevel.Debug)) + Log("[Launch] Minecraft 版本无效" & If(Version Is Nothing, ",没有有效版本", ":" & Version.Path), If(IsNothing(Version), LogLevel.Normal, LogLevel.Debug)) If Not McVersionListLoader.State = LoadState.Finished Then LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True) If Not McVersionList.Any() OrElse McVersionList.First.Value(0).Logo.Contains("RedstoneBlock") Then Version = Nothing @@ -57,7 +74,6 @@ Log("[Launch] 自动选择 Minecraft 版本:" & Version.Path) End If End If - RunInUi( Sub() McVersionCurrent = Version '绕这一圈是为了避免 McVersionCheck 触发第二次版本改变 @@ -73,21 +89,6 @@ If LoginType = McLoginType.Legacy OrElse LoginType = McLoginType.Ms Then CType(FindName("RadioLoginType" & LoginType), MyRadioButton).Checked = True RefreshPage(False, False) - '整合包安装 - If McVersionList.Count = 0 AndAlso File.Exists(Path & "modpack.zip") Then - If MyMsgBox("即将自动安装整合包,是否继续?", Button2:="取消") = 1 Then - If Not Directory.Exists(Path & ".minecraft\") Then - Directory.CreateDirectory(Path & ".minecraft\") - Directory.CreateDirectory(Path & ".minecraft\versions\") - Setup.Set("LaunchFolderSelect", "$.minecraft\") - McFolderLauncherProfilesJsonCreate(Path & ".minecraft\") - End If - McFolderListLoader.Start(IsForceRestart:=True) - - RunInNewThread(Sub() ModpackInstall(Path & "modpack.zip", ShowHint:=False), "Modpack Auto Install") - End If - End If - AniControlEnabled -= 1 End Sub @@ -635,7 +636,7 @@ Finish: Log("[Minecraft] 启动按钮:正在加载 Minecraft 版本") FrmLaunchLeft.BtnLaunch.Text = "正在加载" FrmLaunchLeft.BtnLaunch.IsEnabled = False - FrmLaunchLeft.LabVersion.Text = "正在加载版本列表,请稍候" + FrmLaunchLeft.LabVersion.Text = "正在加载中,请稍候" FrmLaunchLeft.BtnVersion.IsEnabled = False FrmLaunchLeft.BtnMore.Visibility = Visibility.Collapsed Case 1 diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb index a283e57..2951a1a 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb @@ -438,7 +438,7 @@ Refresh: End If End Sub Private Sub LabLauncherTheme11Click_MouseLeftButtonUp() Handles LabLauncherTheme11Click.MouseLeftButtonUp, RadioLauncherTheme11.MouseRightButtonUp - If LabLauncherTheme11Click.Visibility = Visibility.Collapsed OrElse LabLauncherTheme11Click.ToolTip.ToString.Contains("点击") Then + If LabLauncherTheme11Click.Visibility = Visibility.Collapsed OrElse If(LabLauncherTheme11Click.ToolTip, "").ToString.Contains("点击") Then If MyMsgBox( "1. 不爬取或攻击相关服务或网站,不盗取相关账号,没有谜题可以或需要以此来解决。" & vbCrLf & "2. 不得篡改或损毁相关公开信息,请尽量让它们保持原状。" & vbCrLf & diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index c829231..d68df7a 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -38,7 +38,7 @@ false false true - .\Output\ + .\bin\ Plain Craft Launcher 2.xml 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314 false @@ -55,7 +55,7 @@ false false true - .\Output\ + .\bin\ Plain Craft Launcher 2.xml 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42314 false @@ -100,7 +100,7 @@ false - .\Output\ + .\bin\ Plain Craft Launcher 2.xml true 1 @@ -111,7 +111,7 @@ false - .\Output\ + .\bin\ Plain Craft Launcher 2.xml true 1 @@ -129,7 +129,7 @@ - .\Output\ + .\bin\ RELEASE,BY_UPDATE Plain Craft Launcher 2.xml true diff --git a/Plain Craft Launcher 2/Resources/Custom.xaml b/Plain Craft Launcher 2/Resources/Custom.xaml index 94e27d4..df177e3 100644 --- a/Plain Craft Launcher 2/Resources/Custom.xaml +++ b/Plain Craft Launcher 2/Resources/Custom.xaml @@ -148,7 +148,7 @@ + Text="打开记事本" EventType="打开文件" EventData="notepad" /> @@ -270,7 +270,7 @@ + Text="打开记事本" EventType="打开文件" EventData="notepad" /> diff --git a/Plain Craft Launcher 2/Resources/Help.zip b/Plain Craft Launcher 2/Resources/Help.zip index c55c8d3066ee03408281b7071d5ca2b2dcc696cd..600091f7dd8e081efab76d255fae7ceb23916d47 100644 GIT binary patch delta 27571 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 CvBRVQ delta 27471 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