龙腾猫跃 3 лет назад
Родитель
Сommit
794c3003f3
27 измененных файлов с 160 добавлено и 89 удалено
  1. 2 2
      Plain Craft Launcher 2/Application.xaml
  2. 1 1
      Plain Craft Launcher 2/Controls/MySlider.xaml
  3. 22 2
      Plain Craft Launcher 2/FormMain.xaml.vb
  4. 3 3
      Plain Craft Launcher 2/Modules/Base/ModBase.vb
  5. 4 2
      Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb
  6. 29 21
      Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb
  7. 30 22
      Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb
  8. 8 5
      Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
  9. 4 1
      Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
  10. 7 0
      Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb
  11. 2 2
      Plain Craft Launcher 2/My Project/AssemblyInfo.vb
  12. 1 1
      Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb
  13. 13 0
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb
  14. 1 0
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml
  15. 2 1
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml
  16. 5 3
      Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb
  17. 9 12
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb
  18. 1 0
      Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb
  19. 3 1
      Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb
  20. 1 1
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml
  21. 1 1
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb
  22. 2 0
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb
  23. 1 2
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml
  24. 3 1
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml.vb
  25. 4 4
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml
  26. 1 1
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb
  27. BIN
      Plain Craft Launcher 2/Resources/java-wrapper.jar

+ 2 - 2
Plain Craft Launcher 2/Application.xaml

@@ -466,9 +466,9 @@
             </Style>
             </Style>
             <Style TargetType="ComboBoxItem" x:Key="MyComboBoxItem">
             <Style TargetType="ComboBoxItem" x:Key="MyComboBoxItem">
                 <Setter Property="OverridesDefaultStyle" Value="True" />
                 <Setter Property="OverridesDefaultStyle" Value="True" />
-                <Setter Property="ToolTipService.Placement" Value="Right" />
+                <Setter Property="ToolTipService.Placement" Value="Relative" />
                 <Setter Property="ToolTipService.VerticalOffset" Value="-2" />
                 <Setter Property="ToolTipService.VerticalOffset" Value="-2" />
-                <Setter Property="ToolTipService.HorizontalOffset" Value="-250" />
+                <Setter Property="ToolTipService.HorizontalOffset" Value="200" />
                 <Setter Property="ToolTipService.InitialShowDelay" Value="150" />
                 <Setter Property="ToolTipService.InitialShowDelay" Value="150" />
                 <Setter Property="ToolTipService.BetweenShowDelay" Value="150" />
                 <Setter Property="ToolTipService.BetweenShowDelay" Value="150" />
                 <Setter Property="FocusVisualStyle" Value="{x:Null}" />
                 <Setter Property="FocusVisualStyle" Value="{x:Null}" />

+ 1 - 1
Plain Craft Launcher 2/Controls/MySlider.xaml

@@ -9,7 +9,7 @@
              MinHeight="16" UseLayoutRounding="False" SnapsToDevicePixels="False" BorderBrush="{DynamicResource ColorBrushBg0}" Name="PanBack" Background="{StaticResource ColorBrushSemiTransparent}" Focusable="True">
              MinHeight="16" UseLayoutRounding="False" SnapsToDevicePixels="False" BorderBrush="{DynamicResource ColorBrushBg0}" Name="PanBack" Background="{StaticResource ColorBrushSemiTransparent}" Focusable="True">
     <Grid x:Name="PanMain" MinHeight="16" MaxHeight="16" IsHitTestVisible="False">
     <Grid x:Name="PanMain" MinHeight="16" MaxHeight="16" IsHitTestVisible="False">
         <Line Height="4" Name="LineBack" Stroke="{DynamicResource ColorBrushBg0}" Opacity="0.3" StrokeThickness="1" X2="10000" Y1="2" Y2="2" HorizontalAlignment="Right" Width="0" SnapsToDevicePixels="True" Margin="0,0,1,0" />
         <Line Height="4" Name="LineBack" Stroke="{DynamicResource ColorBrushBg0}" Opacity="0.3" StrokeThickness="1" X2="10000" Y1="2" Y2="2" HorizontalAlignment="Right" Width="0" SnapsToDevicePixels="True" Margin="0,0,1,0" />
-        <Line Height="4" Name="LineFore" Stroke="{Binding ElementName=PanBack, Path=BorderBrush}" StrokeThickness="1" X2="10000" Y1="2" Y2="2" Width="0" HorizontalAlignment="Left" SnapsToDevicePixels="True" Margin="1,0,0,0" />
+        <Line Height="4" Name="LineFore" Stroke="{Binding ElementName=PanBack, Path=BorderBrush}" StrokeThickness="2" X2="10000" Y1="2" Y2="2" Width="0" HorizontalAlignment="Left" SnapsToDevicePixels="True" Margin="1,0,0,0" />
         <Ellipse HorizontalAlignment="Left" Width="10" Height="10" 
         <Ellipse HorizontalAlignment="Left" Width="10" Height="10" 
                  Stroke="{Binding BorderBrush, ElementName=PanBack}" StrokeThickness="1.2" 
                  Stroke="{Binding BorderBrush, ElementName=PanBack}" StrokeThickness="1.2" 
                  Fill="{DynamicResource ColorBrushBg0}" Name="ShapeDot" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5">
                  Fill="{DynamicResource ColorBrushBg0}" Name="ShapeDot" VerticalAlignment="Center" RenderTransformOrigin="0.5,0.5">

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

@@ -10,6 +10,13 @@ Public Class FormMain
         Dim FeatureList As New List(Of KeyValuePair(Of Integer, String))
         Dim FeatureList As New List(Of KeyValuePair(Of Integer, String))
         '统计更新日志条目
         '统计更新日志条目
 #If BETA Then
 #If BETA Then
+        If LastVersion < 296 Then 'Release 2.6.3
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "新增内存优化功能,可以将所有程序的物理内存占用降低约 1/3"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "在选择 OptiFine 与 Fabric 后会自动选择 OptiFabric"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化崩溃分析,添加多种崩溃情况的判断"))
+            FeatureCount += 21
+            BugCount += 30
+        End If
         If LastVersion < 293 Then 'Release 2.6.1
         If LastVersion < 293 Then 'Release 2.6.1
             BugCount += 1
             BugCount += 1
         End If
         End If
@@ -109,6 +116,11 @@ Public Class FormMain
         '3:BUG+ IMP* FEAT-
         '3:BUG+ IMP* FEAT-
         '2:BUG* IMP-
         '2:BUG* IMP-
         '1:BUG-
         '1:BUG-
+        If LastVersion < 295 Then 'Snapshot 2.6.3
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化崩溃分析,添加多种崩溃情况的判断"))
+            FeatureCount += 12
+            BugCount += 14
+        End If
         If LastVersion < 294 Then 'Snapshot 2.6.2
         If LastVersion < 294 Then 'Snapshot 2.6.2
             FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "新增内存优化功能,可以将所有程序的物理内存占用降低约 1/3"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "新增内存优化功能,可以将所有程序的物理内存占用降低约 1/3"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "在选择 OptiFine 与 Fabric 后会自动选择 OptiFabric"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "在选择 OptiFine 与 Fabric 后会自动选择 OptiFabric"))
@@ -366,8 +378,14 @@ Public Class FormMain
         End If
         End If
         '加载窗口
         '加载窗口
         ThemeRefreshMain()
         ThemeRefreshMain()
-        Height = ReadReg("WindowHeight", MinHeight + 50)
-        Width = ReadReg("WindowWidth", MinWidth + 50)
+        Try
+            Height = ReadReg("WindowHeight", MinHeight + 50)
+            Width = ReadReg("WindowWidth", MinWidth + 50)
+        Catch ex As Exception '修复 #2019
+            Log(ex, "读取窗口默认大小失败", LogLevel.Hint)
+            Height = MinHeight + 50
+            Width = MinWidth + 50
+        End Try
         Topmost = False
         Topmost = False
         If FrmStart IsNot Nothing Then FrmStart.Close(New TimeSpan(0, 0, 0, 0, 400 / AniSpeed))
         If FrmStart IsNot Nothing Then FrmStart.Close(New TimeSpan(0, 0, 0, 0, 400 / AniSpeed))
         '更改窗口
         '更改窗口
@@ -585,6 +603,7 @@ Public Class FormMain
             Process.GetCurrentProcess.Kill()
             Process.GetCurrentProcess.Kill()
         Else
         Else
             Environment.Exit(ReturnCode)
             Environment.Exit(ReturnCode)
+            Process.GetCurrentProcess.Kill()
         End If
         End If
     End Sub
     End Sub
     Private Sub BtnTitleClose_Click(sender As Object, e As RoutedEventArgs) Handles BtnTitleClose.Click
     Private Sub BtnTitleClose_Click(sender As Object, e As RoutedEventArgs) Handles BtnTitleClose.Click
@@ -612,6 +631,7 @@ Public Class FormMain
         PanForm.Height = BorderForm.ActualHeight + 0.001
         PanForm.Height = BorderForm.ActualHeight + 0.001
         PanMain.Width = PanForm.Width
         PanMain.Width = PanForm.Width
         PanMain.Height = Math.Max(0, PanForm.Height - PanTitle.ActualHeight)
         PanMain.Height = Math.Max(0, PanForm.Height - PanTitle.ActualHeight)
