龙腾猫跃 3 лет назад
Родитель
Сommit
037e6b19b4
29 измененных файлов с 252 добавлено и 221 удалено
  1. 1 1
      Plain Craft Launcher 2/Controls/MyCard.vb
  2. 2 0
      Plain Craft Launcher 2/Controls/MyIconTextButton.xaml.vb
  3. 4 1
      Plain Craft Launcher 2/Controls/MyLoading.xaml.vb
  4. 22 22
      Plain Craft Launcher 2/FormMain.xaml.vb
  5. 16 10
      Plain Craft Launcher 2/Modules/Base/ModBase.vb
  6. 5 13
      Plain Craft Launcher 2/Modules/Base/ModNet.vb
  7. 3 9
      Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb
  8. 2 4
      Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb
  9. 2 19
      Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
  10. 3 2
      Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb
  11. 5 5
      Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
  12. 10 10
      Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
  13. 14 10
      Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb
  14. 65 18
      Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb
  15. 12 0
      Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb
  16. 2 2
      Plain Craft Launcher 2/My Project/AssemblyInfo.vb
  17. 3 3
      Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb
  18. 6 4
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb
  19. 1 0
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml
  20. 1 9
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb
  21. 1 0
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml
  22. 1 8
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb
  23. 40 43
      Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb
  24. 6 2
      Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb
  25. 2 3
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb
  26. 2 2
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml
  27. 0 5
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb
  28. 10 13
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml
  29. 11 3
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb

+ 1 - 1
Plain Craft Launcher 2/Controls/MyCard.vb

@@ -109,7 +109,7 @@
             Case 6
             Case 6
                 ForgeDownloadListItemPreload(Stack, Stack.Tag, AddressOf ForgeSave_Click, True)
                 ForgeDownloadListItemPreload(Stack, Stack.Tag, AddressOf ForgeSave_Click, True)
             Case 8
             Case 8
-                CompFilesCardPreload(Stack, Stack.Tag, AddressOf FrmDownloadMod.ProjectClick)
+                CompFilesCardPreload(Stack, Stack.Tag)
         End Select
         End Select
         '实现控件虚拟化
         '实现控件虚拟化
         For Each Data As Object In Stack.Tag
         For Each Data As Object In Stack.Tag

+ 2 - 0
Plain Craft Launcher 2/Controls/MyIconTextButton.xaml.vb

@@ -56,6 +56,8 @@
             RefreshColor()
             RefreshColor()
         End Set
         End Set
     End Property '颜色类别
     End Property '颜色类别
+    Public Shared ReadOnly ColorTypeProperty As DependencyProperty =
+        DependencyProperty.Register("ColorType", GetType(ColorState), GetType(MyIconTextButton), New PropertyMetadata())
 
 
     '点击事件
     '点击事件
 
 

+ 4 - 1
Plain Craft Launcher 2/Controls/MyLoading.xaml.vb

@@ -78,7 +78,10 @@ Public Class MyLoading
                         Ex = Ex.InnerException
                         Ex = Ex.InnerException
                     Loop
                     Loop
                     LabText.Text = StrTrim(Ex.Message)
                     LabText.Text = StrTrim(Ex.Message)
-                    If LabText.Text.Contains("远程主机强迫关闭了一个现有的连接") OrElse LabText.Text.Contains("操作已超时") OrElse LabText.Text.Contains("操作超时") OrElse LabText.Text.Contains("服务器超时") OrElse LabText.Text.Contains("连接超时") Then LabText.Text = "网络环境不佳,请重试或尝试使用 VPN"
+                    If {"远程主机强迫关闭了", "远程方已关闭传输流", "未能解析此远程名称", "由于目标计算机积极拒绝",
+                        "操作已超时", "操作超时", "服务器超时", "连接超时"}.Any(Function(s) LabText.Text.Contains(s)) Then
+                        LabText.Text = "网络环境不佳,请重试或尝试使用 VPN"
+                    End If
                 End If
                 End If
             Else
             Else
                 LabText.Text = TextError
                 LabText.Text = TextError

+ 22 - 22
Plain Craft Launcher 2/FormMain.xaml.vb

@@ -133,6 +133,11 @@ Public Class FormMain
         '3:BUG+ IMP* FEAT-
         '3:BUG+ IMP* FEAT-
         '2:BUG* IMP-
         '2:BUG* IMP-
         '1:BUG-
         '1:BUG-
+        If LastVersion < 306 Then 'Snapshot 2.6.9
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "为版本独立设置添加忽略 Java 兼容性警告选项"))
+            FeatureCount += 9
+            BugCount += 11
+        End If
         If LastVersion < 305 Then 'Snapshot 2.6.8
         If LastVersion < 305 Then 'Snapshot 2.6.8
             FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复开始或结束游戏时可能报错的 Bug"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复开始或结束游戏时可能报错的 Bug"))
             FeatureCount += 20
             FeatureCount += 20
@@ -840,7 +845,12 @@ Public Class FormMain
                 End Try
                 End Try
             ElseIf e.Data.GetDataPresent(DataFormats.FileDrop) Then
             ElseIf e.Data.GetDataPresent(DataFormats.FileDrop) Then
                 '获取文件并检查
                 '获取文件并检查
-                Dim FilePathList As New List(Of String)(CType(e.Data.GetData(DataFormats.FileDrop), Array))
+                Dim FilePathRaw = e.Data.GetData(DataFormats.FileDrop)
+                If FilePathRaw Is Nothing Then '#2690
+                    Hint("请将文件解压后再拖入!", HintType.Critical)
+                    Exit Sub
+                End If
+                Dim FilePathList As New List(Of String)(CType(FilePathRaw, IEnumerable(Of String)))
                 e.Handled = True
                 e.Handled = True
                 If Directory.Exists(FilePathList.First) AndAlso Not File.Exists(FilePathList.First) Then
                 If Directory.Exists(FilePathList.First) AndAlso Not File.Exists(FilePathList.First) Then
                     Hint("请拖入一个文件,而非文件夹!", HintType.Critical)
                     Hint("请拖入一个文件,而非文件夹!", HintType.Critical)
@@ -1108,28 +1118,18 @@ Install:
             Case PageType.VersionSetup
             Case PageType.VersionSetup
                 Return "版本设置 - " & If(PageVersionLeft.Version Is Nothing, "未知版本", PageVersionLeft.Version.Name)
                 Return "版本设置 - " & If(PageVersionLeft.Version Is Nothing, "未知版本", PageVersionLeft.Version.Name)
             Case PageType.CompDetail
             Case PageType.CompDetail
-                If Stack.Additional Is Nothing Then
-                    Log("[Control] 资源工程详情页面未提供关键项", LogLevel.Feedback)
-                    Return "未知页面"
-                Else
-                    Dim Project As CompProject = Stack.Additional
-                    Select Case Project.Type
-                        Case CompType.Mod
-                            Return "Mod 下载 - " & Project.TranslatedName
-                        Case CompType.ModPack
-                            Return "整合包下载 - " & Project.TranslatedName
-                        Case Else 'CompType.ResourcePack
-                            Return "资源包下载 - " & Project.TranslatedName
-                    End Select
-                End If
+                Dim Project As CompProject = Stack.Additional(0)
+                Select Case Project.Type
+                    Case CompType.Mod
+                        Return "Mod 下载 - " & Project.TranslatedName
+                    Case CompType.ModPack
+                        Return "整合包下载 - " & Project.TranslatedName
+                    Case Else 'CompType.ResourcePack
+                        Return "资源包下载 - " & Project.TranslatedName
+                End Select
             Case PageType.HelpDetail
             Case PageType.HelpDetail
-                If Stack.Additional Is Nothing Then
-                    Log("[Control] 帮助详情页面未提供关键项", LogLevel.Msgbox)
-                    Return "未知页面"
-                Else
-                    Dim Entry As HelpEntry = Stack.Additional(0)
-                    Return Entry.Title
-                End If
+                Dim Entry As HelpEntry = Stack.Additional(0)
+                Return Entry.Title
             Case Else
             Case Else
                 Return ""
                 Return ""
         End Select
         End Select

+ 16 - 10
Plain Craft Launcher 2/Modules/Base/ModBase.vb

@@ -1,8 +1,8 @@
 Imports System.IO.Compression
 Imports System.IO.Compression
-Imports System.Management
 Imports System.Runtime.CompilerServices
 Imports System.Runtime.CompilerServices
 Imports System.Security.Cryptography
 Imports System.Security.Cryptography
 Imports System.Security.Principal
 Imports System.Security.Principal
+Imports System.Text.RegularExpressions
 Imports System.Windows.Markup
 Imports System.Windows.Markup
 Imports Newtonsoft.Json
 Imports Newtonsoft.Json
 
 
@@ -11,12 +11,12 @@ Public Module ModBase
 #Region "声明"
 #Region "声明"
 
 
     '下列版本信息由更新器自动修改
     '下列版本信息由更新器自动修改
-    Public Const VersionBaseName As String = "2.6.8" '不含分支前缀的显示用版本名
-    Public Const VersionStandardCode As String = "2.6.8." & VersionBranchCode '标准格式的四段式版本号
+    Public Const VersionBaseName As String = "2.6.9" '不含分支前缀的显示用版本名
+    Public Const VersionStandardCode As String = "2.6.9." & VersionBranchCode '标准格式的四段式版本号
 #If BETA Then
 #If BETA Then
     Public Const VersionCode As Integer = 304 'Release
     Public Const VersionCode As Integer = 304 'Release
 #Else
 #Else
-    Public Const VersionCode As Integer = 305 'Snapshot
+    Public Const VersionCode As Integer = 306 'Snapshot
 #End If
 #End If
     '自动生成的版本信息
     '自动生成的版本信息
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
@@ -1581,12 +1581,12 @@ Re:
     ''' <summary>
     ''' <summary>
     ''' 搜索字符串中的所有正则匹配项。
     ''' 搜索字符串中的所有正则匹配项。
     ''' </summary>
     ''' </summary>
-    Public Function RegexSearch(str As String, regex As String, Optional options As RegularExpressions.RegexOptions = RegularExpressions.RegexOptions.None) As List(Of String)
+    Public Function RegexSearch(str As String, regex As String, Optional options As RegexOptions = RegularExpressions.RegexOptions.None) As List(Of String)
         Try
         Try
             RegexSearch = New List(Of String)
             RegexSearch = New List(Of String)
-            Dim RegexSearchRes = New RegularExpressions.Regex(regex, options).Matches(str)
+            Dim RegexSearchRes = New Regex(regex, options).Matches(str)
             If RegexSearchRes Is Nothing Then Return RegexSearch
             If RegexSearchRes Is Nothing Then Return RegexSearch
-            For Each item As RegularExpressions.Match In RegexSearchRes
+            For Each item As Match In RegexSearchRes
                 RegexSearch.Add(item.Value)
                 RegexSearch.Add(item.Value)
             Next
             Next
         Catch ex As Exception
         Catch ex As Exception
@@ -1597,7 +1597,7 @@ Re:
     ''' <summary>
     ''' <summary>
     ''' 获取字符串中的第一个正则匹配项,若无匹配则返回 Nothing。
     ''' 获取字符串中的第一个正则匹配项,若无匹配则返回 Nothing。
     ''' </summary>
     ''' </summary>
