diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb
index c444db3..fd8cee3 100644
--- a/Plain Craft Launcher 2/FormMain.xaml.vb
+++ b/Plain Craft Launcher 2/FormMain.xaml.vb
@@ -11,6 +11,10 @@ Public Class FormMain
Dim FeatureList As New List(Of KeyValuePair(Of Integer, String))
'统计更新日志条目
#If BETA Then
+ If LastVersion < 391 Then 'Release 2.12.6.2
+ FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:会为部分 Forge / NeoForge 选择不支持的 Java"))
+ BugCount += 4
+ End If
If LastVersion < 389 Then 'Release 2.12.6.1
If LastVersion = 387 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法使用 Java 25+ 启动 Forge"))
FeatureCount += 4
@@ -106,6 +110,10 @@ Public Class FormMain
'3:BUG+ IMP* FEAT-
'2:BUG* IMP-
'1:BUG-
+ If LastVersion < 390 Then 'Snapshot 2.12.6.2
+ FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:会为部分 Forge / NeoForge 选择不支持的 Java"))
+ BugCount += 4
+ End If
If LastVersion < 388 Then 'Snapshot 2.12.6.1
If LastVersion = 386 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法使用 Java 25+ 启动 Forge"))
FeatureCount += 4
@@ -268,7 +276,7 @@ Public Class FormMain
'输出更新日志
RunInNewThread(
Sub()
- If MyMsgBox(Content, "PCL 已更新至 " & VersionDisplayName, "确定", "完整更新日志") = 2 Then
+ If MyMsgBox(Content, "PCL 已更新至" & VersionDisplayName, "确定", "完整更新日志") = 2 Then
OpenWebsite("https://meloong.com/afd/a/LTCat?tab=feed")
End If
End Sub, "UpdateLog Output")
diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb
index a306f12..9b5cc20 100644
--- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb
+++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb
@@ -14,12 +14,12 @@ Public Module ModBase
#Region "声明"
'下列版本信息由更新器自动修改
- Public Const VersionBaseName As String = "2.12.6.1" '显示用版本名
+ Public Const VersionBaseName As String = "2.12.6.2" '显示用版本名
Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换
#If BETA Then
- Public Const VersionCode As Integer = 389 '正式版
+ Public Const VersionCode As Integer = 391 '正式版
#Else
- Public Const VersionCode As Integer = 388 '快照版
+ Public Const VersionCode As Integer = 390 '快照版
#End If
'自动生成的版本信息
Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
diff --git a/Plain Craft Launcher 2/Modules/Base/ModNet.vb b/Plain Craft Launcher 2/Modules/Base/ModNet.vb
index a5e1131..ed60a3c 100644
--- a/Plain Craft Launcher 2/Modules/Base/ModNet.vb
+++ b/Plain Craft Launcher 2/Modules/Base/ModNet.vb
@@ -262,8 +262,7 @@ Retry:
End If
'发送请求
SyncLock RequestClientLock
- '延迟初始化,以避免在程序启动前加载 CacheCow 导致 DLL 加载失败
- If RequestClient Is Nothing Then
+ If RequestClient Is Nothing Then '延迟初始化,以避免在程序启动前加载 CacheCow 导致 DLL 加载失败
RequestClient = CacheCow.Client.ClientExtensions.CreateClient(New CacheCow.Client.FileCacheStore.FileStore(PathTemp & "Cache/Http/"), New HttpClientHandler With {
.AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip,
.UseCookies = False '不设为 False 就不能从 Header 手动传入 Cookies
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
index 95aec8b..52c5a06 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
@@ -211,9 +211,10 @@
'提取所有 Drop 序数
Dim Drops As New List(Of Integer)
For Each Version As JObject In Loader.Output.Value("versions")
- Drops.Add(McVersion.VersionToDrop(Version("id")))
+ Dim Drop As Integer = McVersion.VersionToDrop(Version("id"))
+ If Drop = 209 Then Continue For
+ Drops.Add(Drop)
Next
- Drops.Remove(209)
AllDrops = Drops.Distinct.OrderByDescending(Function(d) d).ToList()
End Sub
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
index d27859d..c684380 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
@@ -1202,7 +1202,7 @@ Retry:
End If
End If
- 'Forge 检测
+ 'Forge 检测(部分测试结果见 #8432)
If McInstanceSelected.Version.HasForge Then
If McInstanceSelected.Version.Vanilla >= New Version(6, 0, 1) AndAlso McInstanceSelected.Version.Vanilla <= New Version(7, 0, 2) Then
'1.6.1 - 1.7.2:必须 Java 7
@@ -1220,11 +1220,32 @@ Retry:
MinVer = If(New Version(1, 8, 0, 0) > MinVer, New Version(1, 8, 0, 0), MinVer)
MaxVer = If(New Version(1, 15, 999, 999) < MaxVer, New Version(1, 15, 999, 999), MaxVer)
ElseIf CompareVersionGE(McInstanceSelected.Version.Forge, "34.0.0") AndAlso CompareVersionGE("36.2.25", McInstanceSelected.Version.Forge) Then
- '1.16,Forge 34.X ~ 36.2.25:最高 Java 8u320
+ '1.16.3~5,Forge 34.0.0 ~ 36.2.25:最高 Java 8u320
MaxVer = If(New Version(1, 8, 0, 320) < MaxVer, New Version(1, 8, 0, 320), MaxVer)
- ElseIf McInstanceSelected.Version.Vanilla.Major >= 18 AndAlso McInstanceSelected.Version.Vanilla.Major < 19 AndAlso McInstanceSelected.Version.HasOptiFine Then '#305
+ ElseIf CompareVersionGE(McInstanceSelected.Version.Forge, "36.2.26") AndAlso CompareVersionGE("36.999.999", McInstanceSelected.Version.Forge) Then
+ '1.16.5,Forge 36.2.26+,<37.0.0:最高 Java 23
+ MaxVer = If(New Version(1, 23, 999, 999) < MaxVer, New Version(1, 23, 999, 999), MaxVer)
+ ElseIf CompareVersionGE(McInstanceSelected.Version.Forge, "37.0.0") AndAlso CompareVersionGE("37.0.79", McInstanceSelected.Version.Forge) Then
+ '1.17.1,Forge 37.0.0 ~ 37.0.79:最高 Java 16
+ MaxVer = If(New Version(1, 16, 999, 999) < MaxVer, New Version(1, 16, 999, 999), MaxVer)
+ ElseIf McInstanceSelected.Version.Vanilla.Major = 18 AndAlso McInstanceSelected.Version.HasOptiFine Then '#305
'1.18:若安装了 OptiFine,最高 Java 18
MaxVer = If(New Version(1, 18, 999, 999) < MaxVer, New Version(1, 18, 999, 999), MaxVer)
+ ElseIf CompareVersionGE(McInstanceSelected.Version.Forge, "45.0.21") AndAlso CompareVersionGE("45.0.65", McInstanceSelected.Version.Forge) Then
+ '1.19.4,Forge 45.0.21 ~ 45.0.65:最高 Java 19
+ MaxVer = If(New Version(1, 19, 999, 999) < MaxVer, New Version(1, 19, 999, 999), MaxVer)
+ ElseIf CompareVersionGE(McInstanceSelected.Version.Forge, "45.0.66") AndAlso CompareVersionGE("47.4.8", McInstanceSelected.Version.Forge) Then
+ '1.19.4~1.20.1,Forge 45.0.66 ~ 47.4.8:最高 Java 21
+ MaxVer = If(New Version(1, 21, 999, 999) < MaxVer, New Version(1, 21, 999, 999), MaxVer)
+ End If
+ End If
+
+ 'NeoForge 检测
+ If McInstanceSelected.Version.HasNeoForge Then
+ If McInstanceSelected.Version.Vanilla = New Version(20, 0, 1) OrElse
+ (CompareVersionGE("20.2.62-beta", McInstanceSelected.Version.NeoForge) AndAlso Not McInstanceSelected.Version.NeoForge.Contains("25w14craftmine")) Then
+ '1.20.1,以及 1.20.2 的 20.2.62-beta 之前:最高 Java 21
+ MaxVer = If(New Version(1, 21, 999, 999) < MaxVer, New Version(1, 21, 999, 999), MaxVer)
End If
End If
@@ -1354,22 +1375,21 @@ NextInstance:
McLaunchLog($"新版 JVM 参数:从版本 JSON 获取({CurrentInstance.Name})")
If CurrentInstance.JsonObject("arguments") IsNot Nothing AndAlso CurrentInstance.JsonObject("arguments")("jvm") IsNot Nothing Then
For Each SubJson As JToken In CurrentInstance.JsonObject("arguments")("jvm")
- If SubJson.Type = JTokenType.String Then
- '字符串类型
- Args.Add(SubJson.ToString.Trim)
- Else
- '非字符串类型
- If McJsonRuleCheck(SubJson("rules")) Then
- '满足准则
- If SubJson("value").Type = JTokenType.String Then
- Args.Add(SubJson("value").ToString.Trim)
+ Select Case SubJson.Type
+ Case JTokenType.String
+ Args.Add(SubJson.ToString.Trim)
+ Case JTokenType.Object
+ Dim Argument As JObject = CType(SubJson, JObject)
+ If Argument.ContainsKey("rules") AndAlso Not McJsonRuleCheck(Argument("rules")) Then Continue For '不满足准则
+ If Not Argument.ContainsKey("value") Then Continue For '没有 value 字段
+ If Argument("value").Type = JTokenType.String Then
+ Args.Add(Argument("value").ToString.Trim)
Else
- For Each value As JToken In SubJson("value")
+ For Each value As JToken In Argument("value")
Args.Add(value.ToString.Trim)
Next
End If
- End If
- End If
+ End Select
Next
End If
If CurrentInstance.InheritName <> "" Then
@@ -1525,18 +1545,21 @@ NextInstance:
McLaunchLog($"新版游戏参数:从版本 JSON 获取({CurrentInstance.Name})")
If CurrentInstance.JsonObject("arguments") IsNot Nothing AndAlso CurrentInstance.JsonObject("arguments")("game") IsNot Nothing Then
For Each SubJson As JToken In CurrentInstance.JsonObject("arguments")("game")
- If SubJson.Type = JTokenType.String Then '字符串类型
- AppendArg(SubJson.ToString)
- Else '非字符串类型
- If Not McJsonRuleCheck(SubJson("rules")) Then Continue For '检查要求
- If SubJson("value").Type = JTokenType.String Then
- AppendArg(SubJson("value").ToString)
- Else
- For Each value As JToken In SubJson("value")
- AppendArg(value.ToString)
- Next
- End If
- End If
+ Select Case SubJson.Type
+ Case JTokenType.String
+ AppendArg(SubJson.ToString)
+ Case JTokenType.Object
+ Dim Argument As JObject = CType(SubJson, JObject)
+ If Argument.ContainsKey("rules") AndAlso Not McJsonRuleCheck(Argument("rules")) Then Continue For '不满足准则
+ If Not Argument.ContainsKey("value") Then Continue For '没有 value 字段
+ If Argument("value").Type = JTokenType.String Then
+ AppendArg(Argument("value").ToString)
+ Else
+ For Each value As JToken In Argument("value")
+ AppendArg(value.ToString)
+ Next
+ End If
+ End Select
Next
End If
If CurrentInstance.InheritName <> "" Then
@@ -1823,7 +1846,7 @@ NextInstance:
''' 获取 Natives 文件夹路径,不以 \ 结尾。
'''
Private Function GetNativesFolder() As String
- Dim Result As String = McInstanceSelected.PathVersion & McInstanceSelected.Name & "-natives"
+ Dim Result As String = ShortenPath(McInstanceSelected.PathVersion) & McInstanceSelected.Name & "-natives"
If Not (IsGBKEncoding OrElse Result.IsASCII()) Then
Result = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\bin\natives"
If Not Result.IsASCII() Then
diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
index 4077417..5d5ba60 100644
--- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
+++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
@@ -170,7 +170,7 @@ Public Module ModMinecraft
#Region "版本处理"
- Public Const McInstanceCacheVersion As Integer = 34
+ Public Const McInstanceCacheVersion As Integer = 35
Private _McInstanceSelected As McInstance
'''
@@ -747,8 +747,11 @@ Recheck:
Case Else '根据 API 进行筛选
Dim RealJson As String = If(JsonObject, JsonText).ToString
'愚人节与快照版本
- If If(JsonObject("type"), "").ToString = "fool" OrElse
- (ReleaseTime.ToUniversalTime.Month = 4 AndAlso ReleaseTime.ToUniversalTime.Day = 1) OrElse GetMcFoolName(Version.VanillaName) <> "" Then
+ Dim FixedReleaseTime = ReleaseTime.ToUniversalTime().AddHours(2)
+ Dim JsonType = If(JsonObject("type"), "").ToString
+ If JsonType = "fool" OrElse
+ (FixedReleaseTime.Month = 4 AndAlso FixedReleaseTime.Day = 1 AndAlso JsonType = "snapshot") OrElse
+ GetMcFoolName(Version.VanillaName) <> "" Then
State = McInstanceState.Fool
ElseIf IsSnapshot() Then
State = McInstanceState.Snapshot
@@ -971,7 +974,7 @@ ExitDataLoad:
Public VanillaName As String
'''
''' 可比较的三段式原版版本号。
- ''' 对老版本格式,例如 1.20.3,会被转换为 20.0.3。
+ ''' 对老版本格式,例如 1.20.1,会被转换为 20.0.1。
''' 若没有版本号,例如旧快照,则为 9999.0.0。
'''
Public Vanilla As Version
@@ -1058,7 +1061,7 @@ ExitDataLoad:
'''
Public Forge As String = ""
'''
- ''' NeoForge 版本名,如 21.0.2-beta、47.1.79。
+ ''' NeoForge 版本名,如 47.1.79、21.0.2-beta、26.1.0.0-alpha.14+snapshot-11。
'''
Public NeoForge As String = ""
'''
diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb
index cec88b8..629ff78 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 a203e97..036589a 100644
--- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb
+++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb
@@ -4,49 +4,6 @@ Public Module ModDownloadLib
#Region "Minecraft 下载"
- '''
- ''' 下载某个 Minecraft 版本,这会创造一个单独的下载任务,失败会跳过执行并要求反馈。
- ''' 返回正在下载的任务,若跳过或失败,则返回 Nothing。
- '''
- ''' 所下载的 Minecraft 的版本名。
- ''' Json 文件的 Mojang 官方地址。
- Public Function McDownloadClient(Behaviour As NetPreDownloadBehaviour, Id As String, Optional JsonUrl As String = Nothing) As LoaderCombo(Of String)
- Try
- Dim VersionFolder As String = McFolderSelected & "versions\" & Id & "\"
-
- '重复任务检查
- For Each OngoingLoader In LoaderTaskbar.ToList()
- If OngoingLoader.Name <> $"Minecraft {Id} 下载" Then Continue For
- If Behaviour = NetPreDownloadBehaviour.ExitWhileExistsOrDownloading Then Return OngoingLoader
- Hint("该版本正在下载中!", HintType.Red)
- Return OngoingLoader
- Next
-
- '已有版本检查
- If Behaviour <> NetPreDownloadBehaviour.IgnoreCheck AndAlso File.Exists(VersionFolder & Id & ".json") AndAlso File.Exists(VersionFolder & Id & ".jar") Then
- If Behaviour = NetPreDownloadBehaviour.ExitWhileExistsOrDownloading Then Return Nothing
- If MyMsgBox("版本 " & Id & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 json 与 jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then
- File.Delete(VersionFolder & Id & ".jar")
- File.Delete(VersionFolder & Id & ".json")
- Else
- Return Nothing
- End If
- End If
-
- '启动
- Dim Loader As New LoaderCombo(Of String)("Minecraft " & Id & " 下载", McDownloadClientLoader(Id, JsonUrl)) With {.OnStateChanged = AddressOf McInstallState}
- Loader.Start(VersionFolder)
- LoaderTaskbarAdd(Loader)
- FrmMain.BtnExtraDownload.ShowRefresh()
- FrmMain.BtnExtraDownload.Ribble()
- Return Loader
-
- Catch ex As Exception
- Log(ex, "开始 Minecraft 下载失败", LogLevel.Feedback)
- Return Nothing
- End Try
- End Function
-
'''
''' 获取下载某个 Minecraft 版本的加载器列表。
''' 它必须安装到 McFolderSelected,但是可以自定义版本名(不过自定义的版本名不会修改 Json 中的 id 项)。
@@ -226,7 +183,7 @@ Public Module ModDownloadLib
Dim Instance As New McInstance(VersionFolder)
If Instance.JsonObject("downloads") Is Nothing OrElse Instance.JsonObject("downloads")("server") Is Nothing OrElse Instance.JsonObject("downloads")("server")("url") Is Nothing Then
File.Delete(VersionFolder & Id & ".json")
- If Not New DirectoryInfo(VersionFolder).GetFileSystemInfos.Any() Then Directory.Delete(VersionFolder)
+ If Not New DirectoryInfo(VersionFolder).GetFileSystemInfos.Any() Then DeleteDirectory(VersionFolder)
Task.Output = New List(Of NetFile)
Hint($"Mojang 没有给 Minecraft {Id} 提供官方服务端下载,没法下,撤退!", HintType.Red)
Thread.Sleep(2000) '等玩家把上一个提示看完
@@ -520,11 +477,11 @@ pause"
'''
''' 获取下载某个 OptiFine 版本的加载器列表。
+ ''' 这不会补全所需的支持库文件,需要后续手动补全支持库。
'''
- Private Function McDownloadOptiFineLoader(DownloadInfo As DlOptiFineListEntry, 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 McDownloadOptiFineLoader(DownloadInfo As DlOptiFineListEntry, McFolder As String, ClientDownloadLoader As LoaderCombo(Of String), ClientFolder As String) As List(Of LoaderBase)
'参数初始化
- McFolder = If(McFolder, McFolderSelected)
Dim IsCustomFolder As Boolean = McFolder <> McFolderSelected
Dim Id As String = DownloadInfo.InstanceName
Dim VersionFolder As String = McFolder & "versions\" & Id & "\"
@@ -537,12 +494,6 @@ pause"
'获取下载地址
Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("获取 OptiFine 主文件下载地址",
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, DownloadInfo.Inherit)
- End If
- Task.Progress = 0.1
Dim Sources As New List(Of String)
'BMCLAPI 源
Dim BmclapiInherit As String = DownloadInfo.Inherit
@@ -555,8 +506,8 @@ pause"
'官方源
Dim PageData As String
Try
- PageData = NetRequestByClient("https://optifine.net/adloadx?f=" & DownloadInfo.FileName,
- Encoding:=New UTF8Encoding(False), Timeout:=15000, Accept:="text/html", SimulateBrowserHeaders:=True)
+ PageData = NetRequestByClientRetry("https://optifine.net/adloadx?f=" & DownloadInfo.FileName,
+ Encoding:=New UTF8Encoding(False), Accept:="text/html", SimulateBrowserHeaders:=True)
Task.Progress = 0.8
Sources.Add("https://optifine.net/" & RegexSearch(PageData, "downloadx\?f=[^""']+")(0))
Log("[Download] OptiFine " & DownloadInfo.DisplayName & " 官方下载地址:" & Sources.Last)
@@ -570,7 +521,6 @@ pause"
Loaders.Add(New LoaderTask(Of List(Of NetFile), Boolean)("等待原版下载",
Sub(Task As LoaderTask(Of List(Of NetFile), Boolean))
'等待原版文件下载完成
- If ClientDownloadLoader Is Nothing Then Return
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
@@ -690,13 +640,6 @@ Retry:
End Sub) With {.ProgressWeight = 1})
End If
- '下载支持库
- If FixLibrary Then
- Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 OptiFine 支持库文件",
- Sub(Task) Task.Output = McLibNetFilesFromInstance(New McInstance(VersionFolder))) With {.ProgressWeight = 1, .Show = False})
- Loaders.Add(New LoaderDownload("下载 OptiFine 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 4})
- End If
-
Return Loaders
End Function
'''
@@ -719,8 +662,8 @@ Retry:
'官方源
Dim PageData As String
Try
- PageData = NetRequestByClient("https://optifine.net/adloadx?f=" & DownloadInfo.FileName,
- Encoding:=New UTF8Encoding(False), Timeout:=15000, Accept:="text/html", SimulateBrowserHeaders:=True)
+ PageData = NetRequestByClientRetry("https://optifine.net/adloadx?f=" & DownloadInfo.FileName,
+ Encoding:=New UTF8Encoding(False), Accept:="text/html", SimulateBrowserHeaders:=True)
Task.Progress = 0.8
Sources.Add("https://optifine.net/" & RegexSearch(PageData, "downloadx\?f=[^""']+")(0))
Log("[Download] OptiFine " & DownloadInfo.DisplayName & " 官方下载地址:" & Sources.Last)
@@ -809,41 +752,6 @@ Retry:
#Region "LiteLoader 下载"
- Public Sub McDownloadLiteLoader(DownloadInfo As DlLiteLoaderListEntry)
- Try
- Dim Id As String = DownloadInfo.Inherit
- Dim Target As String = PathTemp & "Download\" & Id & "-Liteloader.jar"
- Dim InstanceName As String = DownloadInfo.Inherit & "-LiteLoader"
- Dim VersionFolder As String = McFolderSelected & "versions\" & InstanceName & "\"
-
- '重复任务检查
- For Each OngoingLoader In LoaderTaskbar.ToList()
- If OngoingLoader.Name <> $"LiteLoader {Id} 下载" Then Continue For
- Hint("该版本正在下载中!", HintType.Red)
- Return
- Next
-
- '已有版本检查
- If File.Exists(VersionFolder & InstanceName & ".json") Then
- If MyMsgBox("版本 " & InstanceName & " 已存在,是否重新下载?" & vbCrLf & "这会覆盖版本的 json 和 jar 文件,但不会影响版本隔离的文件。", "版本已存在", "继续", "取消") = 1 Then
- File.Delete(VersionFolder & InstanceName & ".jar")
- File.Delete(VersionFolder & InstanceName & ".json")
- Else
- Return
- End If
- End If
-
- '启动
- Dim Loader As New LoaderCombo(Of String)("LiteLoader " & Id & " 下载", McDownloadLiteLoaderLoader(DownloadInfo)) With {.OnStateChanged = AddressOf McInstallState}
- Loader.Start(VersionFolder)
- LoaderTaskbarAdd(Loader)
- FrmMain.BtnExtraDownload.ShowRefresh()
- FrmMain.BtnExtraDownload.Ribble()
-
- Catch ex As Exception
- Log(ex, "开始 LiteLoader 下载失败", LogLevel.Feedback)
- End Try
- End Sub
Private Sub McDownloadLiteLoaderSave(DownloadInfo As DlLiteLoaderListEntry)
Try
Dim Id As String = DownloadInfo.Inherit
@@ -896,11 +804,11 @@ Retry:
'''
''' 获取下载某个 LiteLoader 版本的加载器列表。
+ ''' 这不会补全所需的支持库文件,需要后续手动补全支持库。
'''
- Private Function McDownloadLiteLoaderLoader(DownloadInfo As DlLiteLoaderListEntry, Optional McFolder As String = Nothing, Optional ClientDownloadLoader As LoaderCombo(Of String) = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase)
+ Private Function McDownloadLiteLoaderLoader(DownloadInfo As DlLiteLoaderListEntry, McFolder As String) As List(Of LoaderBase)
'参数初始化
- McFolder = If(McFolder, McFolderSelected)
Dim IsCustomFolder As Boolean = McFolder <> McFolderSelected
Dim Id As String = DownloadInfo.Inherit
Dim Target As String = PathTemp & "Download\" & Id & "-Liteloader.jar"
@@ -908,14 +816,6 @@ Retry:
Dim VersionFolder As String = McFolder & "versions\" & VersionName & "\"
Dim Loaders As New List(Of LoaderBase)
- '启动依赖版本的下载
- If ClientDownloadLoader Is Nothing Then
- Loaders.Add(New LoaderTask(Of String, String)("启动 LiteLoader 依赖版本下载",
- Sub()
- If IsCustomFolder Then Throw New Exception("如果没有指定原版下载器,则不能指定 MC 安装文件夹")
- ClientDownloadLoader = McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, DownloadInfo.Inherit)
- End Sub) With {.ProgressWeight = 0.2, .Show = False, .Block = False})
- End If
'安装
Loaders.Add(New LoaderTask(Of String, String)("安装 LiteLoader",
Sub(Task As LoaderTask(Of String, String))
@@ -941,12 +841,6 @@ Retry:
Throw New Exception("安装新 LiteLoader 版本失败", ex)
End Try
End Sub) With {.ProgressWeight = 1})
- '下载支持库
- If FixLibrary Then
- Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 LiteLoader 支持库文件",
- Sub(Task) Task.Output = McLibNetFilesFromInstance(New McInstance(VersionFolder))) With {.ProgressWeight = 1, .Show = False})
- Loaders.Add(New LoaderDownload("下载 LiteLoader 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 6})
- End If
Return Loaders
End Function
@@ -1236,7 +1130,7 @@ Retry:
'''
''' 获取下载某个 Forgelike 版本的加载器列表。
'''
- Private Function McDownloadForgelikeLoader(IsNeoForge As Boolean, LoaderVersion As String, NewInstanceName 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)
+ Private Function McDownloadForgelikeLoader(IsNeoForge As Boolean, LoaderVersion As String, NewInstanceName As String, Inherit As String, Info As DlForgelikeEntry, McFolder As String, ClientDownloadLoader As LoaderCombo(Of String), ClientFolder As String) As List(Of LoaderBase)
'参数初始化
McFolder = If(McFolder, McFolderSelected)
@@ -1282,11 +1176,6 @@ Retry:
'下载 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 As New List(Of NetFile)
If Info.IsNeoForge Then
@@ -1376,7 +1265,6 @@ Retry:
#End Region
#Region "原版文件"
'等待原版文件下载完成
- If ClientDownloadLoader Is Nothing Then Return
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()
@@ -1823,11 +1711,11 @@ Retry:
'''
''' 获取下载某个 Fabric 版本的加载器列表。
+ ''' 这不会补全所需的支持库文件,需要后续手动补全支持库。
'''
- Private Function McDownloadFabricLoader(FabricVersion As String, MinecraftName As String, Optional McFolder As String = Nothing, Optional FixLibrary As Boolean = True) As List(Of LoaderBase)
+ Private Function McDownloadFabricLoader(FabricVersion As String, MinecraftName As String, McFolder As String) As List(Of LoaderBase)
'参数初始化
- McFolder = If(McFolder, McFolderSelected)
Dim IsCustomFolder As Boolean = McFolder <> McFolderSelected
Dim Id As String = "fabric-loader-" & FabricVersion & "-" & MinecraftName
Dim VersionFolder As String = McFolder & "versions\" & Id & "\"
@@ -1837,26 +1725,13 @@ Retry:
MinecraftName = MinecraftName.Replace("∞", "infinite") '放在 ID 后面避免影响版本文件夹名称
Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("获取 Fabric 主文件下载地址",
Sub(Task As LoaderTask(Of String, List(Of NetFile)))
- '启动依赖版本的下载
- If FixLibrary Then
- McDownloadClient(NetPreDownloadBehaviour.ExitWhileExistsOrDownloading, MinecraftName)
- End If
- Task.Progress = 0.5
- '构造文件请求
Task.Output = New List(Of NetFile) From {New NetFile({
"https://bmclapi2.bangbang93.com/fabric-meta/v2/versions/loader/" & MinecraftName & "/" & FabricVersion & "/profile/json",
"https://meta.fabricmc.net/v2/versions/loader/" & MinecraftName & "/" & FabricVersion & "/profile/json"
- }, VersionFolder & Id & ".json", New FileChecker(IsJson:=True))}
+ }, VersionFolder & Id & ".json", New FileChecker(IsJson:=True))} '构造文件请求
End Sub) With {.ProgressWeight = 0.5})
Loaders.Add(New LoaderDownload("下载 Fabric 主文件", New List(Of NetFile)) With {.ProgressWeight = 2.5})
- '下载支持库
- If FixLibrary Then
- Loaders.Add(New LoaderTask(Of String, List(Of NetFile))("分析 Fabric 支持库文件",
- Sub(Task) Task.Output = McLibNetFilesFromInstance(New McInstance(VersionFolder))) With {.ProgressWeight = 1, .Show = False})
- Loaders.Add(New LoaderDownload("下载 Fabric 支持库文件", New List(Of NetFile)) With {.ProgressWeight = 8})
- End If
-
Return Loaders
End Function
@@ -2002,8 +1877,9 @@ Retry:
Case LoadState.Finished
WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") '清空缓存(合并安装会先生成文件夹,这会在刷新时误判为可以使用缓存)
Hint(Loader.Name & "成功!", HintType.Green)
+ 'TODO: 自动选择安装成功的版本
Case LoadState.Failed
- Hint(Loader.Name & "失败:" & Loader.Error.GetBrief(), HintType.Red)
+ MyMsgBox(Loader.Error.GetDetail, Loader.Name & "失败", IsWarn:=True)
Case LoadState.Interrupted
Hint(Loader.Name & "已取消!", HintType.Blue)
Case LoadState.Loading
@@ -2135,7 +2011,7 @@ Retry:
LoaderList.Add(New LoaderCombo(Of String)("下载 OptiFine " & Request.OptiFineEntry.DisplayName, McDownloadOptiFineSaveLoader(Request.OptiFineEntry, OptiFineFolder & Request.OptiFineEntry.FileName)) With {.Show = False, .ProgressWeight = 16,
.Block = Request.ForgeVersion Is Nothing AndAlso Request.NeoForgeVersion Is Nothing AndAlso Request.FabricVersion Is Nothing AndAlso Request.LiteLoaderEntry Is Nothing})
Else
- LoaderList.Add(New LoaderCombo(Of String)("下载 OptiFine " & Request.OptiFineEntry.DisplayName, McDownloadOptiFineLoader(Request.OptiFineEntry, TempMcFolder, ClientLoader, Request.VersionFolder, False)) With {.Show = False, .ProgressWeight = 24,
+ LoaderList.Add(New LoaderCombo(Of String)("下载 OptiFine " & Request.OptiFineEntry.DisplayName, McDownloadOptiFineLoader(Request.OptiFineEntry, TempMcFolder, ClientLoader, Request.VersionFolder)) With {.Show = False, .ProgressWeight = 24,
.Block = Request.ForgeVersion Is Nothing AndAlso Request.NeoForgeVersion Is Nothing AndAlso Request.FabricVersion Is Nothing AndAlso Request.LiteLoaderEntry Is Nothing})
End If
End If
@@ -2151,12 +2027,12 @@ Retry:
End If
'LiteLoader
If Request.LiteLoaderEntry IsNot Nothing Then
- LoaderList.Add(New LoaderCombo(Of String)("下载 LiteLoader " & Request.MinecraftName, McDownloadLiteLoaderLoader(Request.LiteLoaderEntry, TempMcFolder, ClientLoader, False)) With {.Show = False, .ProgressWeight = 1,
+ LoaderList.Add(New LoaderCombo(Of String)("下载 LiteLoader " & Request.MinecraftName, McDownloadLiteLoaderLoader(Request.LiteLoaderEntry, TempMcFolder)) With {.Show = False, .ProgressWeight = 1,
.Block = Request.FabricVersion Is Nothing})
End If
'Fabric
If Request.FabricVersion IsNot Nothing Then
- LoaderList.Add(New LoaderCombo(Of String)("下载 Fabric " & Request.FabricVersion, McDownloadFabricLoader(Request.FabricVersion, Request.MinecraftName, TempMcFolder, False)) With {.Show = False, .ProgressWeight = 2,
+ LoaderList.Add(New LoaderCombo(Of String)("下载 Fabric " & Request.FabricVersion, McDownloadFabricLoader(Request.FabricVersion, Request.MinecraftName, TempMcFolder)) With {.Show = False, .ProgressWeight = 2,
.Block = True})
End If
'合并安装
diff --git a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.vb b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.vb
index 0c5e8aa..7a1bf2e 100644
--- a/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.vb
@@ -676,7 +676,7 @@ Public Class PageInstanceExport
'首次压缩整合包
ZipFile.CreateFromDirectory(CacheFolder & "modpack\", CacheFolder & "modpack.mrpack")
Loader.Progress = 0.5
- Directory.Delete(CacheFolder & "modpack\", True)
+ DeleteDirectory(CacheFolder & "modpack\")
Loader.Progress = 0.6
'二次压缩整合包
ZipFile.CreateFromDirectory(CacheFolder, PackPath)
@@ -686,7 +686,7 @@ Public Class PageInstanceExport
ZipFile.CreateFromDirectory(CacheFolder & "modpack\", PackPath)
Loader.Progress = 0.8
End If
- Directory.Delete(CacheFolder, True)
+ DeleteDirectory(CacheFolder, True)
OpenExplorer(PackPath)
End Sub) With {.ProgressWeight = 6})
diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml
index 4f850fd..624a561 100644
--- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml
+++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml
@@ -124,6 +124,7 @@
+
@@ -218,6 +219,7 @@
+
@@ -226,6 +228,7 @@
+
@@ -249,6 +252,7 @@
+
@@ -311,8 +315,10 @@
+
+
@@ -322,6 +328,7 @@
+
@@ -331,16 +338,19 @@
+
+
+
@@ -444,6 +454,7 @@
+
@@ -491,6 +502,7 @@
+
diff --git a/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb
index 77f7d51..d15aaf8 100644
--- a/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb
+++ b/Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb
@@ -286,7 +286,7 @@
If File.Exists(Target.Location & "PCL.ini") Then File.Delete(Target.Location & "PCL.ini")
If Directory.Exists(Target.Location & "versions\") Then
For Each InstanceInfo In New DirectoryInfo(Target.Location & "versions\").EnumerateDirectories
- If Directory.Exists(InstanceInfo.FullName & "\PCL\") Then Directory.Delete(InstanceInfo.FullName & "\PCL\", True)
+ If Directory.Exists(InstanceInfo.FullName & "\PCL\") Then DeleteDirectory(InstanceInfo.FullName & "\PCL\", True)
Next
End If
Case 2