From 06b50fa74cbb0547e6b310b6a49cc57214468292 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=99=E8=85=BE=E7=8C=AB=E8=B7=83?= <1043137532@qq.com> Date: Thu, 26 Jan 2023 01:50:52 +0800 Subject: [PATCH] 2.4.6 --- .../Controls/MyListItem.xaml.vb | 3 +- .../Controls/MyRadioBox.xaml.vb | 2 + Plain Craft Launcher 2/FormMain.xaml | 2 +- Plain Craft Launcher 2/FormMain.xaml.vb | 56 +++-- .../Modules/Base/ModBase.vb | 36 ++-- .../Modules/Base/ModLoader.vb | 4 +- Plain Craft Launcher 2/Modules/Base/ModNet.vb | 2 +- .../Modules/Base/ModValidate.vb | 67 +++++- .../Modules/Minecraft/ModCrash.vb | 6 +- .../Modules/Minecraft/ModDownload.vb | 11 +- .../Modules/Minecraft/ModLaunch.vb | 16 +- .../Modules/Minecraft/ModMinecraft.vb | 192 ++++++++++-------- .../Modules/Minecraft/ModModpack.vb | 17 +- Plain Craft Launcher 2/Modules/ModEvent.vb | 2 +- .../My Project/AssemblyInfo.vb | 4 +- .../Pages/PageDownload/ModDownloadLib.vb | 20 +- .../Pages/PageDownload/MyCfItem.xaml | 2 +- .../PageDownload/PageDownloadInstall.xaml.vb | 2 + .../PageDownload/PageDownloadLeft.xaml.vb | 9 + .../Pages/PageDownload/PageDownloadPack.xaml | 2 +- .../Pages/PageLink/PageLinkLeft.xaml.vb | 1 + .../Pages/PageOther/PageOtherLeft.xaml.vb | 2 + .../Pages/PageSetup/PageSetupLaunch.xaml.vb | 2 + .../Pages/PageSetup/PageSetupLeft.xaml.vb | 4 + .../Pages/PageSpeedLeft.xaml.vb | 8 +- .../Pages/PageVersion/PageVersionLeft.xaml.vb | 3 + .../Pages/PageVersion/PageVersionMod.xaml.vb | 9 +- .../PageVersion/PageVersionModDisabled.xaml | 2 +- Plain Craft Launcher 2/Resources/Help.zip | Bin 69464 -> 70164 bytes 29 files changed, 317 insertions(+), 169 deletions(-) diff --git a/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb b/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb index 42a1761..1f860f4 100644 --- a/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb +++ b/Plain Craft Launcher 2/Controls/MyListItem.xaml.vb @@ -461,8 +461,8 @@ AniStart(Anim, "MyListItem Checked " & Uuid) Else '不使用动画 + AniStop("MyListItem Checked " & Uuid) If Checked Then - 'If Not IsNothing(RectCheck) Then RectCheck.Width = 4 If Not IsNothing(RectCheck) Then RectCheck.Height = Double.NaN RectCheck.Margin = New Thickness(-1, 6, 0, 6) @@ -471,7 +471,6 @@ End If SetResourceReference(ForegroundProperty, "ColorBrush3") Else - 'If Not IsNothing(RectCheck) Then RectCheck.Width = 0 If Not IsNothing(RectCheck) Then RectCheck.Height = 0 RectCheck.Margin = New Thickness(-1, 0, 0, 0) diff --git a/Plain Craft Launcher 2/Controls/MyRadioBox.xaml.vb b/Plain Craft Launcher 2/Controls/MyRadioBox.xaml.vb index 5e8c833..3cb814c 100644 --- a/Plain Craft Launcher 2/Controls/MyRadioBox.xaml.vb +++ b/Plain Craft Launcher 2/Controls/MyRadioBox.xaml.vb @@ -223,6 +223,8 @@ AniStart(AaColor(ShapeBorder, Ellipse.StrokeProperty, If(IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray4"), AnimationTimeOfMouseOut), "MyRadioBox BorderColor " & Uuid) AniStart(AaColor(LabText, TextBlock.ForegroundProperty, If(IsEnabled, "ColorBrush1", "ColorBrushGray4"), AnimationTimeOfMouseOut), "MyRadioBox TextColor " & Uuid) Else + AniStop("MyRadioBox BorderColor " & Uuid) + AniStop("MyRadioBox TextColor " & Uuid) ShapeBorder.SetResourceReference(Ellipse.StrokeProperty, If(IsEnabled, If(Checked, "ColorBrush2", "ColorBrush1"), "ColorBrushGray4")) LabText.SetResourceReference(TextBlock.ForegroundProperty, If(IsEnabled, "ColorBrush1", "ColorBrushGray4")) End If diff --git a/Plain Craft Launcher 2/FormMain.xaml b/Plain Craft Launcher 2/FormMain.xaml index 881cfcc..68a6a78 100644 --- a/Plain Craft Launcher 2/FormMain.xaml +++ b/Plain Craft Launcher 2/FormMain.xaml @@ -4,7 +4,7 @@ xmlns:local="clr-namespace:PCL" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Name="WindMain" x:Class="FormMain" Style="{StaticResource MyWindow}" - AllowDrop="True" Topmost="True" Title="Plain Craft Launcher 2 " AllowsTransparency="True" MinHeight="470" MinWidth="780" ScrollViewer.VerticalScrollBarVisibility="Disabled" Icon="/Plain Craft Launcher 2;component/Images/icon.ico" Left="-10000" WindowStyle="None" ResizeMode="CanMinimize" Background="{x:Null}" d:DesignWidth="870" d:DesignHeight="520" Width="850" Height="500" RenderTransformOrigin="0.5,0.5"> + AllowDrop="True" Topmost="True" Title="Plain Craft Launcher 2 " AllowsTransparency="True" MinHeight="470" MinWidth="780" ScrollViewer.VerticalScrollBarVisibility="Disabled" Icon="/Plain Craft Launcher 2;component/Images/icon.ico" WindowStyle="None" ResizeMode="CanMinimize" Background="{x:Null}" d:DesignWidth="870" d:DesignHeight="520" Width="850" Height="500" RenderTransformOrigin="0.5,0.5"> diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 80f50da..8b98606 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -10,12 +10,13 @@ Public Class FormMain Dim FeatureList As New List(Of KeyValuePair(Of Integer, String)) '统计更新日志条目 #If BETA Then - If LastVersion < 274 Then 'Release 2.4.5 + If LastVersion < 276 Then 'Release 2.4.6 FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "增加 在游戏启动前执行命令 设置")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "在百宝箱添加了清理 MC 日志、崩溃报告的按钮")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化界面动画,修改部分配色")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化 Mod 中文搜索")) - FeatureCount += 17 - BugCount += 35 + FeatureCount += 25 + BugCount += 56 End If If LastVersion < 272 Then 'Release 2.4.4 FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "支持在版本设置页导出启动脚本、打开存档文件夹等")) @@ -116,6 +117,11 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- + If LastVersion < 277 Then 'Snapshot 2.4.6 + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "在百宝箱添加了清理 MC 日志、崩溃报告的按钮")) + FeatureCount += 8 + BugCount += 21 + End If If LastVersion < 275 Then 'Snapshot 2.4.5 FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "增加 在游戏启动前执行命令 设置")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化界面动画,修改部分配色")) @@ -395,7 +401,7 @@ Public Class FormMain AaCode(Sub() PanBack.RenderTransform = Nothing IsWindowLoadFinished = True - Log("[System] DPI:" & DPI & ",工作区尺寸:" & My.Computer.Screen.WorkingArea.Width & " x " & My.Computer.Screen.WorkingArea.Height & ",系统版本:" & OsVersion.ToString) + Log($"[System] DPI:{DPI},系统版本:{OsVersion},PCL 位置:{PathWithName}") End Sub, , True) }, "Form Show") 'Timer 启动 @@ -552,17 +558,22 @@ Reopen: If PanBack.RenderTransform Is Nothing Then Dim TransformPos As New TranslateTransform(0, 0) Dim TransformRotate As New RotateTransform(0) - PanBack.RenderTransform = New TransformGroup() With {.Children = New TransformCollection({TransformRotate, TransformPos})} + Dim TransformScale As New ScaleTransform(1, 1) + PanBack.RenderTransform = New TransformGroup() With {.Children = New TransformCollection({TransformRotate, TransformPos, TransformScale})} AniStart({ - AaOpacity(Me, -Opacity, 150, 50), - AaDouble(Sub(i) TransformPos.Y += i, 30 - TransformPos.Y, 200, 0, New AniEaseOutFluent(AniEasePower.Weak)), - AaDouble(Sub(i) TransformRotate.Angle += i, 1 - TransformRotate.Angle, 200, 0, New AniEaseOutFluent(AniEasePower.Weak)), + AaOpacity(Me, -Opacity, 140, 40, New AniEaseOutFluent(AniEasePower.Weak)), + AaDouble(Sub(i) + TransformScale.ScaleX += i + TransformScale.ScaleY += i + End Sub, 0.88 - TransformScale.ScaleX, 180), + AaDouble(Sub(i) TransformPos.Y += i, 20 - TransformPos.Y, 180, 0, New AniEaseOutFluent(AniEasePower.Weak)), + AaDouble(Sub(i) TransformRotate.Angle += i, 0.6 - TransformRotate.Angle, 180, 0, New AniEaseInoutFluent(AniEasePower.Weak)), AaCode(Sub() IsHitTestVisible = False Top = -10000 ShowInTaskbar = False - End Sub, 225), - AaCode(AddressOf EndProgramForce, 250) + End Sub, 210), + AaCode(AddressOf EndProgramForce, 230) }, "Form Close") Else EndProgramForce() @@ -581,7 +592,7 @@ Reopen: If ReturnCode = Result.Exception Then If Not IsLogShown Then FeedbackInfo() - Log("请在 https://jinshuju.net/f/rP4b6E?x_field_1=crash 提交错误报告,以便于作者解决此问题!") + Log("请在 https://github.com/Hex-Dragon/PCL2/issues 提交错误报告,以便于作者解决此问题!") IsLogShown = True ShellOnly(Path & "PCL\Log1.txt") End If @@ -729,7 +740,7 @@ Reopen: Dim AuthlibServer As String = Net.WebUtility.UrlDecode(Str.Substring("authlib-injector:yggdrasil-server:".Length)) Log("[System] Authlib 拖拽:" & AuthlibServer) If Not String.IsNullOrEmpty(New ValidateHttp().Validate(AuthlibServer)) Then - Hint("输入的 Authlib 验证服务器不符合网址格式(" & AuthlibServer & ")!", HintType.Critical) + Hint($"输入的 Authlib 验证服务器不符合网址格式({AuthlibServer})!", HintType.Critical) Exit Sub End If If McVersionCurrent Is Nothing Then @@ -738,7 +749,7 @@ Reopen: End If If AuthlibServer = "https://littleskin.cn/api/yggdrasil" Then 'LittleSkin - If MyMsgBox("是否要在版本 " & McVersionCurrent.Name & " 中开启 LittleSkin 登录?" & vbCrLf & + If MyMsgBox($"是否要在版本 {McVersionCurrent.Name} 中开启 LittleSkin 登录?" & vbCrLf & "你可以在 版本设置 → 设置 → 服务器选项 中修改登录方式。", "第三方登录开启确认", "确定", "取消") = 2 Then Exit Sub End If @@ -748,8 +759,8 @@ Reopen: Setup.Set("VersionServerAuthName", "LittleSkin 登录", Version:=McVersionCurrent) Else '第三方 Authlib 服务器 - If MyMsgBox("是否要在版本 " & McVersionCurrent.Name & " 中开启第三方登录?" & vbCrLf & - "登录服务器:" & AuthlibServer & vbCrLf & vbCrLf & + If MyMsgBox($"是否要在版本 {McVersionCurrent.Name} 中开启第三方登录?" & vbCrLf & + $"登录服务器:{AuthlibServer}" & vbCrLf & vbCrLf & "你可以在 版本设置 → 设置 → 服务器选项 中修改登录方式。", "第三方登录开启确认", "确定", "取消") = 2 Then Exit Sub End If @@ -792,9 +803,10 @@ Reopen: Dim FilePath As String = FilePathList.First Log("[System] 接受文件拖拽:" & FilePath, LogLevel.Developer) RunInNewThread(Sub() + Dim Extension As String = FilePath.Split(".").Last.ToLower 'Mod 安装 - If FilePath.Split(".").Last.ToLower = "jar" Then - Log("[System] 文件为 jar 格式,尝试作为 Mod 安装") + If {"jar", "litemod"}.Contains(Extension) Then + Log("[System] 文件为 jar/litemod 格式,尝试作为 Mod 安装") '获取并检查目标版本 Dim TargetVersion As McVersion = McVersionCurrent If PageCurrent = PageType.VersionSetup Then TargetVersion = PageVersionLeft.Version @@ -803,7 +815,7 @@ Reopen: Hint("若要安装 Mod,请先选择一个可以安装 Mod 的版本!") ElseIf Not (PageCurrent = PageType.VersionSetup AndAlso PageCurrentSub = PageSubType.VersionMod) Then '未处于 Mod 管理页面 - If MyMsgBox("是否要将这些文件作为 Mod 安装到 " & TargetVersion.Name & "?", "Mod 安装确认", "确定", "取消") = 1 Then GoTo Install + If MyMsgBox($"是否要将这些文件作为 Mod 安装到 {TargetVersion.Name}?", "Mod 安装确认", "确定", "取消") = 1 Then GoTo Install Else '处于 Mod 管理页面 Install: @@ -812,9 +824,9 @@ Install: CopyFile(ModFile, TargetVersion.PathIndie & "mods\" & GetFileNameFromPath(ModFile)) Next If FilePathList.Count = 1 Then - Hint("已安装 " & GetFileNameFromPath(FilePathList.First) & "!", HintType.Finish) + Hint($"已安装 {GetFileNameFromPath(FilePathList.First)}!", HintType.Finish) Else - Hint("已安装 " & FilePathList.Count & " 个 Mod!", HintType.Finish) + Hint($"已安装 {FilePathList.Count} 个 Mod!", HintType.Finish) End If '刷新列表 If PageCurrent = PageType.VersionSetup AndAlso PageCurrentSub = PageSubType.VersionMod Then @@ -827,12 +839,12 @@ Install: Exit Sub End If '安装整合包 - If {"zip", "rar"}.Contains(FilePath.Split(".").Last.ToLower) Then '部分压缩包是 zip 格式但后缀为 rar,总之试一试 + If {"zip", "rar"}.Contains(Extension) Then '部分压缩包是 zip 格式但后缀为 rar,总之试一试 Log("[System] 文件为压缩包,尝试作为整合包安装") If ModpackInstall(FilePath, ShowHint:=False) Then Exit Sub End If 'RAR 处理 - If FilePath.Split(".").Last.ToLower = "rar" Then + If Extension = "rar" Then Hint("PCL2 无法处理 rar 格式的压缩包,请在解压后重新压缩为 zip 格式再试!") Exit Sub End If diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index c5ddf79..61d8c4c 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -10,12 +10,12 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.4.5" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.4.5." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.4.6" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.4.6." & VersionBranchCode '标准格式的四段式版本号 #If BETA Then - Public Const VersionCode As Integer = 274 'Release + Public Const VersionCode As Integer = 276 'Release #Else - Public Const VersionCode As Integer = 275 'Snapshot + Public Const VersionCode As Integer = 277 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName @@ -743,11 +743,12 @@ Public Module ModBase ''' 从文件路径或者 Url 获取不包含路径的文件名。不包含文件名将会抛出异常。 ''' Public Function GetFileNameFromPath(FilePath As String) As String - If FilePath.EndsWith("\") OrElse FilePath.EndsWith("/") Then Throw New Exception("不包含文件名:" & FilePath) - If Not (FilePath.Contains("\") OrElse FilePath.Contains("/")) Then Return FilePath - If FilePath.Contains("?") Then FilePath = Left(FilePath, FilePath.LastIndexOf("?")) '去掉网络参数后的 ? - GetFileNameFromPath = Mid(FilePath, FilePath.LastIndexOfAny({"\", "/"}) + 2) - If GetFileNameFromPath = "" Then Throw New Exception("不包含文件名:" & FilePath) + FilePath = FilePath.Replace("/", "\") + If FilePath.EndsWith("\") Then Throw New Exception("不包含文件名:" & FilePath) + Dim FileName As String = FilePath.Split("\").Last.Split("?").First '去掉网络参数后的 ? + If FileName.Length = 0 Then Throw New Exception("不包含文件名:" & FilePath) + If FileName.Length > 250 Then Throw New PathTooLongException("文件名过长:" & FilePath) + Return FileName End Function ''' ''' 从文件路径或者 Url 获取不包含路径与扩展名的文件名。不包含文件名将会抛出异常。 @@ -1266,15 +1267,17 @@ Re: End Function ''' - ''' 删除文件夹。失败会抛出异常。 + ''' 删除文件夹,返回删除的文件个数。通过参数选择是否抛出异常。 ''' - Public Sub DeleteDirectory(Path As String, Optional IgnoreIssue As Boolean = False) - If Not Directory.Exists(Path) Then Exit Sub + Public Function DeleteDirectory(Path As String, Optional IgnoreIssue As Boolean = False) As Integer + If Not Directory.Exists(Path) Then Return 0 + Dim DeletedCount As Integer = 0 Dim Temp As String() Temp = Directory.GetFiles(Path) For Each str As String In Temp Try File.Delete(str) + DeletedCount += 1 Catch ex As Exception If IgnoreIssue Then Log(ex, "删除单个文件可忽略地失败") @@ -1296,13 +1299,16 @@ Re: Throw End If End Try - '这个也不靠谱,目录不是空的警告 - 'My.Computer.FileSystem.DeleteDirectory(Path, FileIO.DeleteDirectoryOption.DeleteAllContents) - End Sub + Return DeletedCount + End Function ''' ''' 复制文件夹,失败会抛出异常。 ''' Public Sub CopyDirectory(FromPath As String, ToPath As String) + FromPath = FromPath.Replace("/", "\") + If Not FromPath.EndsWith("\") Then FromPath &= "\" + ToPath = ToPath.Replace("/", "\") + If Not ToPath.EndsWith("\") Then ToPath &= "\" For Each File In EnumerateFiles(FromPath) CopyFile(File.FullName, File.FullName.Replace(FromPath, ToPath)) Next diff --git a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb index 6df0b92..af23207 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModLoader.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModLoader.vb @@ -236,7 +236,9 @@ ''' Public ReadOnly Property IsAborted As Boolean Get - Return LastRunningThread Is Nothing OrElse Not ReferenceEquals(Thread.CurrentThread, LastRunningThread) + Return LastRunningThread Is Nothing OrElse + Not ReferenceEquals(Thread.CurrentThread, LastRunningThread) OrElse + State = LoadState.Aborted End Get End Property ''' diff --git a/Plain Craft Launcher 2/Modules/Base/ModNet.vb b/Plain Craft Launcher 2/Modules/Base/ModNet.vb index acf1464..eab6ec7 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModNet.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModNet.vb @@ -1653,7 +1653,7 @@ NextElement: Retry: Try Log("[Download] 复制已存在的文件(" & LocalPath & ")") - FileIO.FileSystem.CopyFile(LocalPath, File.LocalPath, True) + CopyFile(LocalPath, File.LocalPath) File.Finish(False) Catch ex As Exception RetryCount += 1 diff --git a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb index 3e10a9f..aeb4192 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModValidate.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModValidate.vb @@ -15,6 +15,8 @@ End Class ''' Public Class ValidateNullable Inherits Validate + Public Sub New() + End Sub Public Overrides Function Validate(Str As String) As String If IsNothing(Str) OrElse String.IsNullOrEmpty(Str) Then Return Nothing Return "" @@ -26,6 +28,8 @@ End Class ''' Public Class ValidateNullOrEmpty Inherits Validate + Public Sub New() + End Sub Public Overrides Function Validate(Str As String) As String If IsNothing(Str) OrElse String.IsNullOrEmpty(Str) Then Return "输入内容不能为空!" Return "" @@ -37,6 +41,8 @@ End Class ''' Public Class ValidateNullOrWhiteSpace Inherits Validate + Public Sub New() + End Sub Public Overrides Function Validate(Str As String) As String If IsNothing(Str) OrElse String.IsNullOrWhiteSpace(Str) Then Return "输入内容不能为空!" Return "" @@ -161,6 +167,8 @@ Public Class ValidateExceptSame Public Property Excepts As ObjectModel.Collection(Of String) = New ObjectModel.Collection(Of String) Public Property ErrorMessage As String Public Property IgnoreCase As Boolean = False + Public Sub New() + End Sub Public Sub New(Excepts As ObjectModel.Collection(Of String), Optional ErrorMessage As String = "输入内容不能为 %!", Optional IgnoreCase As Boolean = False) Me.Excepts = Excepts Me.ErrorMessage = ErrorMessage @@ -197,6 +205,8 @@ Public Class ValidateFolderName Public Property UseMinecraftCharCheck As Boolean = True Public Property IgnoreCase As Boolean = True Private ReadOnly PathIgnore As IEnumerable(Of DirectoryInfo) + Public Sub New() + End Sub Public Sub New(Path As String, Optional UseMinecraftCharCheck As Boolean = True, Optional IgnoreCase As Boolean = True) Me.Path = Path Me.IgnoreCase = IgnoreCase @@ -221,7 +231,7 @@ Public Class ValidateFolderName Dim CharactCheck As String = New ValidateExcept(IO.Path.GetInvalidFileNameChars() & If(UseMinecraftCharCheck, "!;", ""), "文件夹名不可包含 % 字符!").Validate(Str) If Not CharactCheck = "" Then Return CharactCheck '检查特殊字符串 - Dim InvalidStrCheck As String = New ValidateExceptSame({"CON", "PRN", "AUX", "CLOCK$", "NUL", "COM0", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT0", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"}, "文件夹名不可为 %!").Validate(Str) + Dim InvalidStrCheck As String = New ValidateExceptSame({"CON", "PRN", "AUX", "CLOCK$", "NUL", "COM0", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT0", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"}, "文件夹名不可为 %!", True).Validate(Str) If Not InvalidStrCheck = "" Then Return InvalidStrCheck '检查文件夹重名 Dim Arr As New List(Of String) @@ -240,6 +250,61 @@ Public Class ValidateFolderName End Function End Class +''' +''' 对文件名的粗略的特化检测。 +''' +Public Class ValidateFileName + Inherits Validate + Public Property Name As String + Public Property UseMinecraftCharCheck As Boolean = True + Public Property IgnoreCase As Boolean = True + Public Property ParentFolder As String = Nothing + Public Property RequireParentFolderExists = True + Public Sub New() + End Sub + Public Sub New(Name As String, Optional UseMinecraftCharCheck As Boolean = True, Optional IgnoreCase As Boolean = True) + Me.Name = Name + Me.IgnoreCase = IgnoreCase + Me.UseMinecraftCharCheck = UseMinecraftCharCheck + End Sub + Public Overrides Function Validate(Str As String) As String + Try + '检查是否为空 + Dim LengthCheck As String = New ValidateNullOrWhiteSpace().Validate(Str) + If Not LengthCheck = "" Then Return LengthCheck + '检查空格 + If Str.StartsWith(" ") Then Return "文件名不能以空格开头!" + If Str.EndsWith(" ") Then Return "文件名不能以空格结尾!" + '检查长度 + LengthCheck = New ValidateLength(1, 253).Validate(Str & If(ParentFolder, "")) + If Not LengthCheck = "" Then Return LengthCheck + '检查尾部小数点 + If Str.EndsWith(".") Then Return "文件名不能以小数点结尾!" + '检查特殊字符 + Dim CharactCheck As String = New ValidateExcept(IO.Path.GetInvalidFileNameChars() & If(UseMinecraftCharCheck, "!;", ""), "文件名不可包含 % 字符!").Validate(Str) + If Not CharactCheck = "" Then Return CharactCheck + '检查特殊字符串 + Dim InvalidStrCheck As String = New ValidateExceptSame({"CON", "PRN", "AUX", "CLOCK$", "NUL", "COM0", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT0", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"}, "文件名不可为 %!", True).Validate(Str) + If Not InvalidStrCheck = "" Then Return InvalidStrCheck + '检查文件重名 + If ParentFolder IsNot Nothing Then + Dim DirInfo As New DirectoryInfo(ParentFolder) + If DirInfo.Exists Then + Dim SameNameCheck = New ValidateExceptSame(DirInfo.EnumerateFiles("*").Select(Function(f) f.Name), + "不可与现有文件重名!", IgnoreCase).Validate(Str) + If Not SameNameCheck = "" Then Return SameNameCheck + Else + If RequireParentFolderExists Then Return $"父文件夹不存在:{ParentFolder}" + End If + End If + Return "" + Catch ex As Exception + Log(ex, "检查文件名出错") + Return "错误:" & ex.Message + End Try + End Function +End Class + ''' ''' 要求输入一个可用的文件夹路径。 ''' diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb index fd9483a..26f1c3a 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb @@ -329,6 +329,7 @@ 显卡不支持OpenGL 使用OpenJ9 Java版本过高 + Java版本不兼容 显卡驱动不支持导致无法设置像素格式 路径包含中文且存在编码问题导致找不到或无法加载主类 Intel驱动不兼容导致EXCEPTION_ACCESS_VIOLATION 'https://bugs.mojang.com/browse/MC-32606 @@ -465,7 +466,6 @@ Done: If LogMc.Contains("TRANSFORMER/net.optifine/net.optifine.reflect.Reflector.(Reflector.java") Then AppendReason(CrashReason.OptiFine与Forge不兼容) If LogMc.Contains("Open J9 is not supported") OrElse LogMc.Contains("OpenJ9 is incompatible") OrElse LogMc.Contains(".J9VMInternals.") Then AppendReason(CrashReason.使用OpenJ9) If LogMc.Contains("java.lang.NoSuchFieldException: ucp") Then AppendReason(CrashReason.Java版本过高) - If LogMc.Contains("Unsupported class file major version") Then AppendReason(CrashReason.Java版本过高) If LogMc.Contains("because module java.base does not export") Then AppendReason(CrashReason.Java版本过高) If LogMc.Contains("java.lang.ClassNotFoundException: jdk.nashorn.api.scripting.NashornScriptEngineFactory") Then AppendReason(CrashReason.Java版本过高) If LogMc.Contains("java.lang.ClassNotFoundException: java.lang.invoke.LambdaMetafactory") Then AppendReason(CrashReason.Java版本过高) @@ -480,6 +480,8 @@ Done: If LogMc.Contains("A potential solution has been determined:") Then AppendReason(CrashReason.Fabric报错并给出解决方案, Join(RegexSearch(If(RegexSeek(LogMc, "(?<=A potential solution has been determined:\n)((\t)+ - [^\n]+\n)+"), ""), "(?<=(\t)+)[^\n]+"), vbLf)) If LogMc.Contains("Maybe try a lower resolution resourcepack?") Then AppendReason(CrashReason.材质过大或显卡配置不足) If LogMc.Contains("java.lang.NoSuchMethodError: net.minecraft.world.server.ChunkManager$ProxyTicketManager.shouldForceTicks(J)Z") AndAlso LogMc.Contains("OptiFine") Then AppendReason(CrashReason.OptiFine导致无法加载世界) + If LogMc.Contains("Unsupported class file major 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("Could not reserve enough space") Then If LogMc.Contains("for 1048576KB object heap") Then AppendReason(CrashReason.使用32位Java导致JVM无法分配足够多的内存) @@ -785,6 +787,8 @@ Redo: ResultString = "游戏似乎因为使用 JDK,或 Java 版本过高而崩溃了。\n请在启动设置的 Java 选择一项中改用 JRE 8(Java 8),然后再启动游戏。\n如果你没有安装 JRE 8,你可以从网络中下载、安装一个。" Case CrashReason.Java版本过高 ResultString = "游戏似乎因为你所使用的 Java 版本过高而崩溃了。\n请在启动设置的 Java 选择一项中改用较低版本的 Java,然后再启动游戏。\n如果没有,可以从网络中下载、安装一个。" + Case CrashReason.Java版本不兼容 + ResultString = "游戏不兼容你当前使用的 Java。\n如果没有合适的 Java,可以从网络中下载、安装一个。" Case CrashReason.使用32位Java导致JVM无法分配足够多的内存 If Environment.Is64BitOperatingSystem Then ResultString = "你似乎正在使用 32 位 Java,这会导致 Minecraft 无法使用 1GB 以上的内存,进而造成崩溃。\n\n请在启动设置的 Java 选择一项中改用 64 位的 Java 再启动游戏,然后再启动游戏。\n如果你没有安装 64 位的 Java,你可以从网络中下载、安装一个。" diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 5c6d955..d0d9a95 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -1272,7 +1272,7 @@ '构造搜索请求 Dim SearchEntries As New List(Of SearchEntry(Of DlCfDbEntry)) For Each Entry In DlCfProjectDb.Values - If If(Entry.ChineseName, "").Contains("动态的树") Then Continue For '傻逼 Mod 的附属太多了 + If Entry.ChineseName.Contains("动态的树") Then Continue For '傻逼 Mod 的附属太多了 SearchEntries.Add(New SearchEntry(Of DlCfDbEntry) With { .Item = Entry, .SearchSource = New List(Of KeyValuePair(Of String, Double)) From { @@ -1416,9 +1416,9 @@ ''' Public WikiId As Integer ''' - ''' 中文译名。若为 Nothing 或空字符串则使用英文名。 + ''' 中文译名。若为空字符串则使用英文名。 ''' - Public ChineseName As String + Public ChineseName As String = "" ''' ''' MCBBS 发布帖编号(例如 195107)。若为 Nothing 则没有发布帖。 ''' @@ -1663,9 +1663,10 @@ ExitSub: #Region "DlSource | 镜像下载源" Public Function DlSourceResourceGet(MojangBase As String) As String() - Return {MojangBase.Replace("http://resources.download.minecraft.net", "https://download.mcbbs.net/assets"), + MojangBase = MojangBase.Replace("http://resources.download.minecraft.net", "https://resources.download.minecraft.net") + Return {MojangBase.Replace("https://resources.download.minecraft.net", "https://download.mcbbs.net/assets"), MojangBase, - MojangBase.Replace("http://resources.download.minecraft.net", "https://bmclapi2.bangbang93.com/assets") + MojangBase.Replace("https://resources.download.minecraft.net", "https://bmclapi2.bangbang93.com/assets") } End Function diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index 2360e72..7e29259 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -167,6 +167,7 @@ NextInner: #Region "预检测" Private Sub McLaunchPrecheck() + If Setup.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(100, 2000)) '检查路径 If McVersionCurrent.PathIndie.Contains("!") OrElse McVersionCurrent.PathIndie.Contains(";") Then Throw New Exception("游戏路径中不可包含 ! 或 ;(" & McVersionCurrent.PathIndie & ")") If McVersionCurrent.Path.Contains("!") OrElse McVersionCurrent.Path.Contains(";") Then Throw New Exception("游戏路径中不可包含 ! 或 ;(" & McVersionCurrent.Path & ")") @@ -1047,7 +1048,7 @@ SystemBrowser: Case 1 OpenWebsite("https://www.minecraft.net/zh-hans/msaprofile/mygames/editprofile") Case 2 - OpenWebsite("https://www.minecraft.net/zh-hans/store/minecraft-java-bedrock-edition-pc") + OpenWebsite("https://www.minecraft.net/store/checkout/minecraft-java-bedrock-edition-pc") End Select End Sub, "Login Failed: Create Profile") Throw New Exception("$$") @@ -1191,11 +1192,11 @@ SystemBrowser: 'Fabric 检测 If McVersionCurrent.Version.HasFabric Then If McVersionCurrent.Version.McCodeMain >= 15 AndAlso McVersionCurrent.Version.McCodeMain <= 16 AndAlso McVersionCurrent.Version.McCodeMain <> -1 Then - '1.15 - 1.16:Java 8 - 18 - MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 18, 999, 999) + '1.15 - 1.16:Java 8 - 19 + MinVer = New Version(1, 8, 0, 0) : MaxVer = New Version(1, 19, 999, 999) ElseIf McVersionCurrent.Version.McCodeMain >= 18 AndAlso McVersionCurrent.Version.McCodeMain < 99 Then - '1.18+:Java 17 - 18 - MinVer = New Version(1, 17, 0, 0) : MaxVer = New Version(1, 18, 999, 999) + '1.18+:Java 17 - 19 + MinVer = New Version(1, 17, 0, 0) : MaxVer = New Version(1, 19, 999, 999) End If End If @@ -1207,14 +1208,15 @@ SystemBrowser: '选择 Java McLaunchLog("Java 版本需求:最低 " & MinVer.ToString & ",最高 " & MaxVer.ToString) - McLaunchJavaSelected = JavaSelect(MinVer, MaxVer, McVersionCurrent) - If Task.IsAborted Then Exit Sub '中断加载会导致 JavaSelect 异常地返回空值,误判找不到 Java + McLaunchJavaSelected = JavaSelect("$$", MinVer, MaxVer, McVersionCurrent) + If Task.IsAborted Then Exit Sub If McLaunchJavaSelected IsNot Nothing Then McLaunchLog("选择的 Java:" & McLaunchJavaSelected.ToString) Exit Sub End If '无合适的 Java + If Task.IsAborted Then Exit Sub '中断加载会导致 JavaSelect 异常地返回空值,误判找不到 Java McLaunchLog("无合适的 Java,取消启动") If MinVer >= New Version(1, 17, 0, 0) Then '缺少 Java 17 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index 4a0e3a6..0bff379 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -125,7 +125,7 @@ Public Module ModMinecraft Public Overrides Function ToString() As String Dim VersionString = Version.ToString If VersionString.StartsWith("1.") Then VersionString = Mid(VersionString, 3) - Return If(IsJre, "Java ", "JDK ") & VersionCode & " (" & VersionString & ")," & If(Is64Bit, "64", "32") & " 位" & If(IsUserImport, ",手动导入", "") & ":" & PathFolder + Return If(IsJre, "JRE ", "JDK ") & VersionCode & " (" & VersionString & ")," & If(Is64Bit, "64", "32") & " 位" & If(IsUserImport, ",手动导入", "") & ":" & PathFolder End Function '构造 @@ -226,7 +226,7 @@ Public Module ModMinecraft JavaSearchFolder(Disk.Name, JavaPreList, False) Next '查找 APPDATA 文件夹中的 Java - JavaSearchFolder(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), JavaPreList, False) + JavaSearchFolder(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\", JavaPreList, False) '查找启动器目录中的 Java JavaSearchFolder(Path, JavaPreList, False, IsFullSearch:=True) '查找所选 Minecraft 文件夹中的 Java @@ -416,7 +416,8 @@ Wait: ''' 最小与最大版本在与输入相同时也会通过。 ''' 必须在工作线程调用。 ''' - Public Function JavaSelect(Optional MinVersion As Version = Nothing, Optional MaxVersion As Version = Nothing, Optional RelatedVersion As McVersion = Nothing) As JavaEntry + Public Function JavaSelect(CancelException As String, Optional MinVersion As Version = Nothing, Optional MaxVersion As Version = Nothing, + Optional RelatedVersion As McVersion = Nothing) As JavaEntry Try Dim AllowedJavaList As New List(Of JavaEntry) @@ -429,6 +430,8 @@ Wait: For Each Entry In JavaPreList TargetJavaList.Add(New JavaEntry(Entry.Key, Entry.Value)) Next + + '检查特定的 Java If TargetJavaList.Count > 0 Then TargetJavaList = JavaCheckList(TargetJavaList) Log("[Java] 检查后找到 " & TargetJavaList.Count & " 个特定目录下的 Java") @@ -443,6 +446,8 @@ RetryGet: Case LoadState.Aborted Throw New ThreadInterruptedException("Java 搜索加载器已中断") End Select + + '生成完整的 Java 列表 Dim AllJavaList As New List(Of JavaEntry) AllJavaList.AddRange(TargetJavaList) AllJavaList.AddRange(JavaList) @@ -452,6 +457,7 @@ RetryGet: If MinVersion IsNot Nothing AndAlso Java.Version < MinVersion Then Continue For If MaxVersion IsNot Nothing AndAlso Java.Version > MaxVersion Then Continue For If Java.Is64Bit AndAlso Is32BitSystem Then Continue For + If Java.IsJre AndAlso Java.VersionCode >= 12 Then Continue For '无论如何不允许使用 JRE 12+,它们完全是炸的,安 OptiFine、Forge 和启动 MC 都会炸 AllowedJavaList.Add(Java) Next @@ -462,69 +468,95 @@ RetryGet: GoTo RetryGet End If - '检查用户指定的 Java - Dim UserSetup As String = Setup.Get("LaunchArgumentJavaSelect") - If RelatedVersion IsNot Nothing Then - Dim UserSetupVersion As String = Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion) - If UserSetupVersion <> "使用全局设置" Then UserSetup = UserSetupVersion - End If - If UserSetup <> "" Then - Dim UserJava As JavaEntry +#Region "检查用户指定的 Java" + + Dim UserJava As JavaEntry = Nothing + + '获取版本独立设置中指定的 Java + If RelatedVersion IsNot Nothing AndAlso Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion) <> "使用全局设置" Then Try - UserJava = JavaEntry.FromJson(GetJson(UserSetup)) - Catch ex As Exception - Setup.Set("LaunchArgumentJavaSelect", "使用全局设置") - Log(ex, "版本指定的 Java 信息已损坏,已重置版本设置中指定的 Java") - GoTo UserPass - End Try - For Each Java In AllowedJavaList - If Java.PathFolder = UserJava.PathFolder Then - '直接使用指定的 Java - AllowedJavaList = New List(Of JavaEntry) From {UserJava} - GoTo UserPass + 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 - Next - Log("[Java] 发现用户指定的不兼容 Java:" & UserJava.ToString) - '弹窗要求选择 - Dim Requirement As String = "" - Dim ShowRevision As Boolean = False - If (MinVersion Is Nothing OrElse MinVersion.Minor = 0) AndAlso (MaxVersion IsNot Nothing AndAlso MaxVersion.Minor < 999) Then - ShowRevision = MaxVersion.MinorRevision < 999 - Requirement = "最高兼容到 Java " & MaxVersion.Minor & If(ShowRevision, "." & MaxVersion.MajorRevision & "." & MaxVersion.MinorRevision, "") - ElseIf (MinVersion IsNot Nothing AndAlso MinVersion.Minor > 0) AndAlso (MaxVersion Is Nothing OrElse MaxVersion.Minor >= 999) Then - ShowRevision = MinVersion.MinorRevision > 0 OrElse MinVersion.MajorRevision > 0 - Requirement = "至少需要 Java " & MinVersion.Minor & If(ShowRevision, "." & MinVersion.MajorRevision & "." & MinVersion.MinorRevision, "") - ElseIf (MinVersion IsNot Nothing AndAlso MinVersion.Minor > 0) AndAlso (MaxVersion IsNot Nothing AndAlso MaxVersion.Minor < 999) Then - ShowRevision = MinVersion.MinorRevision > 0 OrElse MinVersion.MajorRevision > 0 OrElse MaxVersion.MinorRevision < 999 - Dim Left As String = MinVersion.Minor & If(ShowRevision, "." & MinVersion.MajorRevision & "." & MinVersion.MinorRevision, "") - Dim Right As String = MaxVersion.Minor & If(ShowRevision, "." & MaxVersion.MajorRevision & "." & MaxVersion.MinorRevision, "") - Requirement = "需要 Java " & If(Left = Right, Left, Left & " ~ " & Right) - End If - Dim JavaCurrent As String = UserJava.VersionCode & If(ShowRevision, "." & UserJava.Version.MajorRevision & "." & UserJava.Version.MinorRevision, "") - If Setup.Get("LaunchAdvanceJava") Then - '直接跳过弹窗 - Hint("设置中指定了使用 Java " & JavaCurrent & ",但当前版本" & Requirement & ",这可能会导致游戏崩溃!", HintType.Critical) - AllowedJavaList = New List(Of JavaEntry) From {UserJava} - ElseIf MyMsgBox("你在启动设置中指定了使用 Java " & JavaCurrent & ",但当前版本" & Requirement & "。" & vbCrLf & - "如果强制使用该 Java,可能会导致游戏崩溃。" & vbCrLf & - vbCrLf & - " - 指定的 Java:" & UserJava.ToString, - "Java 兼容性警告", "让 PCL2 自动选择", "强制使用该 Java") = 2 Then - '强制使用指定的 Java - Log("[Java] 已强制使用用户指定的不兼容 Java") - AllowedJavaList = New List(Of JavaEntry) From {UserJava} - End If + Catch ex As Exception + UserJava = Nothing + Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion) + Log(ex, "版本独立设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint) + End Try End If + '获取全局设置中指定的 Java + If UserJava Is Nothing AndAlso Setup.Get("LaunchArgumentJavaSelect") <> "" Then + Try + UserJava = JavaEntry.FromJson(GetJson(Setup.Get("LaunchArgumentJavaSelect"))) + Catch ex As Exception + UserJava = Nothing + Setup.Reset("LaunchArgumentJavaSelect") + Log(ex, "设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint) + End Try + End If + + '确保指定的 Java 可用 + If UserJava Is Nothing Then GoTo ExitUserJavaCheck + If AllowedJavaList.Any(Function(j) j.PathFolder = UserJava.PathFolder) Then + Log("[Java] 使用用户指定的 Java:" & UserJava.PathFolder) + AllowedJavaList = New List(Of JavaEntry) From {UserJava} + GoTo UserPass + End If + + '指定的 Java 不可用,弹窗要求选择 + Log("[Java] 发现用户指定的不兼容 Java:" & UserJava.ToString) + Dim Requirement As String = "" + Dim ShowRevision As Boolean = False + If (MinVersion Is Nothing OrElse MinVersion.Minor = 0) AndAlso (MaxVersion IsNot Nothing AndAlso MaxVersion.Minor < 999) Then + ShowRevision = MaxVersion.MinorRevision < 999 + Requirement = "最高兼容到 Java " & MaxVersion.Minor & If(ShowRevision, "." & MaxVersion.MajorRevision & "." & MaxVersion.MinorRevision, "") + ElseIf (MinVersion IsNot Nothing AndAlso MinVersion.Minor > 0) AndAlso (MaxVersion Is Nothing OrElse MaxVersion.Minor >= 999) Then + ShowRevision = MinVersion.MinorRevision > 0 OrElse MinVersion.MajorRevision > 0 + Requirement = "至少需要 Java " & MinVersion.Minor & If(ShowRevision, "." & MinVersion.MajorRevision & "." & MinVersion.MinorRevision, "") + ElseIf (MinVersion IsNot Nothing AndAlso MinVersion.Minor > 0) AndAlso (MaxVersion IsNot Nothing AndAlso MaxVersion.Minor < 999) Then + ShowRevision = MinVersion.MinorRevision > 0 OrElse MinVersion.MajorRevision > 0 OrElse MaxVersion.MinorRevision < 999 + Dim Left As String = MinVersion.Minor & If(ShowRevision, "." & MinVersion.MajorRevision & "." & MinVersion.MinorRevision, "") + Dim Right As String = MaxVersion.Minor & If(ShowRevision, "." & MaxVersion.MajorRevision & "." & MaxVersion.MinorRevision, "") + Requirement = "需要 Java " & If(Left = Right, Left, Left & " ~ " & Right) + End If + Dim JavaCurrent As String = UserJava.VersionCode & If(ShowRevision, "." & UserJava.Version.MajorRevision & "." & UserJava.Version.MinorRevision, "") + If Setup.Get("LaunchAdvanceJava") Then + '直接跳过弹窗 + Hint("设置中指定了使用 Java " & JavaCurrent & ",但当前版本" & Requirement & ",这可能会导致游戏崩溃!", HintType.Critical) + AllowedJavaList = New List(Of JavaEntry) From {UserJava} + Else + Select Case MyMsgBox("你在设置中手动指定了使用 Java " & JavaCurrent & ",但当前" & Requirement & "。" & vbCrLf & + "如果强制使用该 Java,可能会导致出现异常。" & vbCrLf & + vbCrLf & + " - 指定的 Java:" & UserJava.ToString, + "Java 兼容性警告", "让 PCL2 自动选择", "强制使用该 Java", "取消") + Case 1 '让 PCL2 自动选择 + Case 2 '强制使用指定的 Java + Log("[Java] 已强制使用用户指定的不兼容 Java") + AllowedJavaList = New List(Of JavaEntry) From {UserJava} + Case 3 '取消启动 + Throw New Exception(CancelException) + End Select + End If + +ExitUserJavaCheck: +#End Region + '若依然未找到适合的 Java,直接返回 If AllowedJavaList.Count = 0 Then Return Nothing - '检查特定的 Java + '优先使用特定目录下的 Java For Each Java In AllowedJavaList 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 @@ -537,6 +569,8 @@ UserPass: Dim SelectedJava = AllowedJavaList.First Try SelectedJava.Check() + Catch ex As ThreadInterruptedException + Throw Catch ex As Exception Log(ex, "找到的 Java 已无法使用,尝试进行搜索") AllowedJavaList = New List(Of JavaEntry) @@ -552,6 +586,7 @@ UserPass: Log(ex, "查找符合条件的 Java 时出现加载器中断") Return Nothing Catch ex As Exception + If ex.Message = "$$" Then Throw ex Log(ex, "查找符合条件的 Java 失败", LogLevel.Feedback) Return Nothing End Try @@ -615,7 +650,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, 30, 29, 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, 11, 12, 13, 9, 8, 7, 15, 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 @@ -671,17 +706,10 @@ NoUserJava: Public Name As String Public Path As String Public Type As McFolderType - Public VersionCount As Integer Public Overrides Function Equals(obj As Object) As Boolean - If Not (TypeOf obj Is McFolder) Then - Return False - End If - + If Not (TypeOf obj Is McFolder) Then Return False Dim folder = DirectCast(obj, McFolder) - Return Name = folder.Name AndAlso - Path = folder.Path AndAlso - Type = folder.Type AndAlso - VersionCount = folder.VersionCount + Return Name = folder.Name AndAlso Path = folder.Path AndAlso Type = folder.Type End Function Public Overrides Function ToString() As String Return Path @@ -763,15 +791,6 @@ NoUserJava: End If For Each Folder As McFolder In CacheMcFolderList -#Region "获取可用版本数" - If Directory.Exists(Folder.Path & "versions\") Then - Folder.VersionCount = New DirectoryInfo(Folder.Path & "versions\").GetDirectories.Count - '减去隐藏版本的个数 - For Each Dir As DirectoryInfo In New DirectoryInfo(Folder.Path & "versions\").GetDirectories - If ReadIni(Dir.FullName & "\PCL\Setup.ini", "Hide", "False") Then Folder.VersionCount -= 1 - Next - End If -#End Region #Region "更新 launcher_profiles.json" McFolderLauncherProfilesJsonCreate(Folder.Path) #End Region @@ -817,7 +836,7 @@ NoUserJava: #Region "版本处理" - Public Const McVersionCacheVersion As Integer = 24 + Public Const McVersionCacheVersion As Integer = 25 Private _McVersionCurrent As McVersion Private _McVersionLast = 0 '为 0 以保证与 Nothing 不相同,使得 UI 显示可以正常初始化 @@ -1650,7 +1669,7 @@ ExitDataLoad: If Name.StartsWith("2.0") Then Return "这个秘密计划了两年的更新将游戏推向了一个新高度!" ElseIf Name.StartsWith("20w14inf") OrElse Name = "20w14∞" Then - Return "我们加入了 20 亿个新的世界,让无限的想象变成了现实!" + Return "我们加入了 20 亿个新的维度,让无限的想象变成了现实!" ElseIf Name = "15w14a" Then Return "作为一款全年龄向的游戏,我们需要和平,需要爱与拥抱。" ElseIf Name = "1.rv-pre1" Then @@ -1919,16 +1938,23 @@ OnLoaded: '将每个大版本下的最常规版本加入 For Each Code As Integer In ExistVersion - If NewerVersion.ContainsKey(Code & "-" & McVersionState.OptiFine) Then + If NewerVersion.ContainsKey(Code & "-" & McVersionState.OptiFine) AndAlso NewerVersion.ContainsKey(Code & "-" & McVersionState.Original) Then + '同时存在 OptiFine 与原版 + Dim OriginalVersion As McVersion = NewerVersion(Code & "-" & McVersionState.Original) Dim OptiFineVersion As McVersion = NewerVersion(Code & "-" & McVersionState.OptiFine) - If NewerVersion.ContainsKey(Code & "-" & McVersionState.Original) AndAlso Not NewerVersion(Code & "-" & McVersionState.Original).Version.McName = OptiFineVersion.InheritVersion Then - '同时存在 OptiFine 与原版,但 OptiFine 不是该版的依赖版本,则一定为两个不同版本,且原版较新 - VersionUseful.Add(NewerVersion(Code & "-" & McVersionState.Original)) - VersionList.Remove(NewerVersion(Code & "-" & McVersionState.Original)) + If OriginalVersion.Version.McCodeSub > OptiFineVersion.Version.McCodeSub Then + '仅在原版比 OptiFine 更新时才加入原版 + VersionUseful.Add(OriginalVersion) + VersionList.Remove(OriginalVersion) End If VersionUseful.Add(OptiFineVersion) VersionList.Remove(OptiFineVersion) - Else + ElseIf NewerVersion.ContainsKey(Code & "-" & McVersionState.OptiFine) Then + '没有原版,直接加入 OptiFine + VersionUseful.Add(NewerVersion(Code & "-" & McVersionState.OptiFine)) + VersionList.Remove(NewerVersion(Code & "-" & McVersionState.OptiFine)) + ElseIf NewerVersion.ContainsKey(Code & "-" & McVersionState.Original) Then + '没有 OptiFine,直接加入原版 VersionUseful.Add(NewerVersion(Code & "-" & McVersionState.Original)) VersionList.Remove(NewerVersion(Code & "-" & McVersionState.Original)) End If @@ -2807,7 +2833,7 @@ NextVersion: If File.Exists AndAlso (Token.Size = 0 OrElse Token.Size = File.Length) AndAlso (Not CheckHash OrElse Token.Hash Is Nothing OrElse Token.Hash = GetAuthSHA1(Token.LocalPath)) Then Continue For '文件不存在,添加下载 - Result.Add(New NetFile(DlSourceResourceGet("http://resources.download.minecraft.net/" & Left(Token.Hash, 2) & "/" & Token.Hash), Token.LocalPath, New FileChecker(ActualSize:=If(Token.Size = 0, -1, Token.Size), Hash:=Token.Hash))) + Result.Add(New NetFile(DlSourceResourceGet("https://resources.download.minecraft.net/" & Left(Token.Hash, 2) & "/" & Token.Hash), Token.LocalPath, New FileChecker(ActualSize:=If(Token.Size = 0, -1, Token.Size), Hash:=Token.Hash))) Next Catch ex As Exception Log(ex, "获取版本缺失的资源文件下载列表失败") diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index b1bd5bf..464fbb7 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -206,7 +206,7 @@ Retry: Task.Progress = 0.5 '复制结果 If Directory.Exists(InstallTemp & ArchiveBaseFolder & OverrideHome) Then - My.Computer.FileSystem.CopyDirectory(InstallTemp & ArchiveBaseFolder & OverrideHome, PathMcFolder & "versions\" & VersionName) + CopyDirectory(InstallTemp & ArchiveBaseFolder & OverrideHome, PathMcFolder & "versions\" & VersionName) Else Log("[ModPack] 整合包中未找到 override 目录,已跳过") End If @@ -242,8 +242,13 @@ Retry: '跳过重复的 Mod(疑似 CurseForge Bug) If FileList.ContainsKey(ModJson("id").ToObject(Of Integer)) Then Continue For '根据 modules 判断是资源包还是 Mod - Dim ModuleNames = CType(ModJson("modules"), JArray).Select(Function(l) l("name").ToString).ToList - Dim IsResourcePack As Boolean = Not ModuleNames.Contains("META-INF") AndAlso ModuleNames.Contains("pack.mcmeta") + Dim IsResourcePack As Boolean + If ModJson("modules").Any Then 'modules 可能返回 null(#1006) + Dim ModuleNames = CType(ModJson("modules"), JArray).Select(Function(l) l("name").ToString).ToList + IsResourcePack = Not ModuleNames.Contains("META-INF") AndAlso ModuleNames.Contains("pack.mcmeta") + Else + IsResourcePack = False + End If '实际的添加 FileList.Add(ModJson("id"), New DlCfFile(ModJson, False).GetDownloadFile( PathMcFolder & "versions\" & VersionName & "\" & If(IsResourcePack, "resourcepacks", "mods") & "\", False)) @@ -368,7 +373,7 @@ Retry: Task.Progress = 0.5 '复制结果 If Directory.Exists(InstallTemp & ArchiveBaseFolder & "minecraft") Then - My.Computer.FileSystem.CopyDirectory(InstallTemp & ArchiveBaseFolder & "minecraft", PathMcFolder & "versions\" & VersionName) + CopyDirectory(InstallTemp & ArchiveBaseFolder & "minecraft", PathMcFolder & "versions\" & VersionName) Else Log("[ModPack] 整合包中未找到 minecraft override 目录,已跳过") End If @@ -463,7 +468,7 @@ Retry: Task.Progress = 0.5 '复制结果 If Directory.Exists(InstallTemp & ArchiveBaseFolder & ".minecraft") Then - My.Computer.FileSystem.CopyDirectory(InstallTemp & ArchiveBaseFolder & ".minecraft", PathMcFolder & "versions\" & VersionName) + CopyDirectory(InstallTemp & ArchiveBaseFolder & ".minecraft", PathMcFolder & "versions\" & VersionName) Else Log("[ModPack] 整合包中未找到 override .minecraft 目录,已跳过") End If @@ -550,7 +555,7 @@ Retry: Task.Progress = 0.5 '复制结果 If Directory.Exists(InstallTemp & ArchiveBaseFolder & "overrides") Then - My.Computer.FileSystem.CopyDirectory(InstallTemp & ArchiveBaseFolder & "overrides", PathMcFolder & "versions\" & VersionName) + CopyDirectory(InstallTemp & ArchiveBaseFolder & "overrides", PathMcFolder & "versions\" & VersionName) Else Log("[ModPack] 整合包中未找到 overrides 目录,已跳过") End If diff --git a/Plain Craft Launcher 2/Modules/ModEvent.vb b/Plain Craft Launcher 2/Modules/ModEvent.vb index 44c77ce..5e02778 100644 --- a/Plain Craft Launcher 2/Modules/ModEvent.vb +++ b/Plain Craft Launcher 2/Modules/ModEvent.vb @@ -67,7 +67,7 @@ MyMsgBox("EventData 必须为以 http:// 或 https:// 开头的网址。" & vbCrLf & "PCL2 不支持其他乱七八糟的协议。", "事件执行失败") Exit Sub End If - PageOtherTest.StartCustomDownload(Data(0)) + PageOtherTest.StartCustomDownload(Data(0), GetFileNameFromPath(Data(0))) Case Else MyMsgBox("未知的事件类型:" & Type & vbCrLf & "请检查事件类型填写是否正确,或者 PCL2 是否为最新版本。", "事件执行失败") diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index 8b0e336..62dbd42 100644 --- a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb +++ b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb @@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 ' 方法是按如下所示使用“*” - - + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 08dc2ee..69746db 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -380,7 +380,7 @@ Public Module ModDownloadLib End Sub Private Sub McDownloadOptiFineInstall(BaseMcFolderHome As String, Target As String, Task As LoaderTask(Of List(Of NetFile), Boolean)) '选择 Java - Dim Java = JavaSelect(New Version(1, 8, 0, 0)) + Dim Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 0)) If Java Is Nothing Then JavaMissing(17) Throw New Exception("未找到用于安装 OptiFine 的 Java") @@ -563,7 +563,7 @@ Public Module ModDownloadLib If Directory.Exists(BaseMcFolder & "versions\" & DownloadInfo.Inherit) Then DeleteDirectory(BaseMcFolder & "versions\" & DownloadInfo.Inherit) End If - My.Computer.FileSystem.CreateDirectory(BaseMcFolder & "versions\" & DownloadInfo.Inherit & "\") + Directory.CreateDirectory(BaseMcFolder & "versions\" & DownloadInfo.Inherit & "\") McFolderLauncherProfilesJsonCreate(BaseMcFolder) CopyFile(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json", BaseMcFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") @@ -575,10 +575,10 @@ Public Module ModDownloadLib Task.Progress = 0.96 '复制文件 File.Delete(BaseMcFolder & "launcher_profiles.json") - My.Computer.FileSystem.CopyDirectory(BaseMcFolder, McFolder, True) + CopyDirectory(BaseMcFolder, McFolder) Task.Progress = 0.98 '清理文件 - My.Computer.FileSystem.DeleteFile(Target) + File.Delete(Target) DeleteDirectory(BaseMcFolderHome) Catch ex As Exception Throw New Exception("安装新版 OptiFine 版本失败", ex) @@ -1097,7 +1097,7 @@ Public Module ModDownloadLib Private Sub ForgeInjector(Target As String, Task As LoaderTask(Of Boolean, Boolean), McFolder As String) '选择 Java - Dim Java = JavaSelect(New Version(1, 8, 0, 60)) + Dim Java = JavaSelect("已取消安装。", New Version(1, 8, 0, 0)) If Java Is Nothing Then JavaMissing(17) Throw New Exception("未找到用于安装 Forge 的 Java") @@ -1409,7 +1409,7 @@ Public Module ModDownloadLib '清理文件 Try If Installer IsNot Nothing Then Installer.Dispose() - If File.Exists(InstallerAddress) Then My.Computer.FileSystem.DeleteFile(InstallerAddress) + If File.Exists(InstallerAddress) Then File.Delete(InstallerAddress) Catch ex As Exception Log(ex, "安装 Forge 清理文件时出错") End Try @@ -1440,7 +1440,7 @@ Public Module ModDownloadLib '解压支持库文件 Installer.Dispose() ZipFile.ExtractToDirectory(InstallerAddress, InstallerAddress & "_unrar\") - My.Computer.FileSystem.CopyDirectory(InstallerAddress & "_unrar\maven\", McFolder & "libraries\", True) + CopyDirectory(InstallerAddress & "_unrar\maven\", McFolder & "libraries\") DeleteDirectory(InstallerAddress & "_unrar\") Else '旧版格式 @@ -1463,7 +1463,7 @@ Public Module ModDownloadLib Try '清理文件 If Installer IsNot Nothing Then Installer.Dispose() - If File.Exists(InstallerAddress) Then My.Computer.FileSystem.DeleteFile(InstallerAddress) + If File.Exists(InstallerAddress) Then File.Delete(InstallerAddress) If Directory.Exists(InstallerAddress & "_unrar\") Then DeleteDirectory(InstallerAddress & "_unrar\") Catch ex As Exception Log(ex, "非新版方式安装 Forge 清理文件时出错") @@ -1995,8 +1995,8 @@ Public Module ModDownloadLib LoaderList.Add(New LoaderTask(Of String, String)("安装游戏", Sub(Task As LoaderTask(Of String, String)) InstallMerge(OutputFolder, OutputFolder, OptiFineFolder, OptiFineAsMod, ForgeFolder, Request.ForgeVersion, FabricFolder, LiteLoaderFolder) Task.Progress = 0.3 - If Directory.Exists(TempMcFolder & "libraries") Then My.Computer.FileSystem.CopyDirectory(TempMcFolder & "libraries", PathMcFolder & "libraries", True) - If Directory.Exists(TempMcFolder & "mods") Then My.Computer.FileSystem.CopyDirectory(TempMcFolder & "mods", PathMcFolder & "mods", True) + If Directory.Exists(TempMcFolder & "libraries") Then CopyDirectory(TempMcFolder & "libraries", PathMcFolder & "libraries") + If Directory.Exists(TempMcFolder & "mods") Then CopyDirectory(TempMcFolder & "mods", PathMcFolder & "mods") End Sub) With {.ProgressWeight = 2, .Block = True}) '补全文件 If Not DontFixLibraries AndAlso diff --git a/Plain Craft Launcher 2/Pages/PageDownload/MyCfItem.xaml b/Plain Craft Launcher 2/Pages/PageDownload/MyCfItem.xaml index 239354b..45138ce 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/MyCfItem.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/MyCfItem.xaml @@ -21,7 +21,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb index dad8a6f..99b1ae3 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb @@ -638,6 +638,8 @@ If Versions.Count = 0 Then Exit Sub '排序 Versions = Sort(Versions, Function(Left As DlOptiFineListEntry, Right As DlOptiFineListEntry) As Boolean + If Not Left.IsPreview AndAlso Right.IsPreview Then Return True + If Left.IsPreview AndAlso Not Right.IsPreview Then Return False Return VersionSortBoolean(Left.NameDisplay, Right.NameDisplay) End Function) '可视化 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb index 89a49a4..ebb9116 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb @@ -95,21 +95,30 @@ DlFabricListLoader.Start(IsForceRestart:=True) DlFabricApiLoader.Start(IsForceRestart:=True) DlOptiFabricLoader.Start(IsForceRestart:=True) + ItemInstall.Checked = True Case FormMain.PageSubType.DownloadMod If FrmDownloadMod IsNot Nothing Then FrmDownloadMod.PageLoaderRestart() + ItemMod.Checked = True Case FormMain.PageSubType.DownloadPack If FrmDownloadPack IsNot Nothing Then FrmDownloadPack.PageLoaderRestart() + ItemPack.Checked = True Case FormMain.PageSubType.DownloadClient DlClientListLoader.Start(IsForceRestart:=True) + ItemClient.Checked = True Case FormMain.PageSubType.DownloadOptiFine DlOptiFineListLoader.Start(IsForceRestart:=True) + ItemOptiFine.Checked = True Case FormMain.PageSubType.DownloadForge DlForgeListLoader.Start(IsForceRestart:=True) + ItemForge.Checked = True Case FormMain.PageSubType.DownloadLiteLoader DlLiteLoaderListLoader.Start(IsForceRestart:=True) + ItemLiteLoader.Checked = True Case FormMain.PageSubType.DownloadFabric DlFabricListLoader.Start(IsForceRestart:=True) + ItemFabric.Checked = True End Select + Hint("正在刷新……", Log:=False) End Sub '点击返回 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml index ee59e17..829e718 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml @@ -14,7 +14,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageLink/PageLinkLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageLink/PageLinkLeft.xaml.vb index 716e301..7f3fb16 100644 --- a/Plain Craft Launcher 2/Pages/PageLink/PageLinkLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLink/PageLinkLeft.xaml.vb @@ -173,6 +173,7 @@ Public Class PageLinkLeft If MyMsgBox("是否要初始化联机页的所有设置?该操作不可撤销。", "初始化确认",, "取消", IsWarn:=True) = 1 Then If IsNothing(FrmSetupLink) Then FrmSetupLink = New PageSetupLink FrmSetupLink.Reset() + ItemSetup.Checked = True End If End Sub diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb index a4c0e54..846e453 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb @@ -114,7 +114,9 @@ Select Case Val(sender.Tag) Case FormMain.PageSubType.OtherHelp RefreshHelp() + ItemHelp.Checked = True End Select + Hint("正在刷新……", Log:=False) End Sub Public Shared Sub RefreshHelp() Setup.Set("SystemHelpVersion", 0) '强制重新解压文件 diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb index 3a56605..d9db609 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb @@ -304,6 +304,7 @@ }, "SetupLaunch Ram TextRight") Else '不需要动画 + AniStop("SetupLaunch Ram TextRight") LabRamGame.Margin = New Thickness(TotalWidth - LabGameWidth, 3, 0, 0) LabRamGameTitle.Margin = New Thickness(TotalWidth - LabGameTitleWidth, 0, 0, 5) End If @@ -316,6 +317,7 @@ }, "SetupLaunch Ram TextRight") Else '不需要动画 + AniStop("SetupLaunch Ram TextRight") LabRamGame.Margin = New Thickness(2 + RectUsedWidth, 3, 0, 0) LabRamGameTitle.Margin = New Thickness(2 + RectUsedWidth, 0, 0, 5) End If diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLeft.xaml.vb index 51ecb2a..1787316 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLeft.xaml.vb @@ -147,21 +147,25 @@ If MyMsgBox("是否要初始化启动页的所有设置?该操作不可撤销。", "初始化确认",, "取消", IsWarn:=True) = 1 Then If IsNothing(FrmSetupLaunch) Then FrmSetupLaunch = New PageSetupLaunch FrmSetupLaunch.Reset() + ItemLaunch.Checked = True End If Case FormMain.PageSubType.SetupUI If MyMsgBox("是否要初始化个性化页的所有设置?该操作不可撤销。" & vbCrLf & "(背景图片与音乐、自定义主页等外部文件不会被删除)", "初始化确认",, "取消", IsWarn:=True) = 1 Then If IsNothing(FrmSetupUI) Then FrmSetupUI = New PageSetupUI FrmSetupUI.Reset() + ItemUI.Checked = True End If Case FormMain.PageSubType.SetupSystem If MyMsgBox("是否要初始化启动器页的所有设置?该操作不可撤销。", "初始化确认",, "取消", IsWarn:=True) = 1 Then If IsNothing(FrmSetupSystem) Then FrmSetupSystem = New PageSetupSystem FrmSetupSystem.Reset() + ItemSystem.Checked = True End If Case FormMain.PageSubType.SetupLink If MyMsgBox("是否要初始化联机页的所有设置?该操作不可撤销。", "初始化确认",, "取消", IsWarn:=True) = 1 Then If IsNothing(FrmSetupLink) Then FrmSetupLink = New PageSetupLink FrmSetupLink.Reset() + ItemLink.Checked = True End If End Select End Sub diff --git a/Plain Craft Launcher 2/Pages/PageSpeedLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageSpeedLeft.xaml.vb index f65712a..2b78f06 100644 --- a/Plain Craft Launcher 2/Pages/PageSpeedLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSpeedLeft.xaml.vb @@ -92,10 +92,10 @@ Card.Children.Add(GetObjectFromXML("")) Dim Tb As TextBlock = GetObjectFromXML("") Tb.Text = GetExceptionDetail(Loader.Error) - AddHandler Tb.MouseDown, Sub(sender As TextBlock, e As EventArgs) - ClipboardSet(sender.Text, False) - Hint("已复制错误详情!", HintType.Finish) - End Sub + AddHandler Tb.MouseLeftButtonDown, Sub(sender As TextBlock, e As EventArgs) + ClipboardSet(sender.Text, False) + Hint("已复制错误详情!", HintType.Finish) + End Sub Card.Children.Add(Tb) ''删除取消按钮 'For Each Element As FrameworkElement In CType(Card.Parent, Panel).Children diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index b259fcf..d360428 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -90,12 +90,15 @@ Public Sub Refresh(sender As Object, e As EventArgs) '由边栏按钮匿名调用 '强制刷新 If FrmVersionMod IsNot Nothing Then FrmVersionMod.RefreshList(True) '没有 Else,还没加载刷个鬼的新 + ItemMod.Checked = True + Hint("正在刷新……", Log:=False) End Sub Public Sub Reset(sender As Object, e As EventArgs) If MyMsgBox("是否要初始化该版本的版本独立设置?该操作不可撤销。", "初始化确认",, "取消", IsWarn:=True) = 1 Then If IsNothing(FrmVersionSetup) Then FrmVersionSetup = New PageVersionSetup FrmVersionSetup.Reset() + ItemSetup.Checked = True End If End Sub diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb index 47e2f6e..54f4de9 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb @@ -60,6 +60,7 @@ PanEmpty.Visibility = Visibility.Collapsed End If + SearchBox.Text = "" '建立 StackPanel Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, If(List.Count > 0, 20, 0)), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0)} For Each ModEntity As McMod In List @@ -383,15 +384,15 @@ ModSearchName = ModSearchName.Replace("++", "+").Replace("pti+Fine", "ptiFine") '显示 If ModEntity.Url Is Nothing Then - If MyMsgBox(Join(ContentLines, vbCrLf), ModEntity.Name, "确定", "百科搜索") = 2 Then + If MyMsgBox(Join(ContentLines, vbCrLf), ModEntity.Name, "百科搜索", "返回") = 1 Then OpenWebsite("https://www.mcmod.cn/s?key=" & ModSearchName & "&site=all&filter=0") End If Else - Select Case MyMsgBox(Join(ContentLines, vbCrLf), ModEntity.Name, "确定", "百科搜索", "打开官网") + Select Case MyMsgBox(Join(ContentLines, vbCrLf), ModEntity.Name, "打开官网", "百科搜索", "返回") + Case 1 + OpenWebsite(ModEntity.Url) Case 2 OpenWebsite("https://www.mcmod.cn/s?key=" & ModSearchName & "&site=all&filter=0") - Case 3 - OpenWebsite(ModEntity.Url) End Select End If diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml index af35188..cfbd13a 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml @@ -22,7 +22,7 @@ - + diff --git a/Plain Craft Launcher 2/Resources/Help.zip b/Plain Craft Launcher 2/Resources/Help.zip index d30894816dd8a14d7540aae302a9f9dd4a9009ba..7a5cd703a83e819b359faae05988a32f964e5b5e 100644 GIT binary patch delta 37596 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