龙腾猫跃 há 3 anos atrás
pai
commit
794c3003f3
27 ficheiros alterados com 160 adições e 89 exclusões
  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 TargetType="ComboBoxItem" x:Key="MyComboBoxItem">
                 <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.HorizontalOffset" Value="-250" />
+                <Setter Property="ToolTipService.HorizontalOffset" Value="200" />
                 <Setter Property="ToolTipService.InitialShowDelay" Value="150" />
                 <Setter Property="ToolTipService.BetweenShowDelay" Value="150" />
                 <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">
     <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="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" 
                  Stroke="{Binding BorderBrush, ElementName=PanBack}" StrokeThickness="1.2" 
                  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))
         '统计更新日志条目
 #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
             BugCount += 1
         End If
@@ -109,6 +116,11 @@ Public Class FormMain
         '3:BUG+ IMP* FEAT-
         '2:BUG* IMP-
         '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
             FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "新增内存优化功能,可以将所有程序的物理内存占用降低约 1/3"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "在选择 OptiFine 与 Fabric 后会自动选择 OptiFabric"))
@@ -366,8 +378,14 @@ Public Class FormMain
         End If
         '加载窗口
         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
         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()
         Else
             Environment.Exit(ReturnCode)
+            Process.GetCurrentProcess.Kill()
         End If
     End Sub
     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
         PanMain.Width = PanForm.Width
         PanMain.Height = Math.Max(0, PanForm.Height - PanTitle.ActualHeight)
+        If WindowState = WindowState.Maximized Then WindowState = WindowState.Normal '修复 #1938
     End Sub
 
     '最小化

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

@@ -11,12 +11,12 @@ Public Module ModBase
 #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
     Public Const VersionCode As Integer = 293 'Release
 #Else
-    Public Const VersionCode As Integer = 294 'Snapshot
+    Public Const VersionCode As Integer = 295 'Snapshot
 #End If
     '自动生成的版本信息
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName

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

@@ -468,8 +468,10 @@ NoExName:
                     '去除 “Forge/Fabric” 这一无意义提示
                     If Ex.Length < 19 AndAlso Ex.ToLower.Contains("fabric") AndAlso Ex.ToLower.Contains("forge") Then Continue For
                     '将 “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
                 Next
                 If ExName = "" Then GoTo NoExName

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

@@ -165,37 +165,37 @@
         DirectFile = Nothing
         Dim TotalFiles As New List(Of KeyValuePair(Of AnalyzeFileType, KeyValuePair(Of String, String())))
         For Each LogFile In AnalyzeRawFiles
-            Dim FileName As String = GetFileNameFromPath(LogFile.Key)
+            Dim MatchName As String = GetFileNameFromPath(LogFile.Key).ToLower
             Dim TargetType As AnalyzeFileType
-            If FileName.StartsWith("hs_err") Then
+            If MatchName.StartsWith("hs_err") Then
                 TargetType = AnalyzeFileType.HsErr
                 DirectFile = LogFile
-            ElseIf FileName.StartsWith("crash-") Then
+            ElseIf MatchName.StartsWith("crash-") Then
                 TargetType = AnalyzeFileType.CrashReport
                 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
                 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
                     TargetType = AnalyzeFileType.MinecraftLog
                     If DirectFile Is Nothing Then DirectFile = LogFile
                 Else
                     TargetType = AnalyzeFileType.ExtraLog
                 End If
-            ElseIf FileName.EndsWith(".log") OrElse FileName.EndsWith(".txt") Then
+            ElseIf MatchName.EndsWith(".log") OrElse MatchName.EndsWith(".txt") Then
                 TargetType = AnalyzeFileType.ExtraLog
             Else
-                Log("[Crash] " & FileName & " 分类为 Ignore")
+                Log("[Crash] " & MatchName & " 分类为 Ignore")
                 Continue For
             End If
             If LogFile.Value.Count = 0 Then
-                Log("[Crash] " & FileName & " 由于内容为空跳过")
+                Log("[Crash] " & MatchName & " 由于内容为空跳过")
             Else
                 TotalFiles.Add(New KeyValuePair(Of AnalyzeFileType, KeyValuePair(Of String, String()))(TargetType, LogFile))
-                Log("[Crash] " & FileName & " 分类为 " & GetStringFromEnum(TargetType))
+                Log("[Crash] " & MatchName & " 分类为 " & GetStringFromEnum(TargetType))
             End If
         Next
 
@@ -364,6 +364,7 @@
         NightConfig的Bug
         ShadersMod与Optifine同时安装
         Forge安装不完整
+        Mod需要Java11
     End Enum
     ''' <summary>
     ''' 根据 AnalyzeLogs 与可能的版本信息分析崩溃原因。
