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 d308948..7a5cd70 100644
Binary files a/Plain Craft Launcher 2/Resources/Help.zip and b/Plain Craft Launcher 2/Resources/Help.zip differ