龙腾猫跃 3 vuotta sitten
vanhempi
sitoutus
037e6b19b4
29 muutettua tiedostoa jossa 252 lisäystä ja 221 poistoa
  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
                 ForgeDownloadListItemPreload(Stack, Stack.Tag, AddressOf ForgeSave_Click, True)
             Case 8
-                CompFilesCardPreload(Stack, Stack.Tag, AddressOf FrmDownloadMod.ProjectClick)
+                CompFilesCardPreload(Stack, Stack.Tag)
         End Select
         '实现控件虚拟化
         For Each Data As Object In Stack.Tag

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

@@ -56,6 +56,8 @@
             RefreshColor()
         End Set
     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
                     Loop
                     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
             Else
                 LabText.Text = TextError

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

@@ -133,6 +133,11 @@ Public Class FormMain
         '3:BUG+ IMP* FEAT-
         '2:BUG* IMP-
         '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
             FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复开始或结束游戏时可能报错的 Bug"))
             FeatureCount += 20
@@ -840,7 +845,12 @@ Public Class FormMain
                 End Try
             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
                 If Directory.Exists(FilePathList.First) AndAlso Not File.Exists(FilePathList.First) Then
                     Hint("请拖入一个文件,而非文件夹!", HintType.Critical)
@@ -1108,28 +1118,18 @@ Install:
             Case PageType.VersionSetup
                 Return "版本设置 - " & If(PageVersionLeft.Version Is Nothing, "未知版本", PageVersionLeft.Version.Name)
             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
-                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
                 Return ""
         End Select

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

@@ -1,8 +1,8 @@
 Imports System.IO.Compression
-Imports System.Management
 Imports System.Runtime.CompilerServices
 Imports System.Security.Cryptography
 Imports System.Security.Principal
+Imports System.Text.RegularExpressions
 Imports System.Windows.Markup
 Imports Newtonsoft.Json
 
@@ -11,12 +11,12 @@ Public Module ModBase
 #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
     Public Const VersionCode As Integer = 304 'Release
 #Else
-    Public Const VersionCode As Integer = 305 'Snapshot
+    Public Const VersionCode As Integer = 306 'Snapshot
 #End If
     '自动生成的版本信息
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
@@ -1581,12 +1581,12 @@ Re:
     ''' <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
             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
-            For Each item As RegularExpressions.Match In RegexSearchRes
+            For Each item As Match In RegexSearchRes
                 RegexSearch.Add(item.Value)
             Next
         Catch ex As Exception
@@ -1597,7 +1597,7 @@ Re:
     ''' <summary>
     ''' 获取字符串中的第一个正则匹配项,若无匹配则返回 Nothing。
     ''' </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
             Dim Result = RegularExpressions.Regex.Match(str, regex, options).Value
             Return If(Result = "", Nothing, Result)
@@ -1609,7 +1609,7 @@ Re:
     ''' <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
             Return RegularExpressions.Regex.IsMatch(str, regex, options)
         Catch ex As Exception
@@ -1620,7 +1620,13 @@ Re:
     ''' <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)
     End Function
 

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

@@ -330,7 +330,7 @@ Retry:
     ''' <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 RequestResult = Nothing
         Dim RequestEx As Exception = Nothing
@@ -1278,14 +1278,6 @@ Wrong:
             Try
 Retry:
                 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 File.Exists(LocalPath) Then File.Delete(LocalPath)
@@ -1299,7 +1291,7 @@ Retry:
                         AddWriter.Write(SmailFileCache.ToArray)
                         AddWriter.Dispose() : AddWriter = Nothing
                         MergeFile.Dispose() : MergeFile = Nothing
-                    ElseIf Threads.DownloadDone = DownloadDone Then
+                    ElseIf Threads.DownloadDone = DownloadDone AndAlso Threads.Temp IsNot Nothing Then
                         '仅有一个文件,直接复制
                         CopyFile(Threads.Temp, LocalPath)
                     Else
@@ -1307,7 +1299,7 @@ Retry:
                         MergeFile = New FileStream(LocalPath, FileMode.Create)
                         AddWriter = New BinaryWriter(MergeFile)
                         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)
                                 Dim TempReader As New BinaryReader(fs)
                                 AddWriter.Write(TempReader.ReadBytes(fs.Length))
@@ -1328,9 +1320,9 @@ Retry:
                     '检查文件
                     Dim CheckResult As String = Check?.Check(LocalPath)
                     If CheckResult IsNot Nothing Then
-                        Log("[Download] " & "File size detail of " & Uuid & "# :")
+                        Log("[Download] " & Uuid & "# 的下载线程细节:")
                         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
                         Throw New Exception(CheckResult)
                     End If

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

@@ -385,7 +385,7 @@
         ''' <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
             If GameVersions Is Nothing OrElse GameVersions.Count = 0 Then