+        If WindowState = WindowState.Maximized Then WindowState = WindowState.Normal '修复 #1938
     End Sub
     End Sub
 
 
     '最小化
     '最小化

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

@@ -11,12 +11,12 @@ Public Module ModBase
 #Region "声明"
 #Region "声明"
 
 
     '下列版本信息由更新器自动修改
     '下列版本信息由更新器自动修改
-    Public Const VersionBaseName As String = "2.6.2" '不含分支前缀的显示用版本名
-    Public Const VersionStandardCode As String = "2.6.2." & VersionBranchCode '标准格式的四段式版本号
+    Public Const VersionBaseName As String = "2.6.3" '不含分支前缀的显示用版本名
+    Public Const VersionStandardCode As String = "2.6.3." & VersionBranchCode '标准格式的四段式版本号
 #If BETA Then
 #If BETA Then
     Public Const VersionCode As Integer = 293 'Release
     Public Const VersionCode As Integer = 293 'Release
 #Else
 #Else
-    Public Const VersionCode As Integer = 294 'Snapshot
+    Public Const VersionCode As Integer = 295 'Snapshot
 #End If
 #End If
     '自动生成的版本信息
     '自动生成的版本信息
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName

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

@@ -468,8 +468,10 @@ NoExName:
                     '去除 “Forge/Fabric” 这一无意义提示
                     '去除 “Forge/Fabric” 这一无意义提示
                     If Ex.Length < 19 AndAlso Ex.ToLower.Contains("fabric") AndAlso Ex.ToLower.Contains("forge") Then Continue For
                     If Ex.Length < 19 AndAlso Ex.ToLower.Contains("fabric") AndAlso Ex.ToLower.Contains("forge") Then Continue For
                     '将 “Forge” 等提示改为 “Forge 版”
                     '将 “Forge” 等提示改为 “Forge 版”
-                    If (Ex.ToLower.Contains("forge") OrElse Ex.ToLower.Contains("fabric") OrElse Ex.ToLower.Contains("quilt")) AndAlso
-                       Not Ex.Contains("版") AndAlso Ex.Length < 19 Then Ex = Ex.Replace("Edition", "").Trim.Capitalize & " 版"
+                    If (Ex.ToLower.Contains("forge") OrElse Ex.ToLower.Contains("fabric") OrElse Ex.ToLower.Contains("quilt")) AndAlso Not Ex.Contains("版") AndAlso
+                        Ex.ToLower.Replace("forge", "").Replace("fabric", "").Replace("quilt", "").Length <= 3 Then
+                        Ex = Ex.Replace("Edition", "").Trim.Capitalize & " 版"
+                    End If
                     ExName &= "  |  " & Ex.Trim
                     ExName &= "  |  " & Ex.Trim
                 Next
                 Next
                 If ExName = "" Then GoTo NoExName
                 If ExName = "" Then GoTo NoExName

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

@@ -165,37 +165,37 @@
         DirectFile = Nothing
         DirectFile = Nothing
         Dim TotalFiles As New List(Of KeyValuePair(Of AnalyzeFileType, KeyValuePair(Of String, String())))
         Dim TotalFiles As New List(Of KeyValuePair(Of AnalyzeFileType, KeyValuePair(Of String, String())))
         For Each LogFile In AnalyzeRawFiles
         For Each LogFile In AnalyzeRawFiles
-            Dim FileName As String = GetFileNameFromPath(LogFile.Key)
+            Dim MatchName As String = GetFileNameFromPath(LogFile.Key).ToLower
             Dim TargetType As AnalyzeFileType
             Dim TargetType As AnalyzeFileType
-            If FileName.StartsWith("hs_err") Then
+            If MatchName.StartsWith("hs_err") Then
                 TargetType = AnalyzeFileType.HsErr
                 TargetType = AnalyzeFileType.HsErr
                 DirectFile = LogFile
                 DirectFile = LogFile
-            ElseIf FileName.StartsWith("crash-") Then
+            ElseIf MatchName.StartsWith("crash-") Then
                 TargetType = AnalyzeFileType.CrashReport
                 TargetType = AnalyzeFileType.CrashReport
                 DirectFile = LogFile
                 DirectFile = LogFile
-            ElseIf FileName = "latest.log" OrElse FileName = "latest log.txt" OrElse
-                   FileName = "debug.log" OrElse FileName = "debug log.txt" OrElse
-                   FileName = "游戏崩溃前的输出.txt" OrElse FileName = "rawoutput.log" Then
+            ElseIf MatchName = "latest.log" OrElse MatchName = "latest log.txt" OrElse
+                   MatchName = "debug.log" OrElse MatchName = "debug log.txt" OrElse
+                   MatchName = "游戏崩溃前的输出.txt" OrElse MatchName = "rawoutput.log" Then
                 TargetType = AnalyzeFileType.MinecraftLog
                 TargetType = AnalyzeFileType.MinecraftLog
                 If DirectFile Is Nothing Then DirectFile = LogFile
                 If DirectFile Is Nothing Then DirectFile = LogFile
-            ElseIf FileName = "启动器日志.txt" OrElse FileName = "PCL2 启动器日志.txt" OrElse FileName = "PCL 启动器日志.txt" OrElse FileName = "log1.txt" Then
+            ElseIf MatchName = "启动器日志.txt" OrElse MatchName = "PCL2 启动器日志.txt" OrElse MatchName = "PCL 启动器日志.txt" OrElse MatchName = "log1.txt" Then
                 If LogFile.Value.Any(Function(s) s.Contains("以下为游戏输出的最后一段内容")) Then
                 If LogFile.Value.Any(Function(s) s.Contains("以下为游戏输出的最后一段内容")) Then
                     TargetType = AnalyzeFileType.MinecraftLog
                     TargetType = AnalyzeFileType.MinecraftLog
                     If DirectFile Is Nothing Then DirectFile = LogFile
                     If DirectFile Is Nothing Then DirectFile = LogFile
                 Else
                 Else
                     TargetType = AnalyzeFileType.ExtraLog
                     TargetType = AnalyzeFileType.ExtraLog
                 End If
                 End If
-            ElseIf FileName.EndsWith(".log") OrElse FileName.EndsWith(".txt") Then
+            ElseIf MatchName.EndsWith(".log") OrElse MatchName.EndsWith(".txt") Then
                 TargetType = AnalyzeFileType.ExtraLog
                 TargetType = AnalyzeFileType.ExtraLog
             Else
             Else
-                Log("[Crash] " & FileName & " 分类为 Ignore")
+                Log("[Crash] " & MatchName & " 分类为 Ignore")
                 Continue For
                 Continue For
             End If
             End If
             If LogFile.Value.Count = 0 Then
             If LogFile.Value.Count = 0 Then
-                Log("[Crash] " & FileName & " 由于内容为空跳过")
+                Log("[Crash] " & MatchName & " 由于内容为空跳过")
             Else
             Else
                 TotalFiles.Add(New KeyValuePair(Of AnalyzeFileType, KeyValuePair(Of String, String()))(TargetType, LogFile))
                 TotalFiles.Add(New KeyValuePair(Of AnalyzeFileType, KeyValuePair(Of String, String()))(TargetType, LogFile))
-                Log("[Crash] " & FileName & " 分类为 " & GetStringFromEnum(TargetType))
+                Log("[Crash] " & MatchName & " 分类为 " & GetStringFromEnum(TargetType))
             End If
             End If
         Next
         Next
 
 
@@ -364,6 +364,7 @@
         NightConfig的Bug
         NightConfig的Bug
         ShadersMod与Optifine同时安装
         ShadersMod与Optifine同时安装
         Forge安装不完整
         Forge安装不完整
+        Mod需要Java11
     End Enum
     End Enum
     ''' <summary>
     ''' <summary>
     ''' 根据 AnalyzeLogs 与可能的版本信息分析崩溃原因。
     ''' 根据 AnalyzeLogs 与可能的版本信息分析崩溃原因。