@@ -469,6 +470,7 @@ Done:
             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("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.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不兼容)
@@ -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("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("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("Invalid maximum heap size") Then AppendReason(CrashReason.使用32位Java导致JVM无法分配足够多的内存)
             If LogMc.Contains("Could not reserve enough space") Then
                 If LogMc.Contains("for 1048576KB object heap") Then
                     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("ModResolutionException: Duplicate") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(If(RegexSeek(LogMc, "ModResolutionException: Duplicate[^\n]+"), ""), "[^\\/]+.jar", RegularExpressions.RegexOptions.IgnoreCase))
             '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)")
                 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, "(?<= 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, "[^./ \]]+(?=.mixins.json")
@@ -622,11 +626,11 @@ NextStack:
                 Dim Word As String = Splited(i)
                 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",
-                    "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",
                     "common", "server", "config", "loader", "launch", "entity", "assist", "client", "plugin", "modapi", "mojang", "shader", "events", "github", "recipe",
                     "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
                 PossibleWords.Add(Word.Trim)
             Next
@@ -818,9 +822,9 @@ NextStack:
                     Results.Add("由于有 Mod 的名称包含特殊字符,导致游戏崩溃。\n请尝试修改 Mod 文件名,让它只包含英文字母、数字、减号(-)、下划线(_)和小数点,然后再启动游戏。")
                 Case CrashReason.使用32位Java导致JVM无法分配足够多的内存
                     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
-                        Results.Add("你正在使用 32 位的操作系统,这会导致 Minecraft 无法使用 1GB 以上的内存,进而造成崩溃。\n\n你或许只能重装 64 位的操作系统来解决此问题。\n如果你的电脑内存在 2GB 以内,那或许只能换台电脑了……\h")
+                        Results.Add("你正在使用 32 位的操作系统,这会导致 Minecraft 无法使用所需的内存,进而造成崩溃。\n\n你或许只能重装 64 位的操作系统来解决此问题。\n如果你的电脑内存在 2GB 以内,那或许只能换台电脑了……\h")
                     End If
                 Case CrashReason.崩溃日志堆栈分析发现关键字, CrashReason.MC日志堆栈分析发现关键字
                     If Additional.Count = 1 Then
@@ -886,6 +890,8 @@ NextStack:
                     Results.Add("可能由于使用其他启动器修改了 Forge 版本,当前版本的文件存在异常,导致了游戏崩溃。\n请尝试重新全新安装 Forge,而非使用其他启动器修改 Forge 版本。")
                 Case CrashReason.玩家手动触发调试崩溃
                     Results.Add("* 事实上,你的游戏没有任何问题,这是你自己触发的崩溃。\n* 你难道没有更重要的事要做吗?")
+                Case CrashReason.Mod需要Java11
+                    Results.Add("你所安装的部分 Mod 似乎需要使用 Java 11 启动。\n请在启动设置的 Java 选择一项中改用 Java 11,然后再启动游戏。\n如果你没有安装 Java 11,你可以从网络中下载、安装一个。")
                 Case CrashReason.极短的程序输出
                     Results.Add($"程序返回了以下信息:\n{Additional.First}\n\h")
                 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(vbCrLf, vbCr).Replace(vbLf, vbCr).Replace(vbCr, vbCrLf).
                     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 Class

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

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

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

@@ -1115,11 +1115,14 @@ SystemBrowser:
         'OptiFine 检测
         If McVersionCurrent.Version.HasOptiFine 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)
             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)
+            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
 
@@ -1129,12 +1132,12 @@ SystemBrowser:
                 '1.7.2:必须 Java 7
                 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
-                '<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)
-            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
                 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
                 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

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

@@ -3105,7 +3105,10 @@ VersionFindFail:
             '弹窗结果
             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
 
         Catch ex As Exception

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

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

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