@@ -567,12 +567,6 @@ NoExName:
             Else
                 NewItem.Logo = LogoUrl
             End If
-            If OnClick IsNot Nothing Then
-                AddHandler NewItem.Click, OnClick
-                NewItem.HasAnimation = True
-            Else
-                NewItem.HasAnimation = False
-            End If
             Return NewItem
         End Function
 
@@ -1377,7 +1371,7 @@ Retry:
     ''' <summary>
     ''' 预载包含大量 CompFile 的卡片,添加必要的元素和前置 Mod 列表。
     ''' </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
         '如果为整合包就不会有 Dependencies 信息,所以不用管
         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)})
         '添加前置 Mod 列表
         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)
         Next
         '添加结尾间隔

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

@@ -385,6 +385,7 @@
     ''' </summary>
     Public Sub Analyze(Optional Version As McVersion = Nothing)
         Log("[Crash] 步骤 3:分析崩溃原因")
+        LogAll = (If(LogMc, "") & If(LogMcDebug, "") & If(LogHs, "") & If(LogCrash, ""))
 
         '1. 精准日志匹配,中/高优先级
         AnalyzeCrit1()
@@ -393,7 +394,6 @@
         If CrashReasons.Count > 0 Then GoTo Done
 
         '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
             Dim Keywords As New List(Of String)
             '崩溃日志
@@ -868,9 +868,7 @@ NextStack:
             If IsHandAnalyze Then
                 Return "很抱歉,PCL 无法确定错误原因。"
             Else
-                Return "很抱歉,你的游戏出现了一些问题……" & vbCrLf &
-                       "如果要寻求帮助,请向他人发送错误报告文件,而不是发送这个窗口的截图。" & vbCrLf &
-                       "你也可以查看错误报告,其中可能会有出错的原因。"
+                Return $"很抱歉,你的游戏出现了一些问题……{vbCrLf}如果要寻求帮助,请导出错误报告并发给他人,而不是发送这个窗口的截图。"
             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"))
         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 Checker.Check(Version.Path & Version.Name & ".jar") Is Nothing Then Return Nothing '通过校验
         End If
@@ -72,17 +65,7 @@
 #End 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 (Not SkipAssetsDownloadWhileSetupRequired) OrElse Not IsSetupSkip Then
             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)
             End If
             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}
             Else
                 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("launch") OrElse SearchEntry.Contains("程序") OrElse SearchEntry.Contains("path") OrElse
                         SearchEntry.Contains("version") OrElse SearchEntry.Contains("baka") OrElse SearchEntry.Contains("pcl") OrElse
+                        SearchEntry.Contains("zulu") OrElse
                         SearchEntry.Contains("local") OrElse SearchEntry.Contains("packages") OrElse SearchEntry.Contains("4297127d64ec6") OrElse '官启文件夹
                         SearchEntry.Contains("国服") OrElse SearchEntry.Contains("网易") OrElse SearchEntry.Contains("ext") OrElse '网易 Java 文件夹名
                         SearchEntry.Contains("netease") OrElse SearchEntry.Contains("1.") OrElse SearchEntry.Contains("启动") Then

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