@@ -469,6 +470,7 @@ Done:
             If LogMc.Contains("java.lang.ClassCastException: class jdk.") Then AppendReason(CrashReason.使用JDK)
             If LogMc.Contains("java.lang.ClassCastException: class jdk.") Then AppendReason(CrashReason.使用JDK)
             If LogMc.Contains("TRANSFORMER/net.optifine/net.optifine.reflect.Reflector.<clinit>(Reflector.java") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
             If LogMc.Contains("TRANSFORMER/net.optifine/net.optifine.reflect.Reflector.<clinit>(Reflector.java") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
             If LogMc.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.client.renderer.texture.SpriteContents.<init>(net.minecraft.resources.ResourceLocation, ") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
             If LogMc.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.client.renderer.texture.SpriteContents.<init>(net.minecraft.resources.ResourceLocation, ") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
+            If LogMc.Contains("java.lang.NoSuchMethodError: 'java.lang.String com.mojang.blaze3d.systems.RenderSystem.getBackendDescription") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
             If LogMc.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.client.renderer.block.model.BakedQuad.<init>(int[], int, net.minecraft.core.Direction, net.minecraft.client.renderer.texture.TextureAtlasSprite, boolean, boolean)'") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
             If LogMc.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.client.renderer.block.model.BakedQuad.<init>(int[], int, net.minecraft.core.Direction, net.minecraft.client.renderer.texture.TextureAtlasSprite, boolean, boolean)'") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
             If LogMc.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.server.level.DistanceManager.addRegionTicket(net.minecraft.server.level.TicketType, net.minecraft.world.level.ChunkPos, int, java.lang.Object, boolean)'") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
             If LogMc.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.server.level.DistanceManager.addRegionTicket(net.minecraft.server.level.TicketType, net.minecraft.world.level.ChunkPos, int, java.lang.Object, boolean)'") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
             If LogMc.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.server.level.DistanceManager.removeRegionTicket(net.minecraft.server.level.TicketType, net.minecraft.world.level.ChunkPos, int, java.lang.Object, boolean)'") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
             If LogMc.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.server.level.DistanceManager.removeRegionTicket(net.minecraft.server.level.TicketType, net.minecraft.world.level.ChunkPos, int, java.lang.Object, boolean)'") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
@@ -492,7 +494,10 @@ Done:
             If LogMc.Contains("com.electronwill.nightconfig.core.io.ParsingException: Not enough data available") Then AppendReason(CrashReason.NightConfig的Bug)
             If LogMc.Contains("com.electronwill.nightconfig.core.io.ParsingException: Not enough data available") Then AppendReason(CrashReason.NightConfig的Bug)
             If LogMc.Contains("Cannot find launch target fmlclient, unable to launch") Then AppendReason(CrashReason.Forge安装不完整)
             If LogMc.Contains("Cannot find launch target fmlclient, unable to launch") Then AppendReason(CrashReason.Forge安装不完整)
             If LogMc.Contains("Invalid module name: '' is not a Java identifier") Then AppendReason(CrashReason.Mod名称包含特殊字符)
             If LogMc.Contains("Invalid module name: '' is not a Java identifier") Then AppendReason(CrashReason.Mod名称包含特殊字符)
+            If LogMc.Contains("has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to") Then AppendReason(CrashReason.Mod需要Java11)
+            If LogMc.Contains("java.lang.RuntimeException: java.lang.NoSuchMethodException: no such method: sun.misc.Unsafe.defineAnonymousClass(Class,byte[],Object[])Class/invokeVirtual") Then AppendReason(CrashReason.Mod需要Java11)
             If LogMc.Contains("java.lang.UnsupportedClassVersionError: net/fabricmc/loader/impl/launch/knot/KnotClient : Unsupported major.minor version") Then AppendReason(CrashReason.Java版本不兼容)
             If LogMc.Contains("java.lang.UnsupportedClassVersionError: net/fabricmc/loader/impl/launch/knot/KnotClient : Unsupported major.minor version") Then AppendReason(CrashReason.Java版本不兼容)
+            If LogMc.Contains("Invalid maximum heap size") Then AppendReason(CrashReason.使用32位Java导致JVM无法分配足够多的内存)
             If LogMc.Contains("Could not reserve enough space") Then
             If LogMc.Contains("Could not reserve enough space") Then
                 If LogMc.Contains("for 1048576KB object heap") Then
                 If LogMc.Contains("for 1048576KB object heap") Then
                     AppendReason(CrashReason.使用32位Java导致JVM无法分配足够多的内存)
                     AppendReason(CrashReason.使用32位Java导致JVM无法分配足够多的内存)
@@ -505,16 +510,15 @@ Done:
             If LogMc.Contains("Found a duplicate mod") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(If(RegexSeek(LogMc, "Found a duplicate mod[^\n]+"), ""), "[^\\/]+.jar", RegularExpressions.RegexOptions.IgnoreCase))
             If LogMc.Contains("Found a duplicate mod") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(If(RegexSeek(LogMc, "Found a duplicate mod[^\n]+"), ""), "[^\\/]+.jar", RegularExpressions.RegexOptions.IgnoreCase))
             If LogMc.Contains("ModResolutionException: Duplicate") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(If(RegexSeek(LogMc, "ModResolutionException: Duplicate[^\n]+"), ""), "[^\\/]+.jar", RegularExpressions.RegexOptions.IgnoreCase))
             If LogMc.Contains("ModResolutionException: Duplicate") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(If(RegexSeek(LogMc, "ModResolutionException: Duplicate[^\n]+"), ""), "[^\\/]+.jar", RegularExpressions.RegexOptions.IgnoreCase))
             'Mod 导致的崩溃
             'Mod 导致的崩溃
-            If LogMc.Contains("Mixin prepare failed ") OrElse LogMc.Contains("Mixin apply failed ") OrElse
-                LogMc.Contains("mixin.injection.throwables.") OrElse LogMc.Contains(".mixins.json] FAILED during )") Then
+            If LogMc.Contains("Mixin prepare failed ") OrElse LogMc.Contains("Mixin apply failed ") OrElse LogMc.Contains("MixinApplyError") OrElse
+            LogMc.Contains("mixin.injection.throwables.") OrElse LogMc.Contains(".mixins.json] FAILED during )") Then
                 Dim ModId As String = RegexSeek(LogMc, "(?<=in )[^./ ]+(?=.mixins.json.+failed injection check)")
                 Dim ModId As String = RegexSeek(LogMc, "(?<=in )[^./ ]+(?=.mixins.json.+failed injection check)")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<=in mixins.)[^./ ]+(?=.json.+failed injection check)")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<=in mixins.)[^./ ]+(?=.json.+failed injection check)")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= failed .+ in )[^./ ]+(?=.mixins.json)")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= failed .+ in )[^./ ]+(?=.mixins.json)")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= failed .+ in mixins.)[^./ ]+(?=.json)")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= failed .+ in mixins.)[^./ ]+(?=.json)")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= in config \[)[^./ ]+(?=.mixins.json\] FAILED during )")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= in config \[)[^./ ]+(?=.mixins.json\] FAILED during )")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= in config \[mixins.)[^./ ]+(?=.json\] FAILED during )")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= in config \[mixins.)[^./ ]+(?=.json\] FAILED during )")
-                If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= in callback )[^./ ]+(?=.mixins.json:)")
-                If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<=from mod )[^\] ]+(?=\] from phase)")
+                If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<=from mod )[^./ ]+(?=\] from)")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<=for mod )[^./ ]+(?= failed)")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<=for mod )[^./ ]+(?= failed)")
                 '兜底名称判断
                 '兜底名称判断
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "[^./ \]]+(?=.mixins.json")
                 If ModId Is Nothing Then ModId = RegexSeek(LogMc, "[^./ \]]+(?=.mixins.json")
@@ -622,11 +626,11 @@ NextStack:
                 Dim Word As String = Splited(i)
                 Dim Word As String = Splited(i)
                 If Word.Length <= 2 OrElse Word.StartsWith("func_") Then Continue For
                 If Word.Length <= 2 OrElse Word.StartsWith("func_") Then Continue For
                 If {"com", "org", "net", "asm", "fml", "mod", "jar", "sun", "lib", "map", "gui", "dev", "nio", "api", "dsi", "top",
                 If {"com", "org", "net", "asm", "fml", "mod", "jar", "sun", "lib", "map", "gui", "dev", "nio", "api", "dsi", "top",
-                    "core", "init", "mods", "main", "file", "game", "load", "read", "done", "util", "tile", "item", "base",
+                    "core", "init", "mods", "main", "file", "game", "load", "read", "done", "util", "tile", "item", "base", "oshi",
                     "forge", "setup", "block", "model", "mixin", "event", "unimi", "netty",
                     "forge", "setup", "block", "model", "mixin", "event", "unimi", "netty",
                     "common", "server", "config", "loader", "launch", "entity", "assist", "client", "plugin", "modapi", "mojang", "shader", "events", "github", "recipe",
                     "common", "server", "config", "loader", "launch", "entity", "assist", "client", "plugin", "modapi", "mojang", "shader", "events", "github", "recipe",
                     "preinit", "preload", "machine", "reflect", "channel", "general", "handler", "content",
                     "preinit", "preload", "machine", "reflect", "channel", "general", "handler", "content",
-                    "fastutil", "optifine", "scheduler", "minecraft", "transformers", "universal", "internal", "multipart", "minecraftforge", "override", "blockentity"
+                    "fastutil", "optifine", "scheduler", "minecraft", "transformers", "universal", "internal", "multipart", "minecraftforge", "override", "blockentity", "platform"
                    }.Contains(Word.ToLower) Then Continue For
                    }.Contains(Word.ToLower) Then Continue For
                 PossibleWords.Add(Word.Trim)
                 PossibleWords.Add(Word.Trim)
             Next
             Next
@@ -818,9 +822,9 @@ NextStack:
                     Results.Add("由于有 Mod 的名称包含特殊字符,导致游戏崩溃。\n请尝试修改 Mod 文件名,让它只包含英文字母、数字、减号(-)、下划线(_)和小数点,然后再启动游戏。")
                     Results.Add("由于有 Mod 的名称包含特殊字符,导致游戏崩溃。\n请尝试修改 Mod 文件名,让它只包含英文字母、数字、减号(-)、下划线(_)和小数点,然后再启动游戏。")
                 Case CrashReason.使用32位Java导致JVM无法分配足够多的内存
                 Case CrashReason.使用32位Java导致JVM无法分配足够多的内存
                     If Environment.Is64BitOperatingSystem Then
                     If Environment.Is64BitOperatingSystem Then