-    Public Function RegexSeek(str As String, regex As String, Optional options As RegularExpressions.RegexOptions = RegularExpressions.RegexOptions.None) As String
+    Public Function RegexSeek(str As String, regex As String, Optional options As RegexOptions = RegularExpressions.RegexOptions.None) As String
         Try
         Try
             Dim Result = RegularExpressions.Regex.Match(str, regex, options).Value
             Dim Result = RegularExpressions.Regex.Match(str, regex, options).Value
             Return If(Result = "", Nothing, Result)
             Return If(Result = "", Nothing, Result)
@@ -1609,7 +1609,7 @@ Re:
     ''' <summary>
     ''' <summary>
     ''' 检查字符串是否匹配某正则模式。
     ''' 检查字符串是否匹配某正则模式。
     ''' </summary>
     ''' </summary>
-    Public Function RegexCheck(str As String, regex As String, Optional options As RegularExpressions.RegexOptions = RegularExpressions.RegexOptions.None) As Boolean
+    Public Function RegexCheck(str As String, regex As String, Optional options As RegexOptions = RegularExpressions.RegexOptions.None) As Boolean
         Try
         Try
             Return RegularExpressions.Regex.IsMatch(str, regex, options)
             Return RegularExpressions.Regex.IsMatch(str, regex, options)
         Catch ex As Exception
         Catch ex As Exception
@@ -1620,7 +1620,13 @@ Re:
     ''' <summary>
     ''' <summary>
     ''' 进行正则替换,会抛出错误。
     ''' 进行正则替换,会抛出错误。
     ''' </summary>
     ''' </summary>