@@ -881,7 +881,7 @@ SystemBrowser:
         End If
         Dim Result As String
         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
             If ex.Message.Contains("must sign in again") OrElse ex.Message.Contains("invalid_grant") Then '#269
                 Return {"Relogin", ""}
@@ -908,7 +908,7 @@ SystemBrowser:
                                     ""RelyingParty"": ""http://auth.xboxlive.com"",
                                     ""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 XBLToken As String = ResultJson("Token").ToString
@@ -930,7 +930,7 @@ SystemBrowser:
                                  }"
         Dim Result As String
         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
             If ex.Message.Contains("2148916233") Then
                 If MyMsgBox("该微软账号尚未购买 Minecraft Java 版,或尚未注册 Xbox 账户。" & vbCrLf &
@@ -967,7 +967,7 @@ SystemBrowser:
         Dim Request As String = "{""identityToken"": ""XBL3.0 x=" & Tokens(1) & ";" & Tokens(0) & """}"
         Dim Result As String
         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
             Dim Message As String = GetExceptionSummary(ex)
             If Message.Contains("(429)") Then
@@ -991,7 +991,7 @@ SystemBrowser:
 
         Dim Result As String
         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
             Dim Message As String = GetExceptionSummary(ex)
             If Message.Contains("(429)") Then

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

@@ -570,7 +570,7 @@ Recheck:
         ''' </summary>
         Public ReadOnly Property IsOldJson As Boolean
             Get
-                Return JsonObject("minecraftArguments") IsNot Nothing
+                Return JsonObject("minecraftArguments") IsNot Nothing AndAlso JsonObject("minecraftArguments") <> ""
             End Get
         End Property
         ''' <summary>
@@ -713,7 +713,7 @@ Recheck:
 ExitDataLoad:
                 '确定版本图标
                 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
                         Case McVersionState.Original
                             Logo = "pack://application:,,,/images/Blocks/Grass.png"
@@ -1878,14 +1878,7 @@ NextVersion:
         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 文件
         Result.AddRange(McLibFixFromLibToken(McLibListGet(Version, False), JumpLoaderFolder:=Version.PathIndie & ".jumploader\", AllowUnsameFile:=IsSetupSkip))
@@ -2014,6 +2007,13 @@ NextVersion:
         End If
     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
 
 #Region "资源文件(Assets)"

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

@@ -411,16 +411,20 @@ Public Module ModMod
                         ElseIf RawValue.StartsWith("'''") Then
                             '多行字符串
                             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)
                         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>
     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"))
-        Dim Archive As Compression.ZipArchive = Nothing
+        Dim Archive As ZipArchive = Nothing
         Dim ArchiveBaseFolder As String = ""
         Try
             '获取整合包种类与关键 Json
             Dim PackType As Integer = -1
             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("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
         End If
         '获取 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"), {})
             If ModEntry("projectID") Is Nothing OrElse ModEntry("fileID") Is Nothing Then
                 Hint("某项 Mod 缺少必要信息,已跳过:" & ModEntry.ToString)
                 Continue For
             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
-        If ModFileList.Count > 0 Then
+        If ModList.Count > 0 Then
             '获取 Mod 下载信息
             InstallLoaders.Add(New LoaderTask(Of Integer, JArray)("获取 Mod 下载信息",
             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 会跳过那一项
-                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
             InstallLoaders.Add(New LoaderTask(Of JArray, List(Of NetFile))("构造 Mod 下载信息",
             Sub(Task As LoaderTask(Of JArray, List(Of NetFile)))
                 Dim FileList As New Dictionary(Of Integer, NetFile)
                 For Each ModJson In Task.Input
+                    Dim Id As Integer = ModJson("id").ToObject(Of Integer)
                     '跳过重复的 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
                     Dim File As New CompFile(ModJson, CompType.Mod)
                     If Not File.Available Then Continue For
@@ -273,14 +282,13 @@ Retry:
                         IsResourcePack = False
                     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
                 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 文件
-            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
 
         '构造加载器
@@ -618,8 +626,9 @@ Retry:
         If Validate.Validate(PackName) <> "" Then PackName = ""
         Dim VersionName As String = MyMsgBoxInput("输入版本名称", "", PackName, New ObjectModel.Collection(Of Validate) From {Validate})
         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)
         InstallLoaders.Add(New LoaderTask(Of String, Integer)("解压整合包文件",
         Sub(Task As LoaderTask(Of String, Integer))
@@ -633,7 +642,45 @@ Retry:
             End If
             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
         '构造版本安装请求
         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)
         End If
     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

+ 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("")>

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

@@ -1988,9 +1988,9 @@ Retry:
         If Directory.Exists(TempMcFolder) Then DeleteDirectory(TempMcFolder)
         Dim OptiFineFolder As String = Nothing
         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 {
-                .NameDisplay = Request.MinecraftName & " " & Request.OptiFineVersion.Replace("HD_U_", "").Replace("_", ""),
+                .NameDisplay = Request.MinecraftName & " " & Request.OptiFineVersion.Replace("HD_U_", "").Replace("_", "").Replace("pre", " pre"),
                 .Inherit = Request.MinecraftName,
                 .IsPreview = Request.OptiFineVersion.ToLower.Contains("pre"),
                 .NameVersion = Request.MinecraftName & "-OptiFine_" & Request.OptiFineVersion,
@@ -2214,7 +2214,7 @@ Retry:
             OutputJson.Merge(FabricJson)
         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("inheritsFrom")
         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
-        Project = FrmMain.PageCurrent.Additional
+        Project = FrmMain.PageCurrent.Additional(0)
         PageLoaderInit(Load, PanLoad, PanMain, CardIntro, CompFileLoader, AddressOf Load_OnFinish)
     End Sub
     '自动重试
@@ -40,7 +40,7 @@
     End Class
     Private Sub Load_OnFinish()
         '获取目标版本与 Mod 加载器
-        Dim TargetVersion As String = ""
+        Dim TargetVersion As String
         Select Case Project.Type
             Case CompType.Mod
                 TargetVersion = If(PageDownloadMod.Loader.Input.GameVersion, "")
@@ -102,7 +102,7 @@
                 NewCard.SwapControl = NewStack
                 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
                 Else
                     NewCard.IsSwaped = True
@@ -128,7 +128,7 @@
     Private IsFirstInit As Boolean = True
     Public Sub Init() Handles Me.PageEnter
         AniControlEnabled += 1
-        Project = FrmMain.PageCurrent.Additional
+        Project = FrmMain.PageCurrent.Additional(0)
         PanBack.ScrollToHome()
 
         '重启加载器
@@ -142,6 +142,8 @@
         '放置当前工程
         If CompItem IsNot Nothing Then PanIntro.Children.Remove(CompItem)
         CompItem = Project.ToCompItem(True, True)
+        CompItem.IsHitTestVisible = False
+        CompItem.HasAnimation = False
         CompItem.Margin = New Thickness(-7, -7, 0, 8)
         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" />
                         <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="1.20.2" />
                             <local:MyComboBoxItem Content="1.20.1" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.19.4" />

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

@@ -32,9 +32,7 @@
             '列表项
             PanProjects.Children.Clear()
             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
             '页码
             CardPages.Visibility = If(Storage.Results.Count > 40 OrElse
@@ -68,12 +66,6 @@
         End Select
     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

+ 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" />
                         <local:MyComboBox x:Name="TextSearchVersion" Grid.Row="2" Grid.Column="1" IsEditable="True" MaxDropDownHeight="320">
                             <local:MyComboBoxItem Content="全部 (也可自行输入)" IsSelected="True" />
+                            <local:MyComboBoxItem Content="1.20.2" />
                             <local:MyComboBoxItem Content="1.20.1" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.19.4" />

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

@@ -31,8 +31,7 @@
             '列表项
             PanProjects.Children.Clear()
             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
             '页码
             CardPages.Visibility = If(Storage.Results.Count > 40 OrElse
@@ -66,12 +65,6 @@
         End Select
     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

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

@@ -79,7 +79,45 @@
     ''' 切换至启动中页面。
     ''' </summary>
     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
         PanLaunching.IsHitTestVisible = False
         LoadLaunching.State.LoadingState = MyLoading.MyLoadingState.Run
@@ -634,48 +672,6 @@ ExitRefresh:
         PageVersionLeft.Version = McVersionCurrent
         FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
     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>
     ''' 每 0.2s 执行一次,刷新启动的数据 UI 显示。
     ''' </summary>
@@ -759,6 +755,7 @@ ExitRefresh:
             Log(ex, "刷新启动信息失败", LogLevel.Feedback)
         End Try
     End Sub
+    Private ShowProgress As Double = 0
     '尺寸改变动画
     Private IsWidthAnimating As Boolean = False
     Private ActualUsedWidth As Double

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

@@ -84,9 +84,13 @@ Download:
                                     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"" />
                             </local:MyCard>"
-                    Case 2 '新闻主页
+                    Case 2 '新闻
                         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
                 End Select
         End Select

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

@@ -103,9 +103,8 @@
     End Sub
     '账号迁移入口
     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 Class

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

@@ -240,9 +240,9 @@
                                       Text="等待命令执行完成后再继续启动" Margin="0,8,0,7" />
                     <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"
-                                        ToolTip="如果在设置中手动选择了与当前版本不兼容的 Java,则自动跳过兼容性警告弹窗,强制使用手动选择的 Java。" />
+                                        ToolTip="警告:强烈推荐在版本设置中关闭特定版本的警告,而不是在这里关闭所有版本的警告!&#xa;如果在设置中手动选择了与当前版本不兼容的 Java,则自动跳过兼容性警告弹窗,强制使用手动选择的 Java。" />
                         <local:MyCheckBox Text="关闭文件校验" x:Name="CheckAdvanceAssets" Tag="LaunchAdvanceAssets"
-                                        ToolTip="完全不更改 assets;不校验 libraries、第三方登录库与版本主 jar 文件是否被修改。&#xa;如果你没有修改相关文件,请勿勾选此项。&#xa;强烈推荐在版本设置中关闭特定版本的校验,而不是在这里关闭所有版本的校验。" />
+                                        ToolTip="警告:强烈推荐在版本设置中关闭特定版本的校验,而不是在这里关闭所有版本的校验!&#xa;完全不更改 assets;不校验 libraries、第三方登录库与版本主 jar 文件是否被修改。&#xa;如果你没有修改相关文件,请勿勾选此项。" />
                     </StackPanel>
                 </Grid>
             </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)}
             NewCard.Children.Add(PanItems)
             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
             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="28" />
                         <RowDefinition Height="9" />
-                        <RowDefinition Height="28" />
-                        <RowDefinition Height="9" />
                         <RowDefinition Height="31" />
                         <RowDefinition Height="Auto" />
+                        <RowDefinition Height="Auto" />
                     </Grid.RowDefinitions>
                     <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="使用全局设置"
                                      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" />
                     <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;涉及路径的操作最好都打上双引号,以避免路径中的空格导致运行失败。" />
-                    <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" />
+                    <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>
             </local:MyCard>
         </StackPanel>

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

@@ -67,7 +67,13 @@
             TextAdvanceGame.Text = Setup.Get("VersionAdvanceGame", Version:=PageVersionLeft.Version)
             TextAdvanceRun.Text = Setup.Get("VersionAdvanceRun", 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
             Log(ex, "重载版本独立设置时出错", LogLevel.Feedback)
@@ -92,6 +98,8 @@
             Setup.Reset("VersionAdvanceJvm", Version:=PageVersionLeft.Version)
             Setup.Reset("VersionAdvanceGame", 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("VersionAdvanceRunWait", Version:=PageVersionLeft.Version)
 
@@ -121,10 +129,10 @@
     Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderRamCustom.Change
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value, Version:=PageVersionLeft.Version)
     End Sub
-    Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndie.SelectionChanged, 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)
     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)
     End Sub