-                        Results.Add("你似乎正在使用 32 位 Java,这会导致 Minecraft 无法使用 1GB 以上的内存,进而造成崩溃。\n\n请在启动设置的 Java 选择一项中改用 64 位的 Java 再启动游戏,然后再启动游戏。\n如果你没有安装 64 位的 Java,你可以从网络中下载、安装一个。")
+                        Results.Add("你似乎正在使用 32 位 Java,这会导致 Minecraft 无法使用所需的内存,进而造成崩溃。\n\n请在启动设置的 Java 选择一项中改用 64 位的 Java 再启动游戏,然后再启动游戏。\n如果你没有安装 64 位的 Java,你可以从网络中下载、安装一个。")
                     Else
                     Else
-                        Results.Add("你正在使用 32 位的操作系统,这会导致 Minecraft 无法使用 1GB 以上的内存,进而造成崩溃。\n\n你或许只能重装 64 位的操作系统来解决此问题。\n如果你的电脑内存在 2GB 以内,那或许只能换台电脑了……\h")
+                        Results.Add("你正在使用 32 位的操作系统,这会导致 Minecraft 无法使用所需的内存,进而造成崩溃。\n\n你或许只能重装 64 位的操作系统来解决此问题。\n如果你的电脑内存在 2GB 以内,那或许只能换台电脑了……\h")
                     End If
                     End If
                 Case CrashReason.崩溃日志堆栈分析发现关键字, CrashReason.MC日志堆栈分析发现关键字
                 Case CrashReason.崩溃日志堆栈分析发现关键字, CrashReason.MC日志堆栈分析发现关键字
                     If Additional.Count = 1 Then
                     If Additional.Count = 1 Then
@@ -886,6 +890,8 @@ NextStack:
                     Results.Add("可能由于使用其他启动器修改了 Forge 版本,当前版本的文件存在异常,导致了游戏崩溃。\n请尝试重新全新安装 Forge,而非使用其他启动器修改 Forge 版本。")
                     Results.Add("可能由于使用其他启动器修改了 Forge 版本,当前版本的文件存在异常,导致了游戏崩溃。\n请尝试重新全新安装 Forge,而非使用其他启动器修改 Forge 版本。")
                 Case CrashReason.玩家手动触发调试崩溃
                 Case CrashReason.玩家手动触发调试崩溃
                     Results.Add("* 事实上,你的游戏没有任何问题,这是你自己触发的崩溃。\n* 你难道没有更重要的事要做吗?")
                     Results.Add("* 事实上,你的游戏没有任何问题,这是你自己触发的崩溃。\n* 你难道没有更重要的事要做吗?")
+                Case CrashReason.Mod需要Java11
+                    Results.Add("你所安装的部分 Mod 似乎需要使用 Java 11 启动。\n请在启动设置的 Java 选择一项中改用 Java 11,然后再启动游戏。\n如果你没有安装 Java 11,你可以从网络中下载、安装一个。")
                 Case CrashReason.极短的程序输出
                 Case CrashReason.极短的程序输出
                     Results.Add($"程序返回了以下信息:\n{Additional.First}\n\h")
                     Results.Add($"程序返回了以下信息:\n{Additional.First}\n\h")
                 Case CrashReason.OptiFine导致无法加载世界 'https://www.minecraftforum.net/forums/support/java-edition-support/3051132-exception-ticking-world
                 Case CrashReason.OptiFine导致无法加载世界 'https://www.minecraftforum.net/forums/support/java-edition-support/3051132-exception-ticking-world
@@ -947,8 +953,10 @@ NextStack:
                     Replace("\e", If(IsHandAnalyze, "", vbCrLf & "你可以查看错误报告了解错误具体是如何发生的。")).
                     Replace("\e", If(IsHandAnalyze, "", vbCrLf & "你可以查看错误报告了解错误具体是如何发生的。")).
                     Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, vbCrLf).
                     Replace(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, vbCrLf).
                     Trim(vbCrLf.ToCharArray) &
                     Trim(vbCrLf.ToCharArray) &
-                If(Results.Any(Function(r) r.EndsWith("\h")),
-                    If(IsHandAnalyze, "", vbCrLf & "如果要寻求帮助,请向他人发送错误报告文件,而不是发送这个窗口的截图。"), "")
+                If(Not Results.Any(Function(r) r.EndsWith("\h")) OrElse IsHandAnalyze, "",
+                    vbCrLf & "如果要寻求帮助,请向他人发送错误报告文件,而不是发送这个窗口的截图。" &
+                    If(If(PageSetupSystem.IsLauncherNewest(), True), "",
+                    vbCrLf & vbCrLf & "此外,你正在使用老版本 PCL,更新到最新版可能会修复这个问题。" & vbCrLf & "你可以点击 设置 → 启动器 → 检查更新 来更新 PCL。"))
     End Function
     End Function
 
 
 End Class
 End Class

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

@@ -182,7 +182,8 @@
                 Log("[Java] 初始化未找到可用的 Java,将自动触发搜索", LogLevel.Developer)
                 Log("[Java] 初始化未找到可用的 Java,将自动触发搜索", LogLevel.Developer)
                 JavaSearchLoader.Start(0)
                 JavaSearchLoader.Start(0)
             Else
             Else
-                Log("[Java] 缓存中有 " & JavaList.Count & " 个可用的 Java")
+                Log("[Java] 缓存中有 " & JavaList.Count & " 个可用的 Java:")
+                JavaList.ForEach(Sub(j) Log($"[Java]  - {j}"))
             End If
             End If
         Catch ex As Exception
         Catch ex As Exception
             Log(ex, "初始化 Java 列表失败", LogLevel.Feedback)
             Log(ex, "初始化 Java 列表失败", LogLevel.Feedback)
@@ -201,7 +202,9 @@
 
 
             '添加特定的 Java
             '添加特定的 Java
             Dim JavaPreList As New Dictionary(Of String, Boolean)
             Dim JavaPreList As New Dictionary(Of String, Boolean)
-            If PathMcFolder.Split("\").Count > 3 Then JavaSearchFolder(GetPathFromFullPath(PathMcFolder), JavaPreList, False, True) 'Minecraft 文件夹的父文件夹(如果不是根目录的话)
+            If PathMcFolder.Split("\").Count > 3 Then
+                JavaSearchFolder(GetPathFromFullPath(PathMcFolder), JavaPreList, False, True) 'Minecraft 文件夹的父文件夹(如果不是根目录的话)
+            End If
             JavaSearchFolder(PathMcFolder, JavaPreList, False, True) 'Minecraft 文件夹
             JavaSearchFolder(PathMcFolder, JavaPreList, False, True) 'Minecraft 文件夹
             If RelatedVersion IsNot Nothing Then JavaSearchFolder(RelatedVersion.Path, JavaPreList, False, True) '所选版本文件夹
             If RelatedVersion IsNot Nothing Then JavaSearchFolder(RelatedVersion.Path, JavaPreList, False, True) '所选版本文件夹
             Dim TargetJavaList As New List(Of JavaEntry)
             Dim TargetJavaList As New List(Of JavaEntry)
@@ -209,6 +212,15 @@
                 TargetJavaList.Add(New JavaEntry(Entry.Key, Entry.Value))
                 TargetJavaList.Add(New JavaEntry(Entry.Key, Entry.Value))
             Next
             Next
 
 
+            '检查特定的 Java
+            If TargetJavaList.Count > 0 Then
+                TargetJavaList = JavaCheckList(TargetJavaList)
+                Log("[Java] 检查后找到 " & TargetJavaList.Count & " 个特定路径下的 Java:")
+                For Each Java In TargetJavaList
+                    Log($"[Java]  - {Java}")
+                Next
+            End If
+
 #Region "添加用户指定的 Java,储存到 UserJava 中"
 #Region "添加用户指定的 Java,储存到 UserJava 中"
 
 
             Dim UserJava As JavaEntry = Nothing
             Dim UserJava As JavaEntry = Nothing
@@ -217,13 +229,7 @@
             If RelatedVersion IsNot Nothing AndAlso Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion).ToString.StartsWith("{") Then
             If RelatedVersion IsNot Nothing AndAlso Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion).ToString.StartsWith("{") Then
                 Try
                 Try
                     UserJava = JavaEntry.FromJson(GetJson(Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion)))
                     UserJava = JavaEntry.FromJson(GetJson(Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion)))
-                    '确保版本独立设置中指定的 Java 在 Java 列表中(#978)
-                    If Not JavaList.Any(Function(j) j.PathFolder = UserJava.PathFolder) Then
-                        UserJava = Nothing
-                        Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion)
-                        Log("版本独立设置中指定的 Java 不在主 Java 列表中,此设置已重置", LogLevel.Debug)
-                        Exit Try
-                    End If
+                    UserJava.Check()
                 Catch ex As Exception
                 Catch ex As Exception
                     UserJava = Nothing
                     UserJava = Nothing
                     Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion)
                     Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion)
@@ -235,10 +241,11 @@
             If UserJava Is Nothing AndAlso Setup.Get("LaunchArgumentJavaSelect") <> "" Then
             If UserJava Is Nothing AndAlso Setup.Get("LaunchArgumentJavaSelect") <> "" Then
                 Try
                 Try
                     UserJava = JavaEntry.FromJson(GetJson(Setup.Get("LaunchArgumentJavaSelect")))
                     UserJava = JavaEntry.FromJson(GetJson(Setup.Get("LaunchArgumentJavaSelect")))