-    Public Function RegexReplace(Input As String, Replacement As String, Regex As String, Optional options As RegularExpressions.RegexOptions = RegularExpressions.RegexOptions.None) As String
+    Public Function RegexReplace(Input As String, Replacement As String, Regex As String, Optional options As RegexOptions = RegularExpressions.RegexOptions.None) As String
+        Return RegularExpressions.Regex.Replace(Input, Regex, Replacement, options)
+    End Function
+    ''' <summary>
+    ''' 对每个正则匹配分别进行替换,会抛出错误。
+    ''' </summary>
+    Public Function RegexReplaceEach(Input As String, Replacement As MatchEvaluator, Regex As String, Optional options As RegexOptions = RegularExpressions.RegexOptions.None) As String
         Return RegularExpressions.Regex.Replace(Input, Regex, Replacement, options)
         Return RegularExpressions.Regex.Replace(Input, Regex, Replacement, options)
     End Function
     End Function
 
 

+ 5 - 13
Plain Craft Launcher 2/Modules/Base/ModNet.vb

@@ -330,7 +330,7 @@ Retry:
     ''' <summary>
     ''' <summary>
     ''' 同时发送多个网络请求并要求返回内容。
     ''' 同时发送多个网络请求并要求返回内容。
     ''' </summary>
     ''' </summary>
-    Public Function NetRequestMuity(Url As String, Method As String, Data As Object, ContentType As String, Optional RequestCount As Integer = 4, Optional Headers As Dictionary(Of String, String) = Nothing)
+    Public Function NetRequestMulty(Url As String, Method As String, Data As Object, ContentType As String, Optional RequestCount As Integer = 4, Optional Headers As Dictionary(Of String, String) = Nothing)
         Dim Threads As New List(Of Thread)
         Dim Threads As New List(Of Thread)
         Dim RequestResult = Nothing
         Dim RequestResult = Nothing
         Dim RequestEx As Exception = Nothing
         Dim RequestEx As Exception = Nothing
@@ -1278,14 +1278,6 @@ Wrong:
             Try
             Try
 Retry:
 Retry:
                 SyncLock LockChain
                 SyncLock LockChain
-                    ''大小检测
-                    'If DownloadDone <> FileSize AndAlso Not IsUnknownSize Then
-                    '    For Each Th As NetThread In Threads
-                    '        Log("[Download] " & "File size detail: ")
-                    '        Log("[Download] " & Th.Uuid & "#, State " & GetStringFromEnum(CType(Th.State, [Enum])) & ", Range " & Th.DownloadStart & "~" & (Th.DownloadStart + Th.DownloadDone) & ", Left " & Th.DownloadUndone)
-                    '    Next
-                    '    Throw New Exception("文件大小应为 " & FileSize & " B,实际下载为 " & DownloadDone & " B。")
-                    'End If
                     If ModeDebug Then Log("[Download] " & LocalName & ":正在合并文件")
                     If ModeDebug Then Log("[Download] " & LocalName & ":正在合并文件")
                     '创建文件夹
                     '创建文件夹
                     If File.Exists(LocalPath) Then File.Delete(LocalPath)
                     If File.Exists(LocalPath) Then File.Delete(LocalPath)
@@ -1299,7 +1291,7 @@ Retry:
                         AddWriter.Write(SmailFileCache.ToArray)
                         AddWriter.Write(SmailFileCache.ToArray)
                         AddWriter.Dispose() : AddWriter = Nothing
                         AddWriter.Dispose() : AddWriter = Nothing
                         MergeFile.Dispose() : MergeFile = Nothing
                         MergeFile.Dispose() : MergeFile = Nothing
-                    ElseIf Threads.DownloadDone = DownloadDone Then
+                    ElseIf Threads.DownloadDone = DownloadDone AndAlso Threads.Temp IsNot Nothing Then
                         '仅有一个文件,直接复制
                         '仅有一个文件,直接复制
                         CopyFile(Threads.Temp, LocalPath)
                         CopyFile(Threads.Temp, LocalPath)
                     Else
                     Else
@@ -1307,7 +1299,7 @@ Retry:
                         MergeFile = New FileStream(LocalPath, FileMode.Create)
                         MergeFile = New FileStream(LocalPath, FileMode.Create)
                         AddWriter = New BinaryWriter(MergeFile)
                         AddWriter = New BinaryWriter(MergeFile)
                         For Each Thread As NetThread In Threads
                         For Each Thread As NetThread In Threads
-                            If Thread.DownloadDone = 0 Then Continue For
+                            If Thread.DownloadDone = 0 OrElse Thread.Temp Is Nothing Then Continue For
                             Using fs As New FileStream(Thread.Temp, FileMode.Open, FileAccess.Read, FileShare.Read)
                             Using fs As New FileStream(Thread.Temp, FileMode.Open, FileAccess.Read, FileShare.Read)
                                 Dim TempReader As New BinaryReader(fs)
                                 Dim TempReader As New BinaryReader(fs)
                                 AddWriter.Write(TempReader.ReadBytes(fs.Length))
                                 AddWriter.Write(TempReader.ReadBytes(fs.Length))
@@ -1328,9 +1320,9 @@ Retry:
                     '检查文件
                     '检查文件
                     Dim CheckResult As String = Check?.Check(LocalPath)
                     Dim CheckResult As String = Check?.Check(LocalPath)
                     If CheckResult IsNot Nothing Then
                     If CheckResult IsNot Nothing Then
-                        Log("[Download] " & "File size detail of " & Uuid & "# :")
+                        Log("[Download] " & Uuid & "# 的下载线程细节:")
                         For Each Th As NetThread In Threads
                         For Each Th As NetThread In Threads
-                            Log("[Download] " & Th.Uuid & "#, State " & GetStringFromEnum(CType(Th.State, [Enum])) & ", Range " & Th.DownloadStart & "~" & (Th.DownloadStart + Th.DownloadDone) & ", Left " & Th.DownloadUndone)
+                            Log("[Download] " & Th.Uuid & "#,状态 " & GetStringFromEnum(CType(Th.State, [Enum])) & ",字节范围 " & Th.DownloadStart & "~" & (Th.DownloadStart + Th.DownloadDone) & ",字节剩余 " & Th.DownloadUndone)
                         Next
                         Next
                         Throw New Exception(CheckResult)
                         Throw New Exception(CheckResult)
                     End If
                     End If

+ 3 - 9
Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb

@@ -385,7 +385,7 @@
         ''' <summary>
         ''' <summary>
         ''' 将当前工程信息实例化为控件。
         ''' 将当前工程信息实例化为控件。
         ''' </summary>
         ''' </summary>
-        Public Function ToCompItem(ShowMcVersionDesc As Boolean, ShowLoaderDesc As Boolean, Optional OnClick As MyCompItem.ClickEventHandler = Nothing) As MyCompItem
+        Public Function ToCompItem(ShowMcVersionDesc As Boolean, ShowLoaderDesc As Boolean) As MyCompItem
             '获取版本描述
             '获取版本描述
             Dim GameVersionDescription As String
             Dim GameVersionDescription As String
             If GameVersions Is Nothing OrElse GameVersions.Count = 0 Then
             If GameVersions Is Nothing OrElse GameVersions.Count = 0 Then
@@ -567,12 +567,6 @@ NoExName:
             Else
             Else
                 NewItem.Logo = LogoUrl
                 NewItem.Logo = LogoUrl
             End If
             End If
-            If OnClick IsNot Nothing Then
-                AddHandler NewItem.Click, OnClick
-                NewItem.HasAnimation = True
-            Else
-                NewItem.HasAnimation = False
-            End If
             Return NewItem
             Return NewItem
         End Function
         End Function
 
 
@@ -1377,7 +1371,7 @@ Retry:
     ''' <summary>
     ''' <summary>
     ''' 预载包含大量 CompFile 的卡片,添加必要的元素和前置 Mod 列表。
     ''' 预载包含大量 CompFile 的卡片,添加必要的元素和前置 Mod 列表。
     ''' </summary>
     ''' </summary>
-    Public Sub CompFilesCardPreload(Stack As StackPanel, Files As List(Of CompFile), OnClick As MyListItem.ClickEventHandler)
+    Public Sub CompFilesCardPreload(Stack As StackPanel, Files As List(Of CompFile))
         '获取卡片对应的前置 ID
         '获取卡片对应的前置 ID
         '如果为整合包就不会有 Dependencies 信息,所以不用管
         '如果为整合包就不会有 Dependencies 信息,所以不用管
         Dim Deps As List(Of String) = Files.SelectMany(Function(f) f.Dependencies).Distinct.ToList()
         Dim Deps As List(Of String) = Files.SelectMany(Function(f) f.Dependencies).Distinct.ToList()
@@ -1391,7 +1385,7 @@ Retry:
         Stack.Children.Add(New TextBlock With {.Text = "前置 Mod", .FontSize = 14, .HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(6, 2, 0, 5)})
         Stack.Children.Add(New TextBlock With {.Text = "前置 Mod", .FontSize = 14, .HorizontalAlignment = HorizontalAlignment.Left, .Margin = New Thickness(6, 2, 0, 5)})
         '添加前置 Mod 列表
         '添加前置 Mod 列表
         For Each Dep In Deps
         For Each Dep In Deps
-            Dim Item = CompProjectCache(Dep).ToCompItem(False, False, AddressOf FrmDownloadMod.ProjectClick)
+            Dim Item = CompProjectCache(Dep).ToCompItem(False, False)
             Stack.Children.Add(Item)
             Stack.Children.Add(Item)
         Next
         Next
         '添加结尾间隔
         '添加结尾间隔

+ 2 - 4
Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb

@@ -385,6 +385,7 @@
     ''' </summary>
     ''' </summary>
     Public Sub Analyze(Optional Version As McVersion = Nothing)
     Public Sub Analyze(Optional Version As McVersion = Nothing)
         Log("[Crash] 步骤 3:分析崩溃原因")
         Log("[Crash] 步骤 3:分析崩溃原因")
+        LogAll = (If(LogMc, "") & If(LogMcDebug, "") & If(LogHs, "") & If(LogCrash, ""))
 
 
         '1. 精准日志匹配,中/高优先级
         '1. 精准日志匹配,中/高优先级
         AnalyzeCrit1()
         AnalyzeCrit1()
@@ -393,7 +394,6 @@
         If CrashReasons.Count > 0 Then GoTo Done
         If CrashReasons.Count > 0 Then GoTo Done
 
 
         '2. 堆栈分析
         '2. 堆栈分析
-        LogAll = (If(LogMc, "") & If(LogMcDebug, "") & If(LogHs, "") & If(LogCrash, ""))
         If LogAll.Contains("orge") OrElse LogAll.Contains("abric") OrElse LogAll.Contains("uilt") OrElse LogAll.Contains("iteloader") Then
         If LogAll.Contains("orge") OrElse LogAll.Contains("abric") OrElse LogAll.Contains("uilt") OrElse LogAll.Contains("iteloader") Then
             Dim Keywords As New List(Of String)
             Dim Keywords As New List(Of String)
             '崩溃日志
             '崩溃日志
@@ -868,9 +868,7 @@ NextStack:
             If IsHandAnalyze Then
             If IsHandAnalyze Then
                 Return "很抱歉,PCL 无法确定错误原因。"
                 Return "很抱歉,PCL 无法确定错误原因。"
             Else
             Else
-                Return "很抱歉,你的游戏出现了一些问题……" & vbCrLf &
-                       "如果要寻求帮助,请向他人发送错误报告文件,而不是发送这个窗口的截图。" & vbCrLf &
-                       "你也可以查看错误报告,其中可能会有出错的原因。"
+                Return $"很抱歉,你的游戏出现了一些问题……{vbCrLf}如果要寻求帮助,请导出错误报告并发给他人,而不是发送这个窗口的截图。"
             End If
             End If
         End If
         End If
 
 

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

@@ -19,14 +19,7 @@
         Dim Checker As New FileChecker(MinSize:=1024, ActualSize:=If(Version.JsonObject("downloads")("client")("size"), -1), Hash:=Version.JsonObject("downloads")("client")("sha1"))
         Dim Checker As New FileChecker(MinSize:=1024, ActualSize:=If(Version.JsonObject("downloads")("client")("size"), -1), Hash:=Version.JsonObject("downloads")("client")("sha1"))
         If ReturnNothingOnFileUseable Then
         If ReturnNothingOnFileUseable Then
             '是否跳过
             '是否跳过
-            Dim IsSetupSkip As Boolean = Setup.Get("LaunchAdvanceAssets")
-            Select Case Setup.Get("VersionAdvanceAssets", Version:=Version)
-                Case 0 '使用全局设置
-                Case 1 '开启
-                    IsSetupSkip = False
-                Case 2 '关闭
-                    IsSetupSkip = True
-            End Select
+            Dim IsSetupSkip As Boolean = ShouldIgnoreFileCheck(Version)
             If IsSetupSkip AndAlso File.Exists(Version.Path & Version.Name & ".jar") Then Return Nothing '跳过校验
             If IsSetupSkip AndAlso File.Exists(Version.Path & Version.Name & ".jar") Then Return Nothing '跳过校验
             If Checker.Check(Version.Path & Version.Name & ".jar") Is Nothing Then Return Nothing '通过校验
             If Checker.Check(Version.Path & Version.Name & ".jar") Is Nothing Then Return Nothing '通过校验
         End If
         End If
@@ -72,17 +65,7 @@
 #End Region
 #End Region
 
 
 #Region "下载资源文件"
 #Region "下载资源文件"
-        Dim IsSetupSkip As Boolean = Setup.Get("LaunchAdvanceAssets")
-        Select Case Setup.Get("VersionAdvanceAssets", Version:=Version)
-            Case 0
-                '使用全局设置
-            Case 1
-                '开启
-                IsSetupSkip = False
-            Case 2
-                '关闭
-                IsSetupSkip = True
-        End Select
+        Dim IsSetupSkip As Boolean = ShouldIgnoreFileCheck(Version)
         If IsSetupSkip Then Log("[Download] 已跳过 Assets 下载")
         If IsSetupSkip Then Log("[Download] 已跳过 Assets 下载")
         If (Not SkipAssetsDownloadWhileSetupRequired) OrElse Not IsSetupSkip Then
         If (Not SkipAssetsDownloadWhileSetupRequired) OrElse Not IsSetupSkip Then
             Dim LoadersAssets As New List(Of LoaderBase)
             Dim LoadersAssets As New List(Of LoaderBase)

+ 3 - 2
Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb

@@ -326,9 +326,9 @@ RetryGet:
                 Requirement = "需要 Java " & If(Left = Right, Left, Left & " ~ " & Right)
                 Requirement = "需要 Java " & If(Left = Right, Left, Left & " ~ " & Right)
             End If
             End If
             Dim JavaCurrent As String = UserJava.VersionCode & If(ShowRevision, "." & UserJava.Version.MajorRevision & "." & UserJava.Version.MinorRevision, "")
             Dim JavaCurrent As String = UserJava.VersionCode & If(ShowRevision, "." & UserJava.Version.MajorRevision & "." & UserJava.Version.MinorRevision, "")
-            If Setup.Get("LaunchAdvanceJava") Then
+            If Setup.Get("LaunchAdvanceJava") OrElse (RelatedVersion IsNot Nothing AndAlso Setup.Get("VersionAdvanceJava", RelatedVersion)) Then
                 '直接跳过弹窗
                 '直接跳过弹窗
-                Hint("设置中指定了使用 Java " & JavaCurrent & ",但当前版本" & Requirement & ",这可能会导致游戏崩溃!", HintType.Critical)
+                Log("[Java] 设置中指定了使用 Java " & JavaCurrent & ",但当前版本" & Requirement & ",这可能会导致游戏崩溃!", LogLevel.Debug)
                 AllowedJavaList = New List(Of JavaEntry) From {UserJava}
                 AllowedJavaList = New List(Of JavaEntry) From {UserJava}
             Else
             Else
                 Select Case MyMsgBox("你在设置中手动指定了使用 Java " & JavaCurrent & ",但当前" & Requirement & "。" & vbCrLf &
                 Select Case MyMsgBox("你在设置中手动指定了使用 Java " & JavaCurrent & ",但当前" & Requirement & "。" & vbCrLf &
@@ -677,6 +677,7 @@ Wait:
                         SearchEntry.Contains("mod") OrElse SearchEntry.Contains("高清") OrElse SearchEntry.Contains("download") 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("launch") OrElse SearchEntry.Contains("程序") OrElse SearchEntry.Contains("path") OrElse
                         SearchEntry.Contains("version") OrElse SearchEntry.Contains("baka") OrElse SearchEntry.Contains("pcl") 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("local") OrElse SearchEntry.Contains("packages") OrElse SearchEntry.Contains("4297127d64ec6") OrElse '官启文件夹
                         SearchEntry.Contains("国服") OrElse SearchEntry.Contains("网易") OrElse SearchEntry.Contains("ext") OrElse '网易 Java 文件夹名
                         SearchEntry.Contains("国服") OrElse SearchEntry.Contains("网易") OrElse SearchEntry.Contains("ext") OrElse '网易 Java 文件夹名
                         SearchEntry.Contains("netease") OrElse SearchEntry.Contains("1.") OrElse SearchEntry.Contains("启动") Then
                         SearchEntry.Contains("netease") OrElse SearchEntry.Contains("1.") OrElse SearchEntry.Contains("启动") Then

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

@@ -881,7 +881,7 @@ SystemBrowser:
         End If
         End If
         Dim Result As String
         Dim Result As String
         Try
         Try
-            Result = NetRequestMuity("https://login.live.com/oauth20_token.srf", "POST", Request, "application/x-www-form-urlencoded", 1)
+            Result = NetRequestMulty("https://login.live.com/oauth20_token.srf", "POST", Request, "application/x-www-form-urlencoded", 1)
         Catch ex As Exception
         Catch ex As Exception
             If ex.Message.Contains("must sign in again") OrElse ex.Message.Contains("invalid_grant") Then '#269
             If ex.Message.Contains("must sign in again") OrElse ex.Message.Contains("invalid_grant") Then '#269
                 Return {"Relogin", ""}
                 Return {"Relogin", ""}
@@ -908,7 +908,7 @@ SystemBrowser:
                                     ""RelyingParty"": ""http://auth.xboxlive.com"",
                                     ""RelyingParty"": ""http://auth.xboxlive.com"",
                                     ""TokenType"": ""JWT""
                                     ""TokenType"": ""JWT""
                                  }"
                                  }"
-        Dim Result As String = NetRequestMuity("https://user.auth.xboxlive.com/user/authenticate", "POST", Request, "application/json", 3)
+        Dim Result As String = NetRequestMulty("https://user.auth.xboxlive.com/user/authenticate", "POST", Request, "application/json", 3)
 
 
         Dim ResultJson As JObject = GetJson(Result)
         Dim ResultJson As JObject = GetJson(Result)
         Dim XBLToken As String = ResultJson("Token").ToString
         Dim XBLToken As String = ResultJson("Token").ToString
@@ -930,7 +930,7 @@ SystemBrowser:
                                  }"
                                  }"
         Dim Result As String
         Dim Result As String
         Try
         Try
-            Result = NetRequestMuity("https://xsts.auth.xboxlive.com/xsts/authorize", "POST", Request, "application/json", 3)
+            Result = NetRequestMulty("https://xsts.auth.xboxlive.com/xsts/authorize", "POST", Request, "application/json", 3)
         Catch ex As Net.WebException
         Catch ex As Net.WebException
             If ex.Message.Contains("2148916233") Then
             If ex.Message.Contains("2148916233") Then
                 If MyMsgBox("该微软账号尚未购买 Minecraft Java 版,或尚未注册 Xbox 账户。" & vbCrLf &
                 If MyMsgBox("该微软账号尚未购买 Minecraft Java 版,或尚未注册 Xbox 账户。" & vbCrLf &
@@ -967,7 +967,7 @@ SystemBrowser:
         Dim Request As String = "{""identityToken"": ""XBL3.0 x=" & Tokens(1) & ";" & Tokens(0) & """}"
         Dim Request As String = "{""identityToken"": ""XBL3.0 x=" & Tokens(1) & ";" & Tokens(0) & """}"
         Dim Result As String
         Dim Result As String
         Try
         Try
-            Result = NetRequestMuity("https://api.minecraftservices.com/authentication/login_with_xbox", "POST", Request, "application/json", 2)
+            Result = NetRequestMulty("https://api.minecraftservices.com/authentication/login_with_xbox", "POST", Request, "application/json", 2)
         Catch ex As Net.WebException
         Catch ex As Net.WebException
             Dim Message As String = GetExceptionSummary(ex)
             Dim Message As String = GetExceptionSummary(ex)
             If Message.Contains("(429)") Then
             If Message.Contains("(429)") Then
@@ -991,7 +991,7 @@ SystemBrowser:
 
 
         Dim Result As String
         Dim Result As String
         Try
         Try
-            Result = NetRequestMuity("https://api.minecraftservices.com/minecraft/profile", "GET", "", "application/json", 2, New Dictionary(Of String, String) From {{"Authorization", "Bearer " & AccessToken}})
+            Result = NetRequestMulty("https://api.minecraftservices.com/minecraft/profile", "GET", "", "application/json", 2, New Dictionary(Of String, String) From {{"Authorization", "Bearer " & AccessToken}})
         Catch ex As Net.WebException
         Catch ex As Net.WebException
             Dim Message As String = GetExceptionSummary(ex)
             Dim Message As String = GetExceptionSummary(ex)
             If Message.Contains("(429)") Then
             If Message.Contains("(429)") Then

+ 10 - 10
Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb

@@ -570,7 +570,7 @@ Recheck:
         ''' </summary>
         ''' </summary>
         Public ReadOnly Property IsOldJson As Boolean
         Public ReadOnly Property IsOldJson As Boolean
             Get
             Get
-                Return JsonObject("minecraftArguments") IsNot Nothing
+                Return JsonObject("minecraftArguments") IsNot Nothing AndAlso JsonObject("minecraftArguments") <> ""
             End Get
             End Get
         End Property
         End Property
         ''' <summary>
         ''' <summary>
@@ -713,7 +713,7 @@ Recheck:
 ExitDataLoad:
 ExitDataLoad:
                 '确定版本图标
                 '确定版本图标
                 Logo = ReadIni(Path & "PCL\Setup.ini", "Logo", "")
                 Logo = ReadIni(Path & "PCL\Setup.ini", "Logo", "")
-                If Logo = "" OrElse ReadIni(Path & "PCL\Setup.ini", "LogoCustom", "False") = "False" Then
+                If Logo = "" OrElse Not CType(ReadIni(Path & "PCL\Setup.ini", "LogoCustom", False), Boolean) Then
                     Select Case State
                     Select Case State
                         Case McVersionState.Original
                         Case McVersionState.Original
                             Logo = "pack://application:,,,/images/Blocks/Grass.png"
                             Logo = "pack://application:,,,/images/Blocks/Grass.png"
@@ -1878,14 +1878,7 @@ NextVersion:
         If CoreJarOnly Then Return Result
         If CoreJarOnly Then Return Result
 
 
         '是否跳过校验
         '是否跳过校验
-        Dim IsSetupSkip As Boolean = Setup.Get("LaunchAdvanceAssets")
-        Select Case Setup.Get("VersionAdvanceAssets", Version:=Version)
-            Case 0 '使用全局设置
-            Case 1 '开启校验
-                IsSetupSkip = False
-            Case 2 '关闭校验
-                IsSetupSkip = True
-        End Select
+        Dim IsSetupSkip As Boolean = ShouldIgnoreFileCheck(Version)
 
 
         'Library 文件
         'Library 文件
         Result.AddRange(McLibFixFromLibToken(McLibListGet(Version, False), JumpLoaderFolder:=Version.PathIndie & ".jumploader\", AllowUnsameFile:=IsSetupSkip))
         Result.AddRange(McLibFixFromLibToken(McLibListGet(Version, False), JumpLoaderFolder:=Version.PathIndie & ".jumploader\", AllowUnsameFile:=IsSetupSkip))
@@ -2014,6 +2007,13 @@ NextVersion:
         End If
         End If
     End Function
     End Function
 
 
+    ''' <summary>
+    ''' 检查设置,是否应当忽略文件检查?
+    ''' </summary>
+    Public Function ShouldIgnoreFileCheck(Version As McVersion)
+        Return Setup.Get("LaunchAdvanceAssets") OrElse Setup.Get("VersionAdvanceAssetsV2", Version:=Version) OrElse (Setup.Get("VersionAdvanceAssets", Version:=Version) = 2)
+    End Function
+
 #End Region
 #End Region
 
 
 #Region "资源文件(Assets)"
 #Region "资源文件(Assets)"