@@ -553,7 +553,7 @@ Public Module ModDownloadLib
                                                                              '拷贝原版文件
                                                                              If Not IsCustomFolder Then Exit Sub
                                                                              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)
                                                                                  If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") Then
                                                                                      CopyFile(ClientDownloadLoader.Input & ClientName & ".json",

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

@@ -571,10 +571,23 @@
                 NewCard.IsSwaped = True
                 PanMinecraft.Children.Add(NewCard)
             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
             Log(ex, "可视化安装版本列表出错", LogLevel.Feedback)
         End Try
     End Sub
+    ''' <summary>
+    ''' 当 MC 版本列表加载完时,立即自动选择的版本。用于外部调用。
+    ''' </summary>
+    Public Shared McVersionWaitingForSelect As String = Nothing
 
 #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" />
                         <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.1" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.19.4" />
                             <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" />
                         <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.1" />
                             <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.19.4" />
                             <local:MyComboBoxItem Content="1.18.2" />
@@ -65,7 +66,7 @@
                             <local:MyComboBoxItem Tag="4736/" Content="空岛" />
                             <local:MyComboBoxItem Tag="5128/" Content="原版改良" />
                             <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="4481/lightweight" 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
             Case 0
                 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
                     Return New EqualableList(Of String) From {0, ""}
                 Else
@@ -526,11 +526,12 @@ Finish:
 
     '版本选择按钮
     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)
     End Sub
     '启动按钮
     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
             ThemeUnlock(12, False, "隐藏主题 滑稽彩 已解锁!")
@@ -625,8 +626,9 @@ ExitRefresh:
             End Try
         End If
     End Sub
-    '更多按钮
+    '版本设置按钮
     Private Sub BtnMore_Click(sender As Object, e As EventArgs) Handles BtnMore.Click
+        If McLaunchLoader.State = LoadState.Loading Then Exit Sub
         McVersionCurrent.Load()
         PageVersionLeft.Version = McVersionCurrent
         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)
         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.Text = Input
         Else
@@ -26,7 +26,7 @@ Public Class PageLoginLegacy
                 ComboName.ItemsSource = Nothing
             Else
                 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
         IsReloaded = True
@@ -50,17 +50,14 @@ Public Class PageLoginLegacy
         Return IsVaild(GetLoginData())
     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 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)
     End Sub
     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\versions\")
             Setup.Set("LaunchFolderSelect", "$.minecraft\")
+            McFolderLauncherProfilesJsonCreate(Path & ".minecraft\")
             Hint("新建 .minecraft 文件夹成功!", HintType.Finish)
         End If
         McFolderListLoader.Start(IsForceRestart:=True)

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

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

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

@@ -127,7 +127,7 @@
                                 <local:MyComboBoxItem Content="全屏" />
                                 <local:MyComboBoxItem Content="默认大小" IsSelected="True" ToolTip="以 854×480 的默认窗口大小启动 Minecraft" />
                                 <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:MyComboBox>

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

@@ -433,7 +433,7 @@ PreFin:
         Try
             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}
-                ToolTipService.SetHorizontalOffset(ListItem, 0)
+                ToolTipService.SetHorizontalOffset(ListItem, 400)
                 ComboArgumentJava.Items.Add(ListItem)
                 '判断人为选中
                 If SelectedBySetup = "" Then Continue For

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

@@ -345,6 +345,8 @@
             End If
             LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", LoaderFolderRunType.UpdateOnly)
 
+        Catch ex As OperationCanceledException
+            Log(ex, "删除 Mod 被主动取消")
         Catch ex As Exception
             Log(ex, "删除 Mod 失败", LogLevel.Feedback)
         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" />
                         <local:MyComboBox Grid.Column="1" Grid.Row="2" x:Name="ComboDisplayType">
                             <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="常规版本" />
                             <local:MyComboBoxItem Content="不常用版本" />

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

@@ -325,7 +325,7 @@
                         DeleteDirectory(PageVersionLeft.Version.Path)
                         Hint("版本 " & PageVersionLeft.Version.Name & " 已永久删除!", HintType.Finish)
                     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)
                     End If
                 Case 2
@@ -333,6 +333,8 @@
             End Select
             LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
             FrmMain.PageBack()
+        Catch ex As OperationCanceledException
+            Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 被主动取消")
         Catch ex As Exception
             Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Msgbox)
         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:MyComboBoxItem Content="使用全局设置" IsSelected="True" />
                             <local:MyComboBoxItem Content="开启" 
-                                                  ToolTip="让这个版本与其他版本的存档、Mod 等档案相互独立,互不干涉" ToolTipService.HorizontalOffset="-350"/>
+                                                  ToolTip="让这个版本与其他版本的存档、Mod 等档案相互独立,互不干涉" ToolTipService.HorizontalOffset="100"/>
                             <local:MyComboBoxItem Content="关闭" 
-                                                  ToolTip="与其余未开启隔离的版本均使用同一档案,存档、Mod 等均为公用。&#xa;若存在不同版本的 Forge 或 Fabric,可能会由于 Mod 与版本冲突导致未知问题。" ToolTipService.HorizontalOffset="-350"/>
+                                                  ToolTip="与其余未开启隔离的版本均使用同一档案,存档、Mod 等均为公用。&#xa;若存在不同版本的 Forge 或 Fabric,可能会由于 Mod 与版本冲突导致未知问题。" ToolTipService.HorizontalOffset="100"/>
                         </local:MyComboBox>
                         <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"
@@ -203,9 +203,9 @@
                     <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="-300" />
+                                              ToolTip="在启动 Minecraft 时,简单校验并下载缺失或错误的文件" ToolTipService.HorizontalOffset="100" />
                         <local:MyComboBoxItem Content="关闭" 
-                                              ToolTip="完全不更改 assets;不校验 libraries、第三方登录库与版本主 jar 文件是否被修改。&#xa;如果你没有修改相关文件,请勿勾选此项。" ToolTipService.HorizontalOffset="-300" />
+                                              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"

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

@@ -420,7 +420,7 @@ PreFin:
         Try
             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}
-                ToolTipService.SetHorizontalOffset(ListItem, 0)
+                ToolTipService.SetHorizontalOffset(ListItem, 400)
                 ComboArgumentJava.Items.Add(ListItem)
                 '判断人为选中
                 If SelectedBySetup = "" OrElse SelectedBySetup = "使用全局设置" Then Continue For

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