+                    UserJava.Check()
                 Catch ex As Exception
                 Catch ex As Exception
                     UserJava = Nothing
                     UserJava = Nothing
                     Setup.Reset("LaunchArgumentJavaSelect")
                     Setup.Reset("LaunchArgumentJavaSelect")
-                    Log(ex, "设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint)
+                    Log(ex, "全局设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint)
                 End Try
                 End Try
             End If
             End If
 
 
@@ -250,12 +257,6 @@
 
 
 #End Region
 #End Region
 
 
-            '检查特定的 Java
-            If TargetJavaList.Count > 0 Then
-                TargetJavaList = JavaCheckList(TargetJavaList)
-                Log("[Java] 检查后找到 " & TargetJavaList.Count & " 个特定的 Java")
-            End If
-
 RetryGet:
 RetryGet:
             '等待进行中的搜索结束
             '等待进行中的搜索结束
             If JavaSearchLoader.State <> LoadState.Finished AndAlso JavaSearchLoader.State <> LoadState.Waiting Then JavaSearchLoader.WaitForExit()
             If JavaSearchLoader.State <> LoadState.Finished AndAlso JavaSearchLoader.State <> LoadState.Waiting Then JavaSearchLoader.WaitForExit()
@@ -298,8 +299,9 @@ RetryGet:
 
 
             '指定的 Java 不可用,弹窗要求选择
             '指定的 Java 不可用,弹窗要求选择
             Log("[Java] 发现用户指定的不兼容 Java:" & UserJava.ToString)
             Log("[Java] 发现用户指定的不兼容 Java:" & UserJava.ToString)
+            Log($"[Java] 目前实际可用的 Java 列表:")
             For Each Java In AllowedJavaList
             For Each Java In AllowedJavaList
-                Log($"[Java] 实际可用的 Java:{Java.ToString}")
+                Log($"[Java]  - {Java}")
             Next
             Next
             Dim Requirement As String = ""
             Dim Requirement As String = ""
             Dim ShowRevision As Boolean = False
             Dim ShowRevision As Boolean = False
@@ -344,10 +346,12 @@ ExitUserJavaCheck:
 
 
             '优先使用特定目录下的 Java
             '优先使用特定目录下的 Java
             For Each Java In AllowedJavaList
             For Each Java In AllowedJavaList
+                '如果在官启文件夹启动,会将官启自带 Java 错误视作 MC 文件夹指定 Java,导致了 #2054 的第二例
+                If Java.PathFolder.Contains(".minecraft\cache\java") Then Continue For
                 If TargetJavaList.Contains(Java) Then
                 If TargetJavaList.Contains(Java) Then
                     '直接使用指定的 Java
                     '直接使用指定的 Java
                     AllowedJavaList = New List(Of JavaEntry) From {Java}
                     AllowedJavaList = New List(Of JavaEntry) From {Java}
-                    Log("[Java] 优先使用特定的 Java:" & Java.ToString)
+                    Log("[Java] 优先使用特定路径下的 Java:" & Java.ToString)
                     GoTo UserPass
                     GoTo UserPass
                 End If
                 End If
             Next
             Next
@@ -355,6 +359,10 @@ UserPass:
 
 
             '对适合的 Java 进行排序
             '对适合的 Java 进行排序
             AllowedJavaList = Sort(AllowedJavaList, AddressOf JavaSorter)
             AllowedJavaList = Sort(AllowedJavaList, AddressOf JavaSorter)
+            Log($"[Java] 排序后的 Java 优先顺序:")
+            For Each Java In AllowedJavaList
+                Log($"[Java]  - {Java}")
+            Next
 
 
             '检查选定的 Java,若测试失败则尝试进行搜索
             '检查选定的 Java,若测试失败则尝试进行搜索
             Dim SelectedJava = AllowedJavaList.First
             Dim SelectedJava = AllowedJavaList.First
@@ -364,14 +372,14 @@ UserPass:
                 Throw
                 Throw
             Catch ex As Exception
             Catch ex As Exception
                 If ex.InnerException IsNot Nothing AndAlso TypeOf (ex.InnerException) Is ThreadInterruptedException Then Throw ex.InnerException
                 If ex.InnerException IsNot Nothing AndAlso TypeOf (ex.InnerException) Is ThreadInterruptedException Then Throw ex.InnerException
-                Log(ex, "找到的 Java 已无法使用,尝试进行搜索")
+                Log(ex, "最终选定的 Java 已无法使用,尝试进行搜索")
                 AllowedJavaList = New List(Of JavaEntry)
                 AllowedJavaList = New List(Of JavaEntry)
                 JavaSearchLoader.Start(IsForceRestart:=True)
                 JavaSearchLoader.Start(IsForceRestart:=True)
                 GoTo RetryGet
                 GoTo RetryGet
             End Try
             End Try
 
 
             '返回
             '返回
-            Log("[Java] 选定的 Java:" & SelectedJava.ToString)
+            Log("[Java] 最终选定的 Java:" & AllowedJavaList.First.ToString)
             Return SelectedJava
             Return SelectedJava
 
 
         Catch ex As ThreadInterruptedException
         Catch ex As ThreadInterruptedException
@@ -442,7 +450,7 @@ NoUserJava:
         '4. Java 大版本
         '4. Java 大版本
         If Left.VersionCode <> Right.VersionCode Then
         If Left.VersionCode <> Right.VersionCode Then
             '                             Java  7   8   9  10  11  12 13 14 15  16  17  18  19  20...
             '                             Java  7   8   9  10  11  12 13 14 15  16  17  18  19  20...
-            Dim Weight = {0, 1, 2, 3, 4, 5, 6, 14, 29, 10, 11, 12, 13, 9, 8, 7, 15, 31, 30, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28}
+            Dim Weight = {0, 1, 2, 3, 4, 5, 6, 14, 29, 10, 12, 15, 13, 9, 8, 7, 11, 31, 30, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28}
             Return Weight.ElementAtOrDefault(Left.VersionCode) >= Weight.ElementAtOrDefault(Right.VersionCode)
             Return Weight.ElementAtOrDefault(Left.VersionCode) >= Weight.ElementAtOrDefault(Right.VersionCode)
         End If
         End If
         '5. 最次级版本号更接近 51
         '5. 最次级版本号更接近 51
@@ -585,7 +593,7 @@ NoUserJava:
             Dim CheckThread As New Thread(Sub()
             Dim CheckThread As New Thread(Sub()
                                               Try
                                               Try
                                                   Entry.Check()
                                                   Entry.Check()
-                                                  Log("[Java] " & Entry.ToString)
+                                                  If ModeDebug Then Log("[Java]  - " & Entry.ToString)
                                                   SyncLock ListLock
                                                   SyncLock ListLock
                                                       JavaCheckList.Add(Entry)
                                                       JavaCheckList.Add(Entry)
                                                   End SyncLock
                                                   End SyncLock

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

@@ -1115,11 +1115,14 @@ SystemBrowser:
         'OptiFine 检测
         'OptiFine 检测
         If McVersionCurrent.Version.HasOptiFine Then
         If McVersionCurrent.Version.HasOptiFine Then
             If McVersionCurrent.Version.McCodeMain <= 7 AndAlso McVersionCurrent.Version.McCodeMain > 0 Then
             If McVersionCurrent.Version.McCodeMain <= 7 AndAlso McVersionCurrent.Version.McCodeMain > 0 Then
-                '<1.7:至多 Java 8(Java 9 - 10 未测试)
+                '<1.7:至多 Java 8
                 MaxVer = New Version(1, 8, 999, 999)
                 MaxVer = New Version(1, 8, 999, 999)
             ElseIf McVersionCurrent.Version.McCodeMain >= 8 AndAlso McVersionCurrent.Version.McCodeMain <= 11 Then
             ElseIf McVersionCurrent.Version.McCodeMain >= 8 AndAlso McVersionCurrent.Version.McCodeMain <= 11 Then
-                '1.8 - 1.11:必须恰好 Java 8(Java 9 - 10 未测试)
+                '1.8 - 1.11:必须恰好 Java 8
                 MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 8, 999, 999)
                 MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 8, 999, 999)
+            ElseIf McVersionCurrent.Version.McCodeMain = 12 AndAlso McVersionCurrent.Version.HasForge Then
+                '1.12:若安装了 Forge,最高 Java 8
+                MaxVer = New Version(1, 8, 999, 999)
             End If
             End If
         End If
         End If
 
 
@@ -1129,12 +1132,12 @@ SystemBrowser:
                 '1.7.2:必须 Java 7
                 '1.7.2:必须 Java 7
                 MinVer = New Version(1, 7, 0, 0) : MaxVer = New Version(1, 7, 999, 999)
                 MinVer = New Version(1, 7, 0, 0) : MaxVer = New Version(1, 7, 999, 999)
             ElseIf McVersionCurrent.Version.McCodeMain <= 12 AndAlso McVersionCurrent.Version.McCodeMain > 0 AndAlso VersionSortBoolean("14.23.5.2855", McVersionCurrent.Version.ForgeVersion) Then
             ElseIf McVersionCurrent.Version.McCodeMain <= 12 AndAlso McVersionCurrent.Version.McCodeMain > 0 AndAlso VersionSortBoolean("14.23.5.2855", McVersionCurrent.Version.ForgeVersion) Then
-                '<1.12,Forge 14.23.5.2855 及更低:Java 8
+                '<=1.12,Forge 14.23.5.2855 及更低:Java 8
                 MaxVer = New Version(1, 8, 999, 999)
                 MaxVer = New Version(1, 8, 999, 999)
-            ElseIf McVersionCurrent.Version.McCodeMain <= 14 AndAlso McVersionCurrent.Version.McCodeMain > 0 AndAlso VersionSortBoolean("28.2.23", McVersionCurrent.Version.ForgeVersion) Then
+            ElseIf McVersionCurrent.Version.McCodeMain <= 14 AndAlso McVersionCurrent.Version.McCodeMain >= 13 AndAlso VersionSortBoolean("28.2.23", McVersionCurrent.Version.ForgeVersion) Then
                 '1.13 - 1.14,Forge 28.2.23 及更低:Java 8 - 10
                 '1.13 - 1.14,Forge 28.2.23 及更低:Java 8 - 10
                 MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 10, 999, 999)
                 MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 10, 999, 999)
-            ElseIf McVersionCurrent.Version.McCodeMain <= 15 AndAlso McVersionCurrent.Version.McCodeMain > 0 Then
+            ElseIf McVersionCurrent.Version.McCodeMain = 15 Then
                 '1.15:Java 8 - 15
                 '1.15:Java 8 - 15
                 MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 15, 999, 999)
                 MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 15, 999, 999)
             ElseIf VersionSortBoolean(McVersionCurrent.Version.ForgeVersion, "34.0.0") AndAlso VersionSortBoolean("36.2.25", McVersionCurrent.Version.ForgeVersion) Then
             ElseIf VersionSortBoolean(McVersionCurrent.Version.ForgeVersion, "34.0.0") AndAlso VersionSortBoolean("36.2.25", McVersionCurrent.Version.ForgeVersion) Then

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

@@ -3105,7 +3105,10 @@ VersionFindFail:
             '弹窗结果
             '弹窗结果
             If MsgResult = 2 Then
             If MsgResult = 2 Then
                 '下载
                 '下载
-                McDownloadClient(NetPreDownloadBehaviour.HintWhileExists, VersionName, Version("url").ToString)
+                RunInUi(Sub()
+                            PageDownloadInstall.McVersionWaitingForSelect = VersionName
+                            FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadInstall)
+                        End Sub)
             End If
             End If
 
 
         Catch ex As Exception
         Catch ex As Exception

+ 7 - 0
Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb

@@ -640,6 +640,9 @@ Retry:
                     Request.ForgeVersion = Component("version")
                     Request.ForgeVersion = Component("version")
                 Case "net.fabricmc.fabric-loader"
                 Case "net.fabricmc.fabric-loader"
                     Request.FabricVersion = Component("version")
                     Request.FabricVersion = Component("version")
+                Case "org.quiltmc.quilt-loader" 'eg. 1.0.0
+                    Hint("PCL 暂不支持安装需要 Quilt 的整合包!", HintType.Critical)
+                    Exit Sub
             End Select
             End Select
         Next
         Next
         '构造加载器
         '构造加载器
@@ -729,6 +732,10 @@ Retry:
             Hint("该整合包未提供游戏版本信息,无法安装!", HintType.Critical)
             Hint("该整合包未提供游戏版本信息,无法安装!", HintType.Critical)
             Exit Sub
             Exit Sub
         End If
         End If