+ 14 - 10
Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb

@@ -411,16 +411,20 @@ Public Module ModMod
                         ElseIf RawValue.StartsWith("'''") Then
                         ElseIf RawValue.StartsWith("'''") Then
                             '多行字符串
                             '多行字符串
                             Dim ValueLines As New List(Of String) From {RawValue.TrimStart("'")}
                             Dim ValueLines As New List(Of String) From {RawValue.TrimStart("'")}
-                            Do Until i >= Lines.Count - 1
-                                i += 1
-                                Dim ValueLine As String = Lines(i)
-                                If ValueLine.EndsWith("'''") Then
-                                    ValueLines.Add(ValueLine.TrimEnd("'"))
-                                    Exit Do
-                                Else
-                                    ValueLines.Add(ValueLine)
-                                End If
-                            Loop
+                            If ValueLines(0).EndsWith("'''") Then '把多行字符串按单行写法写的错误处理(#2732)
+                                ValueLines(0) = ValueLines(0).TrimEnd("'")
+                            Else
+                                Do Until i >= Lines.Count - 1
+                                    i += 1
+                                    Dim ValueLine As String = Lines(i)
+                                    If ValueLine.EndsWith("'''") Then
+                                        ValueLines.Add(ValueLine.TrimEnd("'"))
+                                        Exit Do
+                                    Else
+                                        ValueLines.Add(ValueLine)
+                                    End If
+                                Loop
+                            End If
                             Value = Join(ValueLines, vbLf).Trim(vbLf).Replace(vbLf, vbCrLf)
                             Value = Join(ValueLines, vbLf).Trim(vbLf).Replace(vbLf, vbCrLf)
                         ElseIf RawValue.ToLower = "true" OrElse RawValue.ToLower = "false" Then
                         ElseIf RawValue.ToLower = "true" OrElse RawValue.ToLower = "false" Then
                             '布尔型
                             '布尔型

+ 65 - 18
Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb

@@ -16,13 +16,13 @@ Public Module ModModpack
     ''' </summary>
     ''' </summary>
     Public Function ModpackInstall(File As String, Optional VersionName As String = Nothing, Optional ShowHint As Boolean = True, Optional Logo As String = Nothing) As Boolean
     Public Function ModpackInstall(File As String, Optional VersionName As String = Nothing, Optional ShowHint As Boolean = True, Optional Logo As String = Nothing) As Boolean
         Log("[ModPack] 整合包安装请求:" & If(File, "null"))
         Log("[ModPack] 整合包安装请求:" & If(File, "null"))
-        Dim Archive As Compression.ZipArchive = Nothing
+        Dim Archive As ZipArchive = Nothing
         Dim ArchiveBaseFolder As String = ""
         Dim ArchiveBaseFolder As String = ""
         Try
         Try
             '获取整合包种类与关键 Json
             '获取整合包种类与关键 Json
             Dim PackType As Integer = -1
             Dim PackType As Integer = -1
             Try
             Try
-                Archive = New Compression.ZipArchive(New FileStream(File, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
+                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("mcbbs.packmeta") IsNot Nothing Then PackType = 3 : Exit Try 'MCBBS 整合包(优先于 manifest.json 判断)
                 If Archive.GetEntry("modrinth.index.json") IsNot Nothing Then PackType = 4 : Exit Try 'Modrinth 整合包
                 If Archive.GetEntry("modrinth.index.json") IsNot Nothing Then PackType = 4 : Exit Try 'Modrinth 整合包
@@ -234,30 +234,39 @@ Retry:
             .ProgressWeight = New FileInfo(FileAddress).Length / 1024 / 1024 / 6, .Block = False}) '每 6M 需要 1s
             .ProgressWeight = New FileInfo(FileAddress).Length / 1024 / 1024 / 6, .Block = False}) '每 6M 需要 1s
         End If
         End If
         '获取 Mod 列表
         '获取 Mod 列表
-        Dim ModFileList As New List(Of Integer)
+        Dim ModList As New List(Of Integer)
+        Dim ModOptionalList As New List(Of Integer)
         For Each ModEntry In If(Json("files"), {})
         For Each ModEntry In If(Json("files"), {})
             If ModEntry("projectID") Is Nothing OrElse ModEntry("fileID") Is Nothing Then
             If ModEntry("projectID") Is Nothing OrElse ModEntry("fileID") Is Nothing Then
                 Hint("某项 Mod 缺少必要信息,已跳过:" & ModEntry.ToString)
                 Hint("某项 Mod 缺少必要信息,已跳过:" & ModEntry.ToString)
                 Continue For
                 Continue For
             End If
             End If
-            If ModEntry("required") IsNot Nothing AndAlso Not ModEntry("required").ToObject(Of Boolean) Then Continue For
-            ModFileList.Add(ModEntry("fileID"))
+            ModList.Add(ModEntry("fileID"))
+            If ModEntry("required") IsNot Nothing AndAlso Not ModEntry("required").ToObject(Of Boolean) Then ModOptionalList.Add(ModEntry("fileID"))
         Next
         Next
-        If ModFileList.Count > 0 Then
+        If ModList.Count > 0 Then
             '获取 Mod 下载信息
             '获取 Mod 下载信息
             InstallLoaders.Add(New LoaderTask(Of Integer, JArray)("获取 Mod 下载信息",
             InstallLoaders.Add(New LoaderTask(Of Integer, JArray)("获取 Mod 下载信息",
             Sub(Task As LoaderTask(Of Integer, JArray))
             Sub(Task As LoaderTask(Of Integer, JArray))
-                Task.Output = GetJson(NetRequestRetry("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(ModFileList, ",") & "]}", "application/json"))("data")
+                Task.Output = GetJson(NetRequestRetry("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(ModList, ",") & "]}", "application/json"))("data")
                 '如果文件已被删除,则 API 会跳过那一项
                 '如果文件已被删除,则 API 会跳过那一项
-                If ModFileList.Count > Task.Output.Count Then Throw New Exception("整合包所需要的部分 Mod 版本已被 Mod 作者删除,因此无法完成整合包安装,请联系整合包作者更新整合包中的 Mod 版本")
-            End Sub) With {.ProgressWeight = ModFileList.Count / 10}) '每 10 Mod 需要 1s
+                If ModList.Count > Task.Output.Count Then Throw New Exception("整合包所需要的部分 Mod 版本已被 Mod 作者删除,因此无法完成整合包安装,请联系整合包作者更新整合包中的 Mod 版本")
+            End Sub) With {.ProgressWeight = ModList.Count / 10}) '每 10 Mod 需要 1s
             '构造 NetFile
             '构造 NetFile
             InstallLoaders.Add(New LoaderTask(Of JArray, List(Of NetFile))("构造 Mod 下载信息",
             InstallLoaders.Add(New LoaderTask(Of JArray, List(Of NetFile))("构造 Mod 下载信息",
             Sub(Task As LoaderTask(Of JArray, List(Of NetFile)))
             Sub(Task As LoaderTask(Of JArray, List(Of NetFile)))
                 Dim FileList As New Dictionary(Of Integer, NetFile)
                 Dim FileList As New Dictionary(Of Integer, NetFile)
                 For Each ModJson In Task.Input
                 For Each ModJson In Task.Input
+                    Dim Id As Integer = ModJson("id").ToObject(Of Integer)
                     '跳过重复的 Mod(疑似 CurseForge Bug)
                     '跳过重复的 Mod(疑似 CurseForge Bug)
-                    If FileList.ContainsKey(ModJson("id").ToObject(Of Integer)) Then Continue For
+                    If FileList.ContainsKey(Id) Then Continue For
+                    '可选 Mod 提示
+                    If ModOptionalList.Contains(Id) Then
+                        If MyMsgBox("是否要下载整合包中的可选文件 " & ModJson("displayName").ToString & "?",
+                                        "下载可选文件", "是", "否") = 2 Then
+                            Continue For
+                        End If
+                    End If
                     '建立 CompFile
                     '建立 CompFile
                     Dim File As New CompFile(ModJson, CompType.Mod)
                     Dim File As New CompFile(ModJson, CompType.Mod)
                     If Not File.Available Then Continue For
                     If Not File.Available Then Continue For
@@ -273,14 +282,13 @@ Retry:
                         IsResourcePack = False
                         IsResourcePack = False
                     End If
                     End If
                     '实际的添加
                     '实际的添加
-                    FileList.Add(ModJson("id"),
-                                 File.ToNetFile($"{PathMcFolder}versions\{VersionName}\{If(IsResourcePack, "resourcepacks", "mods")}\"))
-                    Task.Progress += 1 / (1 + ModFileList.Count)
+                    FileList.Add(Id, File.ToNetFile($"{PathMcFolder}versions\{VersionName}\{If(IsResourcePack, "resourcepacks", "mods")}\"))
+                    Task.Progress += 1 / (1 + ModList.Count)
                 Next
                 Next
                 Task.Output = FileList.Values.ToList
                 Task.Output = FileList.Values.ToList
-            End Sub) With {.ProgressWeight = ModFileList.Count / 200, .Show = False}) '每 200 Mod 需要 1s
+            End Sub) With {.ProgressWeight = ModList.Count / 200, .Show = False}) '每 200 Mod 需要 1s
             '下载 Mod 文件
             '下载 Mod 文件
-            InstallLoaders.Add(New LoaderDownload("下载 Mod", New List(Of NetFile)) With {.ProgressWeight = ModFileList.Count * 1.5}) '每个 Mod 需要 1.5s
+            InstallLoaders.Add(New LoaderDownload("下载 Mod", New List(Of NetFile)) With {.ProgressWeight = ModList.Count * 1.5}) '每个 Mod 需要 1.5s
         End If
         End If
 
 
         '构造加载器
         '构造加载器
@@ -618,8 +626,9 @@ Retry:
         If Validate.Validate(PackName) <> "" Then PackName = ""
         If Validate.Validate(PackName) <> "" Then PackName = ""
         Dim VersionName As String = MyMsgBoxInput("输入版本名称", "", PackName, New ObjectModel.Collection(Of Validate) From {Validate})
         Dim VersionName As String = MyMsgBoxInput("输入版本名称", "", PackName, New ObjectModel.Collection(Of Validate) From {Validate})
         If VersionName Is Nothing Then Exit Sub
         If VersionName Is Nothing Then Exit Sub
-        '解压与配置文件
-        Dim InstallTemp As String = PathTemp & "PackInstall\" & RandomInteger(0, 100000) & "\"
+        '解压、配置设置文件
+        Dim InstallTemp As String = $"{PathTemp}PackInstall\{RandomInteger(0, 100000)}\"
+        Dim SetupFile As String = $"{PathMcFolder}versions\{VersionName}\PCL\Setup.ini"
         Dim InstallLoaders As New List(Of LoaderBase)
         Dim InstallLoaders As New List(Of LoaderBase)
         InstallLoaders.Add(New LoaderTask(Of String, Integer)("解压整合包文件",
         InstallLoaders.Add(New LoaderTask(Of String, Integer)("解压整合包文件",
         Sub(Task As LoaderTask(Of String, Integer))
         Sub(Task As LoaderTask(Of String, Integer))
@@ -633,7 +642,45 @@ Retry:
             End If
             End If
             Task.Progress = 0.9
             Task.Progress = 0.9
             '开启版本隔离
             '开启版本隔离
-            WriteIni(PathMcFolder & "versions\" & VersionName & "\PCL\Setup.ini", "VersionArgumentIndie", 1)
+            WriteIni(SetupFile, "VersionArgumentIndie", 1)
+            '读取 MMC 设置文件(#2655)
+            Try
+                Dim MMCSetupFile As String = InstallTemp & ArchiveBaseFolder & "instance.cfg"
+                If File.Exists(MMCSetupFile) Then
+                    '将其中的等号替换为冒号,以符合 ini 文件格式
+                    WriteFile(MMCSetupFile, ReadFile(MMCSetupFile).Replace("=", ":"))
+                    If ReadIni(MMCSetupFile, "OverrideCommands", False) Then
+                        Dim PreLaunchCommand As String = ReadIni(MMCSetupFile, "PreLaunchCommand")
+                        If PreLaunchCommand <> "" Then
+                            PreLaunchCommand = PreLaunchCommand.Replace("\""", """").
+                                Replace("$INST_JAVA", "{java}javaw.exe").
+                                Replace("$INST_MC_DIR\", "{minecraft}").Replace("$INST_MC_DIR", "{minecraft}").
+                                Replace("$INST_DIR\", "{verpath}").Replace("$INST_DIR", "{verpath}").
+                                Replace("$INST_ID", "{name}").Replace("$INST_NAME", "{name}")
+                            WriteIni(SetupFile, "VersionAdvanceRun", PreLaunchCommand)
+                            Log("[ModPack] 迁移 MultiMC 版本独立设置:启动前执行命令:" & PreLaunchCommand)
+                        End If
+                    End If
+                    If ReadIni(MMCSetupFile, "JoinServerOnLaunch", False) Then
+                        Dim ServerAddress As String = ReadIni(MMCSetupFile, "JoinServerOnLaunchAddress").Replace("\""", """")
+                        WriteIni(SetupFile, "VersionServerEnter", ServerAddress)
+                        Log("[ModPack] 迁移 MultiMC 版本独立设置:自动进入服务器:" & ServerAddress)
+                    End If
+                    If ReadIni(MMCSetupFile, "IgnoreJavaCompatibility", False) Then
+                        WriteIni(SetupFile, "VersionAdvanceJava", True)
+                        Log("[ModPack] 迁移 MultiMC 版本独立设置:忽略 Java 兼容性警告")
+                    End If
+                    Dim Logo As String = ReadIni(MMCSetupFile, "iconKey", "")
+                    If Logo <> "" AndAlso File.Exists($"{InstallTemp}{ArchiveBaseFolder}{Logo}.png") Then
+                        WriteIni(SetupFile, "LogoCustom", True)
+                        WriteIni(SetupFile, "Logo", "PCL\Logo.png")
+                        CopyFile($"{InstallTemp}{ArchiveBaseFolder}{Logo}.png", $"{PathMcFolder}versions\{VersionName}\PCL\Logo.png")
+                        Log($"[ModPack] 迁移 MultiMC 版本独立设置:版本图标({Logo}.png)")
+                    End If
+                End If
+            Catch ex As Exception
+                Log(ex, $"读取 MMC 配置文件失败({InstallTemp}{ArchiveBaseFolder}instance.cfg)")
+            End Try
         End Sub) With {.ProgressWeight = New FileInfo(FileAddress).Length / 1024 / 1024 / 6, .Block = False}) '每 6M 需要 1s
         End Sub) With {.ProgressWeight = New FileInfo(FileAddress).Length / 1024 / 1024 / 6, .Block = False}) '每 6M 需要 1s
         '构造版本安装请求
         '构造版本安装请求
         If PackJson("components") Is Nothing Then
         If PackJson("components") Is Nothing Then

+ 12 - 0
Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb

@@ -94,6 +94,18 @@ RetryStart:
             Log("[Control] 按下资源工程列表项:" & LabTitle.Text)
             Log("[Control] 按下资源工程列表项:" & LabTitle.Text)
         End If
         End If
     End Sub
     End Sub
+    Private Sub ProjectClick(sender As MyCompItem, e As EventArgs) Handles Me.Click
+        '记录当前展开的卡片标题(#2712)
+        Dim Titles As New List(Of String)
+        If FrmMain.PageCurrent.Page = FormMain.PageType.CompDetail Then
+            For Each Card As MyCard In FrmDownloadCompDetail.PanMain.Children
+                If Card.Title <> "" AndAlso Not Card.IsSwaped Then Titles.Add(Card.Title)
+            Next
+            Log("[Comp] 记录当前已展开的卡片:" & String.Join("、", Titles))
+            FrmMain.PageCurrent.Additional(1) = Titles
+        End If
+        FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail, .Additional = {sender.Tag, New List(Of String)}})
+    End Sub
 
 
     '鼠标点击判定
     '鼠标点击判定
     Private IsMouseDown As Boolean = False
     Private IsMouseDown As Boolean = False

+ 2 - 2
Plain Craft Launcher 2/My Project/AssemblyInfo.vb

@@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices
 ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 ' 方法是按如下所示使用“*”
 ' 方法是按如下所示使用“*”
 
 
-<Assembly: AssemblyVersion("2.6.8.0")>
-<Assembly: AssemblyFileVersion("2.6.8.0")>
+<Assembly: AssemblyVersion("2.6.9.0")>
+<Assembly: AssemblyFileVersion("2.6.9.0")>
 <Assembly: NeutralResourcesLanguage("")>
 <Assembly: NeutralResourcesLanguage("")>

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

@@ -1988,9 +1988,9 @@ Retry:
         If Directory.Exists(TempMcFolder) Then DeleteDirectory(TempMcFolder)
         If Directory.Exists(TempMcFolder) Then DeleteDirectory(TempMcFolder)
         Dim OptiFineFolder As String = Nothing
         Dim OptiFineFolder As String = Nothing
         If Request.OptiFineVersion IsNot Nothing Then
         If Request.OptiFineVersion IsNot Nothing Then
-            If Request.OptiFineVersion.Contains("_HD_U") Then Request.OptiFineVersion = "HD_U_" & Request.OptiFineVersion.Split("_HD_U").Last '#735
+            If Request.OptiFineVersion.Contains("_HD_U_") Then Request.OptiFineVersion = "HD_U_" & Request.OptiFineVersion.Split("_HD_U_").Last '#735
             Request.OptiFineEntry = New DlOptiFineListEntry With {
             Request.OptiFineEntry = New DlOptiFineListEntry With {
-                .NameDisplay = Request.MinecraftName & " " & Request.OptiFineVersion.Replace("HD_U_", "").Replace("_", ""),
+                .NameDisplay = Request.MinecraftName & " " & Request.OptiFineVersion.Replace("HD_U_", "").Replace("_", "").Replace("pre", " pre"),
                 .Inherit = Request.MinecraftName,
                 .Inherit = Request.MinecraftName,
                 .IsPreview = Request.OptiFineVersion.ToLower.Contains("pre"),
                 .IsPreview = Request.OptiFineVersion.ToLower.Contains("pre"),
                 .NameVersion = Request.MinecraftName & "-OptiFine_" & Request.OptiFineVersion,
                 .NameVersion = Request.MinecraftName & "-OptiFine_" & Request.OptiFineVersion,
@@ -2214,7 +2214,7 @@ Retry:
             OutputJson.Merge(FabricJson)
             OutputJson.Merge(FabricJson)
         End If
         End If
         '修改
         '修改
-        If RealArguments IsNot Nothing Then OutputJson("minecraftArguments") = RealArguments
+        If RealArguments IsNot Nothing AndAlso RealArguments.Replace(" ", "") <> "" Then OutputJson("minecraftArguments") = RealArguments
         OutputJson.Remove("_comment_")
         OutputJson.Remove("_comment_")
         OutputJson.Remove("inheritsFrom")
         OutputJson.Remove("inheritsFrom")
         OutputJson.Remove("jar")
         OutputJson.Remove("jar")

+ 6 - 4
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb

@@ -9,7 +9,7 @@
 
 
     '初始化加载器信息
     '初始化加载器信息
     Private Sub PageDownloadCompDetail_Inited(sender As Object, e As EventArgs) Handles Me.Initialized
     Private Sub PageDownloadCompDetail_Inited(sender As Object, e As EventArgs) Handles Me.Initialized
-        Project = FrmMain.PageCurrent.Additional
+        Project = FrmMain.PageCurrent.Additional(0)
         PageLoaderInit(Load, PanLoad, PanMain, CardIntro, CompFileLoader, AddressOf Load_OnFinish)
         PageLoaderInit(Load, PanLoad, PanMain, CardIntro, CompFileLoader, AddressOf Load_OnFinish)
     End Sub
     End Sub
     '自动重试
     '自动重试
@@ -40,7 +40,7 @@
     End Class
     End Class
     Private Sub Load_OnFinish()
     Private Sub Load_OnFinish()
         '获取目标版本与 Mod 加载器
         '获取目标版本与 Mod 加载器
-        Dim TargetVersion As String = ""
+        Dim TargetVersion As String
         Select Case Project.Type
         Select Case Project.Type
             Case CompType.Mod
             Case CompType.Mod
                 TargetVersion = If(PageDownloadMod.Loader.Input.GameVersion, "")
                 TargetVersion = If(PageDownloadMod.Loader.Input.GameVersion, "")
@@ -102,7 +102,7 @@
                 NewCard.SwapControl = NewStack
                 NewCard.SwapControl = NewStack
                 PanMain.Children.Add(NewCard)
                 PanMain.Children.Add(NewCard)
                 '确定卡片是否展开
                 '确定卡片是否展开
-                If Pair.Key = TargetCardName Then
+                If Pair.Key = TargetCardName OrElse CType(FrmMain.PageCurrent.Additional(1), List(Of String)).Contains(NewCard.Title) Then
                     MyCard.StackInstall(NewStack, If(Project.Type = CompType.ModPack, 9, 8), Pair.Key) 'FUTURE: Res
                     MyCard.StackInstall(NewStack, If(Project.Type = CompType.ModPack, 9, 8), Pair.Key) 'FUTURE: Res
                 Else
                 Else
                     NewCard.IsSwaped = True
                     NewCard.IsSwaped = True
@@ -128,7 +128,7 @@
     Private IsFirstInit As Boolean = True
     Private IsFirstInit As Boolean = True
     Public Sub Init() Handles Me.PageEnter
     Public Sub Init() Handles Me.PageEnter
         AniControlEnabled += 1
         AniControlEnabled += 1
-        Project = FrmMain.PageCurrent.Additional
+        Project = FrmMain.PageCurrent.Additional(0)
         PanBack.ScrollToHome()
         PanBack.ScrollToHome()
 
 
         '重启加载器
         '重启加载器
@@ -142,6 +142,8 @@
         '放置当前工程
         '放置当前工程
         If CompItem IsNot Nothing Then PanIntro.Children.Remove(CompItem)
         If CompItem IsNot Nothing Then PanIntro.Children.Remove(CompItem)
         CompItem = Project.ToCompItem(True, True)
         CompItem = Project.ToCompItem(True, True)
+        CompItem.IsHitTestVisible = False
+        CompItem.HasAnimation = False
         CompItem.Margin = New Thickness(-7, -7, 0, 8)
         CompItem.Margin = New Thickness(-7, -7, 0, 8)
         PanIntro.Children.Insert(0, CompItem)
         PanIntro.Children.Insert(0, CompItem)
 
 

+ 1 - 0
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml

@@ -33,6 +33,7 @@
                         <TextBlock VerticalAlignment="Center" Grid.Row="2" HorizontalAlignment="Left" Text="版本" Margin="0,0,18,0" />
                         <TextBlock VerticalAlignment="Center" Grid.Row="2" HorizontalAlignment="Left" Text="版本" Margin="0,0,18,0" />
                         <local:MyComboBox x:Name="TextSearchVersion" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" IsEditable="True" MaxDropDownHeight="320">
                         <local:MyComboBox x:Name="TextSearchVersion" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" IsEditable="True" MaxDropDownHeight="320">
                             <local:MyComboBoxItem Content="全部 (也可自行输入)" IsSelected="True" />
                             <local:MyComboBoxItem Content="全部 (也可自行输入)" IsSelected="True" />
+                            <local:MyComboBoxItem Content="1.20.2" />
                             <local:MyComboBoxItem Content="1.20.1" />
                             <local:MyComboBoxItem Content="1.20.1" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.19.4" />
                             <local:MyComboBoxItem Content="1.19.4" />

+ 1 - 9
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml.vb

@@ -32,9 +32,7 @@
             '列表项
             '列表项
             PanProjects.Children.Clear()
             PanProjects.Children.Clear()
             For i = Math.Min(Page * PageSize, Storage.Results.Count - 1) To Math.Min((Page + 1) * PageSize - 1, Storage.Results.Count - 1)
             For i = Math.Min(Page * PageSize, Storage.Results.Count - 1) To Math.Min((Page + 1) * PageSize - 1, Storage.Results.Count - 1)
-                PanProjects.Children.Add(
-                    Storage.Results(i).ToCompItem(Loader.Input.GameVersion Is Nothing,
-                                                  Loader.Input.ModLoader = CompModLoaderType.Any, AddressOf ProjectClick))
+                PanProjects.Children.Add(Storage.Results(i).ToCompItem(Loader.Input.GameVersion Is Nothing, Loader.Input.ModLoader = CompModLoaderType.Any))
             Next
             Next
             '页码
             '页码
             CardPages.Visibility = If(Storage.Results.Count > 40 OrElse
             CardPages.Visibility = If(Storage.Results.Count > 40 OrElse
@@ -68,12 +66,6 @@
         End Select
         End Select
     End Sub
     End Sub
 
 
-    '进入详情页面
-
-    Public Sub ProjectClick(sender As MyCompItem, e As EventArgs)
-        FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail, .Additional = sender.Tag})
-    End Sub
-
     '切换页码
     '切换页码
 
 
     Private Sub BtnPageFirst_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageFirst.Click
     Private Sub BtnPageFirst_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageFirst.Click

+ 1 - 0
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml

@@ -32,6 +32,7 @@
                         <TextBlock VerticalAlignment="Center" Grid.Row="2" HorizontalAlignment="Left" Text="版本" Margin="0,0,18,0" />
                         <TextBlock VerticalAlignment="Center" Grid.Row="2" HorizontalAlignment="Left" Text="版本" Margin="0,0,18,0" />
                         <local:MyComboBox x:Name="TextSearchVersion" Grid.Row="2" Grid.Column="1" IsEditable="True" MaxDropDownHeight="320">
                         <local:MyComboBox x:Name="TextSearchVersion" Grid.Row="2" Grid.Column="1" IsEditable="True" MaxDropDownHeight="320">
                             <local:MyComboBoxItem Content="全部 (也可自行输入)" IsSelected="True" />
                             <local:MyComboBoxItem Content="全部 (也可自行输入)" IsSelected="True" />
+                            <local:MyComboBoxItem Content="1.20.2" />
                             <local:MyComboBoxItem Content="1.20.1" />
                             <local:MyComboBoxItem Content="1.20.1" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.19.4" />
                             <local:MyComboBoxItem Content="1.19.4" />

+ 1 - 8
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml.vb

@@ -31,8 +31,7 @@
             '列表项
             '列表项
             PanProjects.Children.Clear()
             PanProjects.Children.Clear()
             For i = Math.Min(Page * PageSize, Storage.Results.Count - 1) To Math.Min((Page + 1) * PageSize - 1, Storage.Results.Count - 1)
             For i = Math.Min(Page * PageSize, Storage.Results.Count - 1) To Math.Min((Page + 1) * PageSize - 1, Storage.Results.Count - 1)
-                PanProjects.Children.Add(
-                    Storage.Results(i).ToCompItem(Loader.Input.GameVersion Is Nothing, True, AddressOf ProjectClick))
+                PanProjects.Children.Add(Storage.Results(i).ToCompItem(Loader.Input.GameVersion Is Nothing, True))
             Next
             Next
             '页码
             '页码
             CardPages.Visibility = If(Storage.Results.Count > 40 OrElse
             CardPages.Visibility = If(Storage.Results.Count > 40 OrElse
@@ -66,12 +65,6 @@
         End Select
         End Select
     End Sub
     End Sub
 
 
-    '进入详情页面
-
-    Public Sub ProjectClick(sender As MyCompItem, e As EventArgs)
-        FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail, .Additional = sender.Tag})
-    End Sub
-
     '切换页码
     '切换页码
 
 
     Private Sub BtnPageFirst_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageFirst.Click
     Private Sub BtnPageFirst_Click(sender As Object, e As RoutedEventArgs) Handles BtnPageFirst.Click

+ 40 - 43
Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb

@@ -79,7 +79,45 @@
     ''' 切换至启动中页面。
     ''' 切换至启动中页面。
     ''' </summary>
     ''' </summary>
     Public Sub PageChangeToLaunching()
     Public Sub PageChangeToLaunching()
-        LaunchingPreload()
+        '修改登陆方式
+        Select Case Setup.Get("LoginType")
+            Case McLoginType.Legacy
+                If PageLinkHiper.HiperState = LoadState.Finished Then
+                    LabLaunchingMethod.Text = "联机离线登录"
+                Else
+                    LabLaunchingMethod.Text = "离线登录"
+                End If
+            Case McLoginType.Ms
+                LabLaunchingMethod.Text = "正版登录"
+            Case McLoginType.Nide
+                LabLaunchingMethod.Text = "统一通行证"
+            Case McLoginType.Auth
+                LabLaunchingMethod.Text = "Authlib-Injector"
+        End Select
+        '初始化页面
+        LabLaunchingName.Text = McVersionCurrent.Name
+        LabLaunchingStage.Text = "初始化"
+        LabLaunchingTitle.Text = If(McLaunchLoader.Input Is Nothing OrElse McLaunchLoader.Input.SaveBatch Is Nothing, "正在启动游戏", "正在导出启动脚本")
+        LabLaunchingProgress.Text = "0.00 %"
+        LabLaunchingProgress.Opacity = 1
+        LabLaunchingDownload.Visibility = Visibility.Visible
+        LabLaunchingProgressLeft.Opacity = 0.6
+        LabLaunchingDownload.Visibility = Visibility.Visible
+        LabLaunchingDownload.Text = "0 B/s"
+        LabLaunchingDownload.Opacity = 0
+        LabLaunchingDownload.Visibility = Visibility.Collapsed
+        LabLaunchingDownloadLeft.Opacity = 0
+        LabLaunchingDownloadLeft.Visibility = Visibility.Collapsed
+        ProgressLaunchingFinished.Width = New GridLength(0, GridUnitType.Star)
+        ProgressLaunchingUnfinished.Width = New GridLength(1, GridUnitType.Star)
+        PanLaunchingHint.Opacity = 0
+        PanLaunchingHint.Visibility = Visibility.Collapsed
+        PanLaunchingInfo.Width = Double.NaN '重置宽度改变动画
+        McLaunchProcess = Nothing
+        McLaunchWatcher = Nothing
+        '获取 “你知道吗” 提示
+        LabLaunchingHint.Text = PageOtherTest.GetRandomHint()
+        '初始化其他页面
         PanInput.IsHitTestVisible = False
         PanInput.IsHitTestVisible = False
         PanLaunching.IsHitTestVisible = False
         PanLaunching.IsHitTestVisible = False
         LoadLaunching.State.LoadingState = MyLoading.MyLoadingState.Run
         LoadLaunching.State.LoadingState = MyLoading.MyLoadingState.Run
@@ -634,48 +672,6 @@ ExitRefresh:
         PageVersionLeft.Version = McVersionCurrent
         PageVersionLeft.Version = McVersionCurrent
         FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
         FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
     End Sub
     End Sub
-    '刷新 UI
-    Public Sub LaunchingPreload()
-        '修改登陆方式
-        Select Case Setup.Get("LoginType")
-            Case McLoginType.Legacy
-                If PageLinkHiper.HiperState = LoadState.Finished Then
-                    LabLaunchingMethod.Text = "联机离线登录"
-                Else
-                    LabLaunchingMethod.Text = "离线登录"
-                End If
-            Case McLoginType.Ms
-                LabLaunchingMethod.Text = "正版登录"
-            Case McLoginType.Nide
-                LabLaunchingMethod.Text = "统一通行证"
-            Case McLoginType.Auth
-                LabLaunchingMethod.Text = "Authlib-Injector"
-        End Select
-        '初始化页面
-        LabLaunchingName.Text = McVersionCurrent.Name
-        LabLaunchingStage.Text = "初始化"
-        LabLaunchingTitle.Text = If(McLaunchLoader.Input Is Nothing OrElse McLaunchLoader.Input.SaveBatch Is Nothing, "正在启动游戏", "正在导出启动脚本")
-        LabLaunchingProgress.Text = "0.00 %"
-        LabLaunchingProgress.Opacity = 1
-        LabLaunchingDownload.Visibility = Visibility.Visible
-        LabLaunchingProgressLeft.Opacity = 0.6
-        LabLaunchingDownload.Visibility = Visibility.Visible
-        LabLaunchingDownload.Text = "0 B/s"
-        LabLaunchingDownload.Opacity = 0
-        LabLaunchingDownload.Visibility = Visibility.Collapsed
-        LabLaunchingDownloadLeft.Opacity = 0
-        LabLaunchingDownloadLeft.Visibility = Visibility.Collapsed
-        ProgressLaunchingFinished.Width = New GridLength(0, GridUnitType.Star)
-        ProgressLaunchingUnfinished.Width = New GridLength(1, GridUnitType.Star)
-        PanLaunchingHint.Opacity = 0
-        PanLaunchingHint.Visibility = Visibility.Collapsed
-        PanLaunchingInfo.Width = Double.NaN '重置宽度改变动画
-        McLaunchProcess = Nothing
-        McLaunchWatcher = Nothing
-        '获取 “你知道吗” 提示
-        LabLaunchingHint.Text = PageOtherTest.GetRandomHint()
-    End Sub
-    Private ShowProgress As Double = 0
     ''' <summary>
     ''' <summary>
     ''' 每 0.2s 执行一次,刷新启动的数据 UI 显示。
     ''' 每 0.2s 执行一次,刷新启动的数据 UI 显示。
     ''' </summary>
     ''' </summary>
@@ -759,6 +755,7 @@ ExitRefresh:
             Log(ex, "刷新启动信息失败", LogLevel.Feedback)
             Log(ex, "刷新启动信息失败", LogLevel.Feedback)
         End Try
         End Try
     End Sub
     End Sub
+    Private ShowProgress As Double = 0
     '尺寸改变动画
     '尺寸改变动画
     Private IsWidthAnimating As Boolean = False
     Private IsWidthAnimating As Boolean = False
     Private ActualUsedWidth As Double
     Private ActualUsedWidth As Double

+ 6 - 2
Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb

@@ -84,9 +84,13 @@ Download:
                                     EventType=""刷新主页"" EventData=""/""
                                     EventType=""刷新主页"" EventData=""/""
                                     Logo=""M875.52 148.48C783.36 56.32 655.36 0 512 0 291.84 0 107.52 138.24 30.72 332.8l122.88 46.08C204.8 230.4 348.16 128 512 128c107.52 0 199.68 40.96 271.36 112.64L640 384h384V0L875.52 148.48zM512 896c-107.52 0-199.68-40.96-271.36-112.64L384 640H0v384l148.48-148.48C240.64 967.68 368.64 1024 512 1024c220.16 0 404.48-138.24 481.28-332.8L870.4 645.12C819.2 793.6 675.84 896 512 896z"" />
                                     Logo=""M875.52 148.48C783.36 56.32 655.36 0 512 0 291.84 0 107.52 138.24 30.72 332.8l122.88 46.08C204.8 230.4 348.16 128 512 128c107.52 0 199.68 40.96 271.36 112.64L640 384h384V0L875.52 148.48zM512 896c-107.52 0-199.68-40.96-271.36-112.64L384 640H0v384l148.48-148.48C240.64 967.68 368.64 1024 512 1024c220.16 0 404.48-138.24 481.28-332.8L870.4 645.12C819.2 793.6 675.84 896 512 896z"" />
                             </local:MyCard>"
                             </local:MyCard>"
-                    Case 2 '新闻主页
+                    Case 2 '新闻
                         Log("[Page] 主页预设:Minecraft 新闻")
                         Log("[Page] 主页预设:Minecraft 新闻")
-                        Url = "http://pcl2.mc-news.top"
+                        Url = "http://pcl.mcnews.thestack.top"
+                        GoTo Download
+                    Case 3 '简单主页
+                        Log("[Page] 主页预设:简单主页")
+                        Url = "https://cdn.wearclub.online/PCL/Custom.xaml"
                         GoTo Download
                         GoTo Download
                 End Select
                 End Select
         End Select
         End Select

+ 2 - 3
Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb

@@ -103,9 +103,8 @@
     End Sub
     End Sub
     '账号迁移入口
     '账号迁移入口
     Private Sub BtnMigration_Click(sender As Object, e As EventArgs) Handles BtnMigration.Click
     Private Sub BtnMigration_Click(sender As Object, e As EventArgs) Handles BtnMigration.Click
-        MyMsgBox("目前,你可以继续迁移你的账户,但其所属Minecraft游戏信息均已清空。" & vbCrLf & "在迁移过程中,你可能需要设置你的档案信息,此时请注意让年龄大于 18 岁,否则可能导致无法登录!", 
-                 "迁移提示", "继续", ForceWait:=True)
-        OpenWebsite("https://www.minecraft.net/zh-hans/account-security")
+        MyMsgBox($"请在接下来要打开的页面登录你的 Mojang 账号。{vbCrLf}在迁移时,你可能需要设置档案信息,请注意让年龄大于 18 岁,否则可能会导致无法登录!", "迁移提示", "继续", ForceWait:=True)
+        OpenWebsite("https://www.minecraft.net/zh-hans/login")
     End Sub
     End Sub
 
 
 End Class
 End Class

+ 2 - 2
Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml

@@ -240,9 +240,9 @@
                                       Text="等待命令执行完成后再继续启动" Margin="0,8,0,7" />
                                       Text="等待命令执行完成后再继续启动" Margin="0,8,0,7" />
                     <StackPanel Margin="0,12,0,4" Orientation="Horizontal" Grid.Row="6" Grid.ColumnSpan="2">
                     <StackPanel Margin="0,12,0,4" Orientation="Horizontal" Grid.Row="6" Grid.ColumnSpan="2">
                         <local:MyCheckBox Text="忽略 Java 兼容性警告" x:Name="CheckAdvanceJava" Tag="LaunchAdvanceJava" Margin="0,0,60,0"
                         <local:MyCheckBox Text="忽略 Java 兼容性警告" x:Name="CheckAdvanceJava" Tag="LaunchAdvanceJava" Margin="0,0,60,0"
-                                        ToolTip="如果在设置中手动选择了与当前版本不兼容的 Java,则自动跳过兼容性警告弹窗,强制使用手动选择的 Java。" />
+                                        ToolTip="警告:强烈推荐在版本设置中关闭特定版本的警告,而不是在这里关闭所有版本的警告!&#xa;如果在设置中手动选择了与当前版本不兼容的 Java,则自动跳过兼容性警告弹窗,强制使用手动选择的 Java。" />
                         <local:MyCheckBox Text="关闭文件校验" x:Name="CheckAdvanceAssets" Tag="LaunchAdvanceAssets"
                         <local:MyCheckBox Text="关闭文件校验" x:Name="CheckAdvanceAssets" Tag="LaunchAdvanceAssets"
-                                        ToolTip="完全不更改 assets;不校验 libraries、第三方登录库与版本主 jar 文件是否被修改。&#xa;如果你没有修改相关文件,请勿勾选此项。&#xa;强烈推荐在版本设置中关闭特定版本的校验,而不是在这里关闭所有版本的校验。" />
+                                        ToolTip="警告:强烈推荐在版本设置中关闭特定版本的校验,而不是在这里关闭所有版本的校验!&#xa;完全不更改 assets;不校验 libraries、第三方登录库与版本主 jar 文件是否被修改。&#xa;如果你没有修改相关文件,请勿勾选此项。" />
                     </StackPanel>
                     </StackPanel>
                 </Grid>
                 </Grid>
             </local:MyCard>
             </local:MyCard>

+ 0 - 5
Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb

@@ -75,11 +75,6 @@
             Dim NewCard As New MyCard With {.Title = McModGetTitle(List), .Margin = New Thickness(0, 0, 0, 15)}
             Dim NewCard As New MyCard With {.Title = McModGetTitle(List), .Margin = New Thickness(0, 0, 0, 15)}
             NewCard.Children.Add(PanItems)
             NewCard.Children.Add(PanItems)
             PanList.Children.Add(NewCard)
             PanList.Children.Add(NewCard)
-            '显示提示
-            If List.Count > 0 AndAlso Not Setup.Get("HintModDisable") Then
-                Setup.Set("HintModDisable", True)
-                Hint("直接点击某个 Mod 项即可将它禁用!")
-            End If
 
 
         Catch ex As Exception
         Catch ex As Exception
             Log(ex, "加载 Mod 列表 UI 失败", LogLevel.Feedback)
             Log(ex, "加载 Mod 列表 UI 失败", LogLevel.Feedback)

+ 10 - 13
Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml

@@ -188,29 +188,26 @@
                         <RowDefinition Height="9" />
                         <RowDefinition Height="9" />
                         <RowDefinition Height="28" />
                         <RowDefinition Height="28" />
                         <RowDefinition Height="9" />
                         <RowDefinition Height="9" />
-                        <RowDefinition Height="28" />
-                        <RowDefinition Height="9" />
                         <RowDefinition Height="31" />
                         <RowDefinition Height="31" />
                         <RowDefinition Height="Auto" />
                         <RowDefinition Height="Auto" />
+                        <RowDefinition Height="Auto" />
                     </Grid.RowDefinitions>
                     </Grid.RowDefinitions>
                     <TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="JVM 参数头" Margin="0,0,25,0" />
                     <TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="JVM 参数头" Margin="0,0,25,0" />
                     <local:MyTextBox x:Name="TextAdvanceJvm" Grid.Row="0" Grid.ColumnSpan="2" Tag="VersionAdvanceJvm" Grid.Column="1" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,在没有确定把握的情况下请不要尝试修改。&#xa;若留空,则使用全局设置的值。" HintText="使用全局设置"
                     <local:MyTextBox x:Name="TextAdvanceJvm" Grid.Row="0" Grid.ColumnSpan="2" Tag="VersionAdvanceJvm" Grid.Column="1" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,在没有确定把握的情况下请不要尝试修改。&#xa;若留空,则使用全局设置的值。" HintText="使用全局设置"
                                      Height="57" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" Padding="0,5" />
                                      Height="57" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" Padding="0,5" />
                     <TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="JVM 参数尾" Margin="0,0,25,0" />
                     <TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="JVM 参数尾" Margin="0,0,25,0" />
                     <local:MyTextBox x:Name="TextAdvanceGame" Grid.Row="2" Grid.ColumnSpan="2" Tag="VersionAdvanceGame" Grid.Column="1" ToolTip="文本框中的内容将会被直接拼合在启动参数的末尾。&#xa;例如输入 --demo 则会以试玩模式启动游戏。&#xa;若留空,则使用全局设置的值。" HintText="使用全局设置" />
                     <local:MyTextBox x:Name="TextAdvanceGame" Grid.Row="2" Grid.ColumnSpan="2" Tag="VersionAdvanceGame" Grid.Column="1" ToolTip="文本框中的内容将会被直接拼合在启动参数的末尾。&#xa;例如输入 --demo 则会以试玩模式启动游戏。&#xa;若留空,则使用全局设置的值。" HintText="使用全局设置" />
-                    <TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="文件校验" Margin="0,0,25,0" />
-                    <local:MyComboBox x:Name="ComboAdvanceAssets" Grid.Row="4" Grid.ColumnSpan="2" Tag="VersionAdvanceAssets" Grid.Column="1">
-                        <local:MyComboBoxItem Content="使用全局设置" IsSelected="True" />
-                        <local:MyComboBoxItem Content="开启" 
-                                              ToolTip="在启动 Minecraft 时,简单校验并下载缺失或错误的文件" ToolTipService.HorizontalOffset="100" />
-                        <local:MyComboBoxItem Content="关闭" 
-                                              ToolTip="完全不更改 assets;不校验 libraries、第三方登录库与版本主 jar 文件是否被修改。&#xa;如果你没有修改相关文件,请勿勾选此项。" ToolTipService.HorizontalOffset="100" />
-                    </local:MyComboBox>
-                    <TextBlock Grid.Row="6" VerticalAlignment="Center" HorizontalAlignment="Left" Text="启动前执行命令" Margin="0,0,25,3" />
-                    <local:MyTextBox x:Name="TextAdvanceRun" Grid.Row="6" Grid.ColumnSpan="2" Tag="VersionAdvanceRun" Grid.Column="1" HintText="" Margin="0,0,0,3"
+                    <TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="启动前执行命令" Margin="0,0,25,3" />
+                    <local:MyTextBox x:Name="TextAdvanceRun" Grid.Row="4" Grid.ColumnSpan="2" Tag="VersionAdvanceRun" Grid.Column="1" HintText="" Margin="0,0,0,3"
                                      ToolTip="该项不会覆盖全局设置:启动时会先执行全局设置的命令,再执行版本设置的命令。&#xa;&#xa;在 MC 启动前执行特定命令或程序,语法与 Windows 的命令提示符一致。&#xa;&#xa;可以使用以下替换标记实现相对路径(路径均以 \ 结尾):&#xa; · {path}:PCL 的 exe 文件所在的文件夹&#xa; · {minecraft}:.minecraft 文件夹&#xa; · {verpath}:版本文件夹(.minecraft\versions\版本名\)&#xa; · {verindie}:开启版本隔离时等同版本文件夹,未开启时等同 .minecraft 文件夹&#xa; · {java}:游戏运行时的 Java 文件夹&#xa;&#xa;除此之外,也支持以下替换标记:&#xa; · {user}:玩家名字&#xa; · {login}:玩家的登录方式&#xa; · {uuid}:玩家的 UUID&#xa; · {name}:游戏版本名&#xa; · {time}:当前的系统时间&#xa; · {version}:游戏对应的原版版本号&#xa;&#xa;例如:&#xa; · &quot;{verpath}test.exe&quot; :运行版本文件夹下的 test.exe 程序&#xa; · &quot;{java}java.exe&quot; -jar &quot;{verpath}test.jar&quot; :用 Java 运行版本文件夹下的 test.jar&#xa; · notepad &quot;{verindie}option.txt&quot; :使用记事本打开该版本的设置文件&#xa;&#xa;涉及路径的操作最好都打上双引号,以避免路径中的空格导致运行失败。" />
                                      ToolTip="该项不会覆盖全局设置:启动时会先执行全局设置的命令,再执行版本设置的命令。&#xa;&#xa;在 MC 启动前执行特定命令或程序,语法与 Windows 的命令提示符一致。&#xa;&#xa;可以使用以下替换标记实现相对路径(路径均以 \ 结尾):&#xa; · {path}:PCL 的 exe 文件所在的文件夹&#xa; · {minecraft}:.minecraft 文件夹&#xa; · {verpath}:版本文件夹(.minecraft\versions\版本名\)&#xa; · {verindie}:开启版本隔离时等同版本文件夹,未开启时等同 .minecraft 文件夹&#xa; · {java}:游戏运行时的 Java 文件夹&#xa;&#xa;除此之外,也支持以下替换标记:&#xa; · {user}:玩家名字&#xa; · {login}:玩家的登录方式&#xa; · {uuid}:玩家的 UUID&#xa; · {name}:游戏版本名&#xa; · {time}:当前的系统时间&#xa; · {version}:游戏对应的原版版本号&#xa;&#xa;例如:&#xa; · &quot;{verpath}test.exe&quot; :运行版本文件夹下的 test.exe 程序&#xa; · &quot;{java}java.exe&quot; -jar &quot;{verpath}test.jar&quot; :用 Java 运行版本文件夹下的 test.jar&#xa; · notepad &quot;{verindie}option.txt&quot; :使用记事本打开该版本的设置文件&#xa;&#xa;涉及路径的操作最好都打上双引号,以避免路径中的空格导致运行失败。" />
-                    <local:MyCheckBox Grid.Row="7" Grid.Column="1" x:Name="CheckAdvanceRunWait" Tag="VersionAdvanceRunWait" Visibility="Collapsed"
+                    <local:MyCheckBox Grid.Row="5" Grid.Column="1" x:Name="CheckAdvanceRunWait" Tag="VersionAdvanceRunWait" Visibility="Collapsed"
                                       Text="等待命令执行完成后再继续启动" Margin="0,5,0,0" />
                                       Text="等待命令执行完成后再继续启动" Margin="0,5,0,0" />
+                    <StackPanel Margin="0,10,0,0" Orientation="Horizontal" Grid.Row="6" Grid.ColumnSpan="2">
+                        <local:MyCheckBox Text="忽略 Java 兼容性警告" x:Name="CheckAdvanceJava" Tag="VersionAdvanceJava" Margin="0,0,60,0"
+                                        ToolTip="如果在设置中手动选择了与当前版本不兼容的 Java,则自动跳过兼容性警告弹窗,强制使用手动选择的 Java。" />
+                        <local:MyCheckBox Text="关闭文件校验" x:Name="CheckAdvanceAssetsV2" Tag="VersionAdvanceAssetsV2"
+                                        ToolTip="完全不更改 assets;不校验 libraries、第三方登录库与版本主 jar 文件是否被修改。&#xa;如果你没有修改相关文件,请勿勾选此项。" />
+                    </StackPanel>
                 </Grid>
                 </Grid>
             </local:MyCard>
             </local:MyCard>
         </StackPanel>
         </StackPanel>

+ 11 - 3
Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb

@@ -67,7 +67,13 @@
             TextAdvanceGame.Text = Setup.Get("VersionAdvanceGame", Version:=PageVersionLeft.Version)
             TextAdvanceGame.Text = Setup.Get("VersionAdvanceGame", Version:=PageVersionLeft.Version)
             TextAdvanceRun.Text = Setup.Get("VersionAdvanceRun", Version:=PageVersionLeft.Version)
             TextAdvanceRun.Text = Setup.Get("VersionAdvanceRun", Version:=PageVersionLeft.Version)
             CheckAdvanceRunWait.Checked = Setup.Get("VersionAdvanceRunWait", Version:=PageVersionLeft.Version)
             CheckAdvanceRunWait.Checked = Setup.Get("VersionAdvanceRunWait", Version:=PageVersionLeft.Version)
-            ComboAdvanceAssets.SelectedIndex = Setup.Get("VersionAdvanceAssets", Version:=PageVersionLeft.Version)
+            If Setup.Get("VersionAdvanceAssets", Version:=PageVersionLeft.Version) = 2 Then
+                Log("[Setup] 已迁移老版本的关闭文件校验设置")
+                Setup.Reset("VersionAdvanceAssets", Version:=PageVersionLeft.Version)
+                Setup.Set("VersionAdvanceAssetsV2", True, Version:=PageVersionLeft.Version)
+            End If
+            CheckAdvanceAssetsV2.Checked = Setup.Get("VersionAdvanceAssetsV2", Version:=PageVersionLeft.Version)
+            CheckAdvanceJava.Checked = Setup.Get("VersionAdvanceJava", Version:=PageVersionLeft.Version)
 
 
         Catch ex As Exception
         Catch ex As Exception
             Log(ex, "重载版本独立设置时出错", LogLevel.Feedback)
             Log(ex, "重载版本独立设置时出错", LogLevel.Feedback)
@@ -92,6 +98,8 @@
             Setup.Reset("VersionAdvanceJvm", Version:=PageVersionLeft.Version)
             Setup.Reset("VersionAdvanceJvm", Version:=PageVersionLeft.Version)
             Setup.Reset("VersionAdvanceGame", Version:=PageVersionLeft.Version)
             Setup.Reset("VersionAdvanceGame", Version:=PageVersionLeft.Version)
             Setup.Reset("VersionAdvanceAssets", Version:=PageVersionLeft.Version)
             Setup.Reset("VersionAdvanceAssets", Version:=PageVersionLeft.Version)
+            Setup.Reset("VersionAdvanceAssetsV2", Version:=PageVersionLeft.Version)
+            Setup.Reset("VersionAdvanceJava", Version:=PageVersionLeft.Version)
             Setup.Reset("VersionAdvanceRun", Version:=PageVersionLeft.Version)
             Setup.Reset("VersionAdvanceRun", Version:=PageVersionLeft.Version)
             Setup.Reset("VersionAdvanceRunWait", Version:=PageVersionLeft.Version)
             Setup.Reset("VersionAdvanceRunWait", Version:=PageVersionLeft.Version)
 
 
@@ -121,10 +129,10 @@
     Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderRamCustom.Change
     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)
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value, Version:=PageVersionLeft.Version)
     End Sub
     End Sub
-    Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndie.SelectionChanged, ComboAdvanceAssets.SelectionChanged
+    Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndie.SelectionChanged
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex, Version:=PageVersionLeft.Version)
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex, Version:=PageVersionLeft.Version)
     End Sub
     End Sub
-    Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceRunWait.Change
+    Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceRunWait.Change, CheckAdvanceAssetsV2.Change, CheckAdvanceJava.Change
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked, Version:=PageVersionLeft.Version)
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked, Version:=PageVersionLeft.Version)
     End Sub
     End Sub