+        If Addons.ContainsKey("quilt") Then
+            Hint("PCL 暂不支持安装需要 Quilt 的整合包!", HintType.Critical)
+            Exit Sub
+        End If
         Dim Request As New McInstallRequest With {
         Dim Request As New McInstallRequest With {
             .TargetVersionName = VersionName,
             .TargetVersionName = VersionName,
             .MinecraftName = Addons("game"),
             .MinecraftName = Addons("game"),

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

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

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

@@ -553,7 +553,7 @@ Public Module ModDownloadLib
                                                                              '拷贝原版文件
                                                                              '拷贝原版文件
                                                                              If Not IsCustomFolder Then Exit Sub
                                                                              If Not IsCustomFolder Then Exit Sub
                                                                              SyncLock VanillaSyncLock
                                                                              SyncLock VanillaSyncLock
-                                                                                 Dim ClientName As String = New DirectoryInfo(ClientDownloadLoader.Input).Name
+                                                                                 Dim ClientName As String = New DirectoryInfo(ClientDownloadLoader.Input).Name '#2031 报告了此处 ClientDownloadLoader.Input 为 null 的问题,但无法复现
                                                                                  Directory.CreateDirectory(McFolder & "versions\" & DownloadInfo.Inherit)
                                                                                  Directory.CreateDirectory(McFolder & "versions\" & DownloadInfo.Inherit)
                                                                                  If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") Then
                                                                                  If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") Then
                                                                                      CopyFile(ClientDownloadLoader.Input & ClientName & ".json",
                                                                                      CopyFile(ClientDownloadLoader.Input & ClientName & ".json",

+ 13 - 0
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb

@@ -571,10 +571,23 @@
                 NewCard.IsSwaped = True
                 NewCard.IsSwaped = True
                 PanMinecraft.Children.Add(NewCard)
                 PanMinecraft.Children.Add(NewCard)
             Next
             Next
+            '自动选择版本
+            If McVersionWaitingForSelect Is Nothing Then Exit Try
+            Log("[Download] 自动选择 MC 版本:" & McVersionWaitingForSelect)
+            For Each Version As JObject In Versions
+                If Version("id").ToString <> McVersionWaitingForSelect Then Continue For
+                Dim Item = McDownloadListItem(Version, Sub()
+                                                       End Sub, False)
+                MinecraftSelected(Item, Nothing)
+            Next
         Catch ex As Exception
         Catch ex As Exception
             Log(ex, "可视化安装版本列表出错", LogLevel.Feedback)
             Log(ex, "可视化安装版本列表出错", LogLevel.Feedback)
         End Try
         End Try
     End Sub
     End Sub
+    ''' <summary>
+    ''' 当 MC 版本列表加载完时,立即自动选择的版本。用于外部调用。
+    ''' </summary>
+    Public Shared McVersionWaitingForSelect As String = Nothing
 
 
 #End Region
 #End Region
 
 

+ 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.1" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.19.4" />
                             <local:MyComboBoxItem Content="1.19.4" />
                             <local:MyComboBoxItem Content="1.18.2" />
                             <local:MyComboBoxItem Content="1.18.2" />

+ 2 - 1
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.1" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.19.4" />
                             <local:MyComboBoxItem Content="1.19.4" />
                             <local:MyComboBoxItem Content="1.18.2" />
                             <local:MyComboBoxItem Content="1.18.2" />
@@ -65,7 +66,7 @@
                             <local:MyComboBoxItem Tag="4736/" Content="空岛" />
                             <local:MyComboBoxItem Tag="4736/" Content="空岛" />
                             <local:MyComboBoxItem Tag="5128/" Content="原版改良" />
                             <local:MyComboBoxItem Tag="5128/" Content="原版改良" />
                             <local:MyComboBoxItem Tag="4487/" Content="FTB" 
                             <local:MyComboBoxItem Tag="4487/" Content="FTB" 
-                                                  ToolTip="该整合包由 FTB 官方发布" ToolTipService.InitialShowDelay="150" ToolTipService.Placement="Right" ToolTipService.VerticalOffset="-1" ToolTipService.HorizontalOffset="-40" />
+                                                  ToolTip="由 FTB 官方发布" ToolTipService.HorizontalOffset="70" />
                             <local:MyComboBoxItem Tag="4480/" Content="基于地图" />
                             <local:MyComboBoxItem Tag="4480/" Content="基于地图" />
                             <local:MyComboBoxItem Tag="4481/lightweight" Content="轻量整合" />
                             <local:MyComboBoxItem Tag="4481/lightweight" Content="轻量整合" />
                             <local:MyComboBoxItem Tag="4482/" Content="大型整合" />
                             <local:MyComboBoxItem Tag="4482/" Content="大型整合" />

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

@@ -356,7 +356,7 @@ Finish:
         Select Case Type
         Select Case Type
             Case 0
             Case 0
                 If FrmLoginLegacy IsNot Nothing AndAlso FrmLoginLegacy.IsReloaded Then
                 If FrmLoginLegacy IsNot Nothing AndAlso FrmLoginLegacy.IsReloaded Then
-                    Return New EqualableList(Of String) From {0, If(FrmLoginLegacy.ComboName.Text, "")}
+                    Return New EqualableList(Of String) From {0, If(FrmLoginLegacy.ComboName.Text.Trim, "")}
                 ElseIf Setup.Get("LoginLegacyName") = "" Then
                 ElseIf Setup.Get("LoginLegacyName") = "" Then
                     Return New EqualableList(Of String) From {0, ""}
                     Return New EqualableList(Of String) From {0, ""}
                 Else
                 Else
@@ -526,11 +526,12 @@ Finish:
 
 
     '版本选择按钮
     '版本选择按钮
     Private Sub BtnVersion_Click(sender As Object, e As EventArgs) Handles BtnVersion.Click
     Private Sub BtnVersion_Click(sender As Object, e As EventArgs) Handles BtnVersion.Click
+        If McLaunchLoader.State = LoadState.Loading Then Exit Sub
         FrmMain.PageChange(FormMain.PageType.VersionSelect)
         FrmMain.PageChange(FormMain.PageType.VersionSelect)
     End Sub
     End Sub
     '启动按钮
     '启动按钮
     Public Sub LaunchButtonClick() Handles BtnLaunch.Click
     Public Sub LaunchButtonClick() Handles BtnLaunch.Click
-        If McLaunchLoader.State = LoadState.Loading OrElse Not BtnLaunch.IsEnabled Then Exit Sub
+        If McLaunchLoader.State = LoadState.Loading OrElse Not BtnLaunch.IsEnabled OrElse FrmMain.PageRight.PageState <> MyPageRight.PageStates.ContentStay Then Exit Sub
         '愚人节处理
         '愚人节处理
         If IsAprilEnabled AndAlso Not IsAprilGiveup Then
         If IsAprilEnabled AndAlso Not IsAprilGiveup Then
             ThemeUnlock(12, False, "隐藏主题 滑稽彩 已解锁!")
             ThemeUnlock(12, False, "隐藏主题 滑稽彩 已解锁!")
@@ -625,8 +626,9 @@ ExitRefresh:
             End Try
             End Try
         End If
         End If
     End Sub
     End Sub
-    '更多按钮
+    '版本设置按钮
     Private Sub BtnMore_Click(sender As Object, e As EventArgs) Handles BtnMore.Click
     Private Sub BtnMore_Click(sender As Object, e As EventArgs) Handles BtnMore.Click
+        If McLaunchLoader.State = LoadState.Loading Then Exit Sub
         McVersionCurrent.Load()
         McVersionCurrent.Load()
         PageVersionLeft.Version = McVersionCurrent
         PageVersionLeft.Version = McVersionCurrent
         FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
         FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)

+ 9 - 12
Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb

@@ -17,7 +17,7 @@ Public Class PageLoginLegacy
     Public Sub Reload(KeepInput As Boolean)
     Public Sub Reload(KeepInput As Boolean)
         If KeepInput AndAlso IsReloaded Then '避免第一次就以 KeepInput 的方式加载,导致文本框里没东西
         If KeepInput AndAlso IsReloaded Then '避免第一次就以 KeepInput 的方式加载,导致文本框里没东西
             '保留输入,只刷新下拉框列表
             '保留输入,只刷新下拉框列表
-            Dim Input As String = ComboName.Text
+            Dim Input As String = ComboName.Text.Trim
             ComboName.ItemsSource = If(Setup.Get("LoginLegacyName") = "", Nothing, Setup.Get("LoginLegacyName").ToString.Split("¨"))
             ComboName.ItemsSource = If(Setup.Get("LoginLegacyName") = "", Nothing, Setup.Get("LoginLegacyName").ToString.Split("¨"))
             ComboName.Text = Input
             ComboName.Text = Input
         Else
         Else
@@ -26,7 +26,7 @@ Public Class PageLoginLegacy
                 ComboName.ItemsSource = Nothing
                 ComboName.ItemsSource = Nothing
             Else
             Else
                 ComboName.ItemsSource = Setup.Get("LoginLegacyName").ToString.Split("¨")
                 ComboName.ItemsSource = Setup.Get("LoginLegacyName").ToString.Split("¨")
-                ComboName.Text = Setup.Get("LoginLegacyName").ToString.Split("¨")(0)
+                ComboName.Text = Setup.Get("LoginLegacyName").ToString.Split("¨")(0).Trim
             End If
             End If
         End If
         End If
         IsReloaded = True
         IsReloaded = True
@@ -50,17 +50,14 @@ Public Class PageLoginLegacy
         Return IsVaild(GetLoginData())
         Return IsVaild(GetLoginData())
     End Function
     End Function
 
 
-    Private Sub ComboLegacy_TextChanged(sender As Object, e As TextChangedEventArgs) Handles ComboName.TextChanged
-        If ComboName.Text.EndsWith(" ") Then
-            ComboName.Text = ComboName.Text.Trim()
-            SendKeys.SendWait("{END}")
-        ElseIf ComboName.Text.StartsWith(" ") Then
-            ComboName.Text = ComboName.Text.Trim()
-            SendKeys.SendWait("{HOME}")
-        End If
-        If Setup.Get("LaunchSkinType") = 0 Then
-            PageLaunchLeft.SkinLegacy.Start(IsForceRestart:=True)
+    Private Sub ComboName_PreviewKeyDown(sender As Object, e As Input.KeyEventArgs) Handles ComboName.PreviewKeyDown
+        If e.Key = Key.Space Then
+            Dim Index = CType(ComboName.Template.FindName("PART_EditableTextBox", ComboName), MyTextBox).CaretIndex
+            If Index = ComboName.Text.Length OrElse Index = 0 Then e.Handled = True
         End If
         End If
+    End Sub
+    Private Sub ComboLegacy_TextChanged(sender As Object, e As TextChangedEventArgs) Handles ComboName.TextChanged
+        If Setup.Get("LaunchSkinType") = 0 Then PageLaunchLeft.SkinLegacy.Start(IsForceRestart:=True)
         HintChinese.Visibility = If(RegexCheck(ComboName.Text, "^[0-9A-Za-z_]*$"), Visibility.Collapsed, Visibility.Visible)
         HintChinese.Visibility = If(RegexCheck(ComboName.Text, "^[0-9A-Za-z_]*$"), Visibility.Collapsed, Visibility.Visible)
     End Sub
     End Sub
     Private Sub Skin_Click() Handles Skin.Click
     Private Sub Skin_Click() Handles Skin.Click

+ 1 - 0
Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb

@@ -259,6 +259,7 @@
             Directory.CreateDirectory(Path & ".minecraft\")
             Directory.CreateDirectory(Path & ".minecraft\")
             Directory.CreateDirectory(Path & ".minecraft\versions\")
             Directory.CreateDirectory(Path & ".minecraft\versions\")
             Setup.Set("LaunchFolderSelect", "$.minecraft\")
             Setup.Set("LaunchFolderSelect", "$.minecraft\")
+            McFolderLauncherProfilesJsonCreate(Path & ".minecraft\")
             Hint("新建 .minecraft 文件夹成功!", HintType.Finish)
             Hint("新建 .minecraft 文件夹成功!", HintType.Finish)
         End If
         End If
         McFolderListLoader.Start(IsForceRestart:=True)
         McFolderListLoader.Start(IsForceRestart:=True)

+ 3 - 1
Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb

@@ -223,7 +223,7 @@
                         DeleteDirectory(Version.Path)
                         DeleteDirectory(Version.Path)
                         Hint("版本 " & Version.Name & " 已永久删除!", HintType.Finish)
                         Hint("版本 " & Version.Name & " 已永久删除!", HintType.Finish)
                     Else
                     Else
-                        FileIO.FileSystem.DeleteDirectory(Version.Path, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
+                        FileIO.FileSystem.DeleteDirectory(Version.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
                         Hint("版本 " & Version.Name & " 已删除到回收站!", HintType.Finish)
                         Hint("版本 " & Version.Name & " 已删除到回收站!", HintType.Finish)
                     End If
                     End If
                 Case 2
                 Case 2
@@ -251,6 +251,8 @@
                 '同时出现在当前卡片与收藏夹
                 '同时出现在当前卡片与收藏夹
                 LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
                 LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
             End If
             End If
+        Catch ex As OperationCanceledException
+            Log(ex, "删除版本 " & Version.Name & " 被主动取消")
         Catch ex As Exception
         Catch ex As Exception
             Log(ex, "删除版本 " & Version.Name & " 失败", LogLevel.Msgbox)
             Log(ex, "删除版本 " & Version.Name & " 失败", LogLevel.Msgbox)
         End Try
         End Try

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

@@ -127,7 +127,7 @@
                                 <local:MyComboBoxItem Content="全屏" />
                                 <local:MyComboBoxItem Content="全屏" />
                                 <local:MyComboBoxItem Content="默认大小" IsSelected="True" ToolTip="以 854×480 的默认窗口大小启动 Minecraft" />
                                 <local:MyComboBoxItem Content="默认大小" IsSelected="True" ToolTip="以 854×480 的默认窗口大小启动 Minecraft" />
                                 <local:MyComboBoxItem Content="与启动器窗口大小一致" />
                                 <local:MyComboBoxItem Content="与启动器窗口大小一致" />
-                                <local:MyComboBoxItem Content="自定义大小" ToolTip="注意:Forge 1.12.2 等个别版本存在 Bug,会导致高度设定无效" />
+                                <local:MyComboBoxItem Content="自定义大小" ToolTip="注意:Forge 1.12 存在 Bug,会导致高度设定无效" />
                                 <local:MyComboBoxItem Content="最大化" />
                                 <local:MyComboBoxItem Content="最大化" />
                                 <local:MyComboBoxItem Content="保持游戏默认" />
                                 <local:MyComboBoxItem Content="保持游戏默认" />
                             </local:MyComboBox>
                             </local:MyComboBox>

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

@@ -433,7 +433,7 @@ PreFin:
         Try
         Try
             For Each Java In Sort(JavaList.Clone(), Function(l, r) l.VersionCode < r.VersionCode)
             For Each Java In Sort(JavaList.Clone(), Function(l, r) l.VersionCode < r.VersionCode)
                 Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
                 Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
-                ToolTipService.SetHorizontalOffset(ListItem, 0)
+                ToolTipService.SetHorizontalOffset(ListItem, 400)
                 ComboArgumentJava.Items.Add(ListItem)
                 ComboArgumentJava.Items.Add(ListItem)
                 '判断人为选中
                 '判断人为选中
                 If SelectedBySetup = "" Then Continue For
                 If SelectedBySetup = "" Then Continue For

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

@@ -345,6 +345,8 @@
             End If
             End If
             LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", LoaderFolderRunType.UpdateOnly)
             LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", LoaderFolderRunType.UpdateOnly)
 
 
+        Catch ex As OperationCanceledException
+            Log(ex, "删除 Mod 被主动取消")
         Catch ex As Exception
         Catch ex As Exception
             Log(ex, "删除 Mod 失败", LogLevel.Feedback)
             Log(ex, "删除 Mod 失败", LogLevel.Feedback)
         End Try
         End Try

+ 1 - 2
Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml

@@ -41,8 +41,7 @@
                         <TextBlock VerticalAlignment="Center" Grid.Row="2" HorizontalAlignment="Left" Text="分类" Margin="0,0,25,0" />
                         <TextBlock VerticalAlignment="Center" Grid.Row="2" HorizontalAlignment="Left" Text="分类" Margin="0,0,25,0" />
                         <local:MyComboBox Grid.Column="1" Grid.Row="2" x:Name="ComboDisplayType">
                         <local:MyComboBox Grid.Column="1" Grid.Row="2" x:Name="ComboDisplayType">
                             <local:MyComboBoxItem Content="自动" IsSelected="True" />
                             <local:MyComboBoxItem Content="自动" IsSelected="True" />
-                            <local:MyComboBoxItem Content="从版本列表中隐藏" 
-                                                  ToolTip="该版本默认将不会在版本列表中显示。&#xa;在版本列表页面按下 F11,即可查看所有隐藏的版本。" ToolTipService.HorizontalOffset="-350" />
+                            <local:MyComboBoxItem Content="从版本列表中隐藏" ToolTip="该版本默认将不会在版本列表中显示。&#xa;在版本列表页面按下 F11,即可查看所有隐藏的版本。" />
                             <local:MyComboBoxItem Content="可安装 Mod 的版本" />
                             <local:MyComboBoxItem Content="可安装 Mod 的版本" />
                             <local:MyComboBoxItem Content="常规版本" />
                             <local:MyComboBoxItem Content="常规版本" />
                             <local:MyComboBoxItem Content="不常用版本" />
                             <local:MyComboBoxItem Content="不常用版本" />

+ 3 - 1
Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml.vb

@@ -325,7 +325,7 @@
                         DeleteDirectory(PageVersionLeft.Version.Path)
                         DeleteDirectory(PageVersionLeft.Version.Path)
                         Hint("版本 " & PageVersionLeft.Version.Name & " 已永久删除!", HintType.Finish)
                         Hint("版本 " & PageVersionLeft.Version.Name & " 已永久删除!", HintType.Finish)
                     Else
                     Else
-                        FileIO.FileSystem.DeleteDirectory(PageVersionLeft.Version.Path, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
+                        FileIO.FileSystem.DeleteDirectory(PageVersionLeft.Version.Path, FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin)
                         Hint("版本 " & PageVersionLeft.Version.Name & " 已删除到回收站!", HintType.Finish)
                         Hint("版本 " & PageVersionLeft.Version.Name & " 已删除到回收站!", HintType.Finish)
                     End If
                     End If
                 Case 2
                 Case 2
@@ -333,6 +333,8 @@
             End Select
             End Select
             LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
             LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
             FrmMain.PageBack()
             FrmMain.PageBack()
+        Catch ex As OperationCanceledException
+            Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 被主动取消")
         Catch ex As Exception
         Catch ex As Exception
             Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Msgbox)
             Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Msgbox)
         End Try
         End Try

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

@@ -44,9 +44,9 @@
                         <local:MyComboBox x:Name="ComboArgumentIndie" Grid.Row="4" Grid.ColumnSpan="2" Tag="VersionArgumentIndie" Grid.Column="1">
                         <local:MyComboBox x:Name="ComboArgumentIndie" Grid.Row="4" Grid.ColumnSpan="2" Tag="VersionArgumentIndie" Grid.Column="1">
                             <local:MyComboBoxItem Content="使用全局设置" IsSelected="True" />
                             <local:MyComboBoxItem Content="使用全局设置" IsSelected="True" />
                             <local:MyComboBoxItem Content="开启" 
                             <local:MyComboBoxItem Content="开启" 
-                                                  ToolTip="让这个版本与其他版本的存档、Mod 等档案相互独立,互不干涉" ToolTipService.HorizontalOffset="-350"/>
+                                                  ToolTip="让这个版本与其他版本的存档、Mod 等档案相互独立,互不干涉" ToolTipService.HorizontalOffset="100"/>
                             <local:MyComboBoxItem Content="关闭" 
                             <local:MyComboBoxItem Content="关闭" 
-                                                  ToolTip="与其余未开启隔离的版本均使用同一档案,存档、Mod 等均为公用。&#xa;若存在不同版本的 Forge 或 Fabric,可能会由于 Mod 与版本冲突导致未知问题。" ToolTipService.HorizontalOffset="-350"/>
+                                                  ToolTip="与其余未开启隔离的版本均使用同一档案,存档、Mod 等均为公用。&#xa;若存在不同版本的 Forge 或 Fabric,可能会由于 Mod 与版本冲突导致未知问题。" ToolTipService.HorizontalOffset="100"/>
                         </local:MyComboBox>
                         </local:MyComboBox>
                         <TextBlock VerticalAlignment="Center" Grid.Row="6" HorizontalAlignment="Left" Text="游戏 Java" Margin="0,0,25,0" />
                         <TextBlock VerticalAlignment="Center" Grid.Row="6" HorizontalAlignment="Left" Text="游戏 Java" Margin="0,0,25,0" />
                         <local:MyComboBox x:Name="ComboArgumentJava" Grid.ColumnSpan="2" Grid.Row="6" Grid.Column="1" MaxDropDownHeight="240"
                         <local:MyComboBox x:Name="ComboArgumentJava" Grid.ColumnSpan="2" Grid.Row="6" Grid.Column="1" MaxDropDownHeight="240"
@@ -203,9 +203,9 @@
                     <local:MyComboBox x:Name="ComboAdvanceAssets" Grid.Row="4" Grid.ColumnSpan="2" Tag="VersionAdvanceAssets" Grid.Column="1">
                     <local:MyComboBox x:Name="ComboAdvanceAssets" Grid.Row="4" Grid.ColumnSpan="2" Tag="VersionAdvanceAssets" Grid.Column="1">
                         <local:MyComboBoxItem Content="使用全局设置" IsSelected="True" />
                         <local:MyComboBoxItem Content="使用全局设置" IsSelected="True" />
                         <local:MyComboBoxItem Content="开启" 
                         <local:MyComboBoxItem Content="开启" 
-                                              ToolTip="在启动 Minecraft 时,简单校验并下载缺失或错误的文件" ToolTipService.HorizontalOffset="-300" />
+                                              ToolTip="在启动 Minecraft 时,简单校验并下载缺失或错误的文件" ToolTipService.HorizontalOffset="100" />
                         <local:MyComboBoxItem Content="关闭" 
                         <local:MyComboBoxItem Content="关闭" 
-                                              ToolTip="完全不更改 assets;不校验 libraries、第三方登录库与版本主 jar 文件是否被修改。&#xa;如果你没有修改相关文件,请勿勾选此项。" ToolTipService.HorizontalOffset="-300" />
+                                              ToolTip="完全不更改 assets;不校验 libraries、第三方登录库与版本主 jar 文件是否被修改。&#xa;如果你没有修改相关文件,请勿勾选此项。" ToolTipService.HorizontalOffset="100" />
                     </local:MyComboBox>
                     </local:MyComboBox>
                     <TextBlock Grid.Row="6" VerticalAlignment="Center" HorizontalAlignment="Left" Text="启动前执行命令" Margin="0,0,25,3" />
                     <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"
                     <local:MyTextBox x:Name="TextAdvanceRun" Grid.Row="6" Grid.ColumnSpan="2" Tag="VersionAdvanceRun" Grid.Column="1" HintText="" Margin="0,0,0,3"

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

@@ -420,7 +420,7 @@ PreFin:
         Try
         Try
             For Each Java In Sort(JavaList.Clone(), Function(l, r) l.VersionCode < r.VersionCode)
             For Each Java In Sort(JavaList.Clone(), Function(l, r) l.VersionCode < r.VersionCode)
                 Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
                 Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
-                ToolTipService.SetHorizontalOffset(ListItem, 0)
+                ToolTipService.SetHorizontalOffset(ListItem, 400)
                 ComboArgumentJava.Items.Add(ListItem)
                 ComboArgumentJava.Items.Add(ListItem)
                 '判断人为选中
                 '判断人为选中
                 If SelectedBySetup = "" OrElse SelectedBySetup = "使用全局设置" Then Continue For
                 If SelectedBySetup = "" OrElse SelectedBySetup = "使用全局设置" Then Continue For

BIN
Plain Craft Launcher 2/Resources/java-wrapper.jar