This commit is contained in:
龙腾猫跃
2025-08-13 01:08:21 +08:00
parent 1d0947181f
commit adf52d56b7
27 changed files with 705 additions and 682 deletions
+2 -1
View File
@@ -1,9 +1,9 @@
<Application x:Class="Application"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:behaviors="clr-namespace:PCL.Controls.Behaviors"
xmlns:local="clr-namespace:PCL"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:behaviors="clr-namespace:PCL.Controls.Behaviors"
StartupUri="FormMain.xaml"
ShutdownMode="OnExplicitShutdown">
<Application.Resources>
@@ -345,6 +345,7 @@
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="behaviors:ClipboardInterceptor.EnableSafeClipboard" Value="True" />
</Style>
<!-- ComboBox -->
@@ -140,6 +140,7 @@ WaitRetry:
ServicePointManager.Expect100Continue = True
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12
ServicePointManager.DefaultConnectionLimit = 1024
ServicePointManager.UseNagleAlgorithm = False
'计时
Log("[Start] 第一阶段加载用时:" & GetTimeTick() - ApplicationStartTick & " ms")
ApplicationStartTick = GetTimeTick()
+1 -2
View File
@@ -320,11 +320,10 @@
End Set
End Property
Private _IsSwapped As Boolean = False
''' <summary>
''' 是否已被折叠。(已过时,请使用 IsSwapped)
''' </summary>
<Obsolete("请使用 IsSwapped 属性,IsSwaped 存在拼写错误")>
<Obsolete("IsSwaped 存在拼写错误,请换用 IsSwapped 属性。")>
Public Property IsSwaped As Boolean
Get
Return IsSwapped
+22 -6
View File
@@ -11,6 +11,19 @@ Public Class FormMain
Dim FeatureList As New List(Of KeyValuePair(Of Integer, String))
'统计更新日志条目
#If BETA Then
If LastVersion < 367 Then 'Release 2.10.6
FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:启用 MCIM 社区资源镜像源,以缓解社区资源难以下载的问题"))
FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:正版登录出错时无法给出正确的错误信息"))
FeatureCount += 9
BugCount += 9
End If
If LastVersion < 365 Then 'Release 2.10.5
FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:下载资源时,会单独记忆每种资源上次下载到的文件夹,以防混淆"))
FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:网络底层框架与下载稳定性"))
FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法启动一部分 LabyMod 和 GTNH 客户端"))
FeatureCount += 22
BugCount += 26
End If
If LastVersion < 361 Then 'Release 2.10.3
FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法安装部分使用老版本 PCL 导出的整合包"))
End If
@@ -83,6 +96,12 @@ Public Class FormMain
'3:BUG+ IMP* FEAT-
'2:BUG* IMP-
'1:BUG-
If LastVersion < 366 Then 'Snapshot 2.10.6
FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:启用 MCIM 社区资源镜像源,以缓解社区资源难以下载的问题"))
FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:正版登录出错时无法给出正确的错误信息"))
FeatureCount += 9
BugCount += 9
End If
If LastVersion < 364 Then 'Snapshot 2.10.5
If LastVersion >= 363 Then
FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法添加新的正版账号"))
@@ -268,11 +287,6 @@ Public Class FormMain
AddHandler Closing, Sub() Helper.RemoveDragHook()
AddHandler Helper.DragDrop, Sub() FileDrag(Helper.DropFilePaths)
End If
'If IsAdmin() Then '下列代码没用(#2531)
' ChangeWindowMessageFilter(&H233, 1)
' ChangeWindowMessageFilter(&H4A, 1)
' ChangeWindowMessageFilter(&H49, 1)
'End If
'切换到首页
If Not IsNothing(FrmLaunchLeft.Parent) Then FrmLaunchLeft.SetValue(ContentPresenter.ContentProperty, Nothing)
If Not IsNothing(FrmLaunchRight.Parent) Then FrmLaunchRight.SetValue(ContentPresenter.ContentProperty, Nothing)
@@ -389,6 +403,8 @@ Public Class FormMain
Catch ex As Exception
Log(ex, "清理自动更新文件失败")
End Try
'上报
Telemetry("启动")
End Sub, "初始化", ThreadPriority.Lowest)
Log("[Start] 第三阶段加载用时:" & GetTimeTick() - ApplicationStartTick & " ms")
@@ -874,7 +890,7 @@ Public Class FormMain
'错误报告分析
Try
Log("[System] 尝试进行错误报告分析")
Dim Analyzer As New CrashAnalyzer(GetUuid())
Dim Analyzer As New CrashAnalyzer
Analyzer.Import(FilePath)
If Not Analyzer.Prepare() Then Exit Try
Analyzer.Analyze()
+68 -65
View File
@@ -1,6 +1,6 @@
Imports System.Globalization
Imports System.IO.Compression
Imports System.Reflection
Imports System.Net.Sockets
Imports System.Runtime.CompilerServices
Imports System.Security.Cryptography
Imports System.Security.Principal
@@ -13,13 +13,13 @@ Public Module ModBase
#Region "声明"
'下列版本信息由更新器自动修改
Public Const VersionBaseName As String = "2.10.5" '不含分支前缀的显示用版本名
Public Const VersionStandardCode As String = "2.10.5." & VersionBranchCode '标准格式的四段式版本号
Public Const VersionBaseName As String = "2.10.6" '不含分支前缀的显示用版本名
Public Const VersionStandardCode As String = "2.10.6." & VersionBranchCode '标准格式的四段式版本号
Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换
#If BETA Then
Public Const VersionCode As Integer = 361 'Release
Public Const VersionCode As Integer = 367 'Release
#Else
Public Const VersionCode As Integer = 364 'Snapshot
Public Const VersionCode As Integer = 366 'Snapshot
#End If
'自动生成的版本信息
Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
@@ -791,8 +791,8 @@ Public Module ModBase
Public Sub CopyFile(FromPath As String, ToPath As String)
Try
'还原文件路径
If Not FromPath.Contains(":\") Then FromPath = Path & FromPath
If Not ToPath.Contains(":\") Then ToPath = Path & ToPath
FromPath = ShortenPath(If(FromPath.Contains(":\"), FromPath, Path & FromPath))
ToPath = ShortenPath(If(ToPath.Contains(":\"), ToPath, Path & ToPath))
'如果复制同一个文件则跳过
If FromPath = ToPath Then Return
'确保目录存在
@@ -861,7 +861,7 @@ Public Module ModBase
''' <param name="Append">是否将文件内容追加到当前文件,而不是覆盖它。</param>
Public Sub WriteFile(FilePath As String, Text As String, Optional Append As Boolean = False, Optional Encoding As Encoding = Nothing)
'处理相对路径
If Not FilePath.Contains(":\") Then FilePath = Path & FilePath
FilePath = ShortenPath(If(FilePath.Contains(":\"), FilePath, Path & FilePath))
'确保目录存在
Directory.CreateDirectory(GetPathFromFullPath(FilePath))
'写入文件
@@ -886,7 +886,7 @@ Public Module ModBase
''' <param name="Append">是否将文件内容追加到当前文件,而不是覆盖它。</param>
Public Sub WriteFile(FilePath As String, Content As Byte(), Optional Append As Boolean = False)
'处理相对路径
If Not FilePath.Contains(":\") Then FilePath = Path & FilePath
FilePath = ShortenPath(If(FilePath.Contains(":\"), FilePath, Path & FilePath))
'确保目录存在
Directory.CreateDirectory(GetPathFromFullPath(FilePath))
'写入文件
@@ -1294,11 +1294,11 @@ Re:
''' </summary>
Public Sub ExtractFile(CompressFilePath As String, DestDirectory As String, Optional Encode As Encoding = Nothing,
Optional ProgressIncrementHandler As Action(Of Double) = Nothing)
Directory.CreateDirectory(DestDirectory)
Directory.CreateDirectory(ShortenPath(DestDirectory))
If CompressFilePath.EndsWithF(".gz", True) Then
'以 gz 方式解压
Dim stream As New GZipStream(New FileStream(CompressFilePath, FileMode.Open, FileAccess.ReadWrite), CompressionMode.Decompress)
Dim decompressedFile As New FileStream(DestDirectory & GetFileNameFromPath(CompressFilePath).ToLower.Replace(".tar", "").Replace(".gz", ""), FileMode.OpenOrCreate, FileAccess.Write)
Dim decompressedFile As New FileStream(ShortenPath(DestDirectory & GetFileNameFromPath(CompressFilePath).ToLower.Replace(".tar", "").Replace(".gz", "")), FileMode.OpenOrCreate, FileAccess.Write)
Dim data As Integer = stream.ReadByte()
While data <> -1
decompressedFile.WriteByte(data)
@@ -1309,10 +1309,10 @@ Re:
Else
'以 zip 方式解压
Using Archive = ZipFile.Open(CompressFilePath, ZipArchiveMode.Read, If(Encode, Encoding.GetEncoding("GB18030")))
Dim TotalCount As Integer = Archive.Entries.Count
Dim TotalCount As Long = Archive.Entries.Count
For Each Entry As ZipArchiveEntry In Archive.Entries
If ProgressIncrementHandler IsNot Nothing Then ProgressIncrementHandler(1 / TotalCount)
Dim DestinationPath As String = IO.Path.Combine(DestDirectory, Entry.FullName)
If ProgressIncrementHandler IsNot Nothing AndAlso TotalCount > 0 Then ProgressIncrementHandler(1 / TotalCount)
Dim DestinationPath As String = ShortenPath(IO.Path.Combine(DestDirectory, Entry.FullName))
If DestinationPath.EndsWithF("\") OrElse DestinationPath.EndsWithF("/") Then
Continue For '不创建空文件夹
Else
@@ -1387,10 +1387,10 @@ RetryDir:
ToPath = ToPath.Replace("/", "\")
If Not ToPath.EndsWithF("\") Then ToPath &= "\"
Dim AllFiles = EnumerateFiles(FromPath).ToList
Dim FileCount As Integer = AllFiles.Count
Dim FileCount As Long = AllFiles.Count
For Each File In AllFiles
CopyFile(File.FullName, File.FullName.Replace(FromPath, ToPath))
If ProgressIncrementHandler IsNot Nothing Then ProgressIncrementHandler(1 / FileCount)
If ProgressIncrementHandler IsNot Nothing AndAlso FileCount > 0 Then ProgressIncrementHandler(1 / FileCount)
Next
End Sub
''' <summary>
@@ -1449,22 +1449,8 @@ RetryDir:
IsInner = True
Loop
'常见错误(记得同时修改下面的)
Dim CommonReason As String = Nothing
If TypeOf InnerEx Is TypeLoadException OrElse TypeOf InnerEx Is BadImageFormatException OrElse TypeOf InnerEx Is MissingMethodException OrElse TypeOf InnerEx Is NotImplementedException OrElse TypeOf InnerEx Is TypeInitializationException Then
CommonReason = "PCL 的运行环境存在问题。请尝试重新安装 .NET Framework 4.6.2 然后再试。若无法安装,请先卸载较新版本的 .NET Framework,然后再尝试安装。"
ElseIf TypeOf InnerEx Is UnauthorizedAccessException Then
CommonReason = "PCL 的权限不足。请尝试右键 PCL,选择以管理员身份运行。"
ElseIf TypeOf InnerEx Is OutOfMemoryException Then
CommonReason = "你的电脑运行内存不足,导致 PCL 无法继续运行。请在关闭一部分不需要的程序后再试。"
ElseIf TypeOf InnerEx Is Runtime.InteropServices.COMException Then
CommonReason = "由于操作系统或显卡存在问题,导致出现错误。请尝试重启 PCL。"
ElseIf {"远程主机强迫关闭了", "远程方已关闭传输流", "未能解析此远程名称", "由于目标计算机积极拒绝",
"操作已超时", "操作超时", "服务器超时", "连接超时"}.Any(Function(s) DescList.Any(Function(l) l.Contains(s))) Then
CommonReason = "你的网络环境不佳,导致难以连接到服务器。请稍后重试,或使用 VPN 以改善网络环境。"
End If
'构造输出信息
Dim CommonReason As String = AnalyzeCommonReason(InnerEx, DescList)
If CommonReason Is Nothing Then
Return DescList.Join(vbCrLf)
Else
@@ -1492,22 +1478,8 @@ RetryDir:
DescList = DescList.Distinct.ToList
Dim Desc As String = Join(DescList, vbCrLf & "→ ")
'常见错误(记得同时修改上面的)
Dim CommonReason As String = Nothing
If TypeOf InnerEx Is TypeLoadException OrElse TypeOf InnerEx Is BadImageFormatException OrElse TypeOf InnerEx Is MissingMethodException OrElse TypeOf InnerEx Is NotImplementedException OrElse TypeOf InnerEx Is TypeInitializationException Then
CommonReason = "PCL 的运行环境存在问题。请尝试重新安装 .NET Framework 4.6.2 然后再试。若无法安装,请先卸载较新版本的 .NET Framework,然后再尝试安装。"
ElseIf TypeOf InnerEx Is UnauthorizedAccessException Then
CommonReason = "PCL 的权限不足。请尝试右键 PCL,选择以管理员身份运行。"
ElseIf TypeOf InnerEx Is OutOfMemoryException Then
CommonReason = "你的电脑运行内存不足,导致 PCL 无法继续运行。请在关闭一部分不需要的程序后再试。"
ElseIf TypeOf InnerEx Is Runtime.InteropServices.COMException Then
CommonReason = "由于操作系统或显卡存在问题,导致出现错误。请尝试重启 PCL。"
ElseIf {"远程主机强迫关闭了", "远程方已关闭传输流", "未能解析此远程名称", "由于目标计算机积极拒绝",
"操作已超时", "操作超时", "服务器超时", "连接超时"}.Any(Function(s) Desc.Contains(s)) Then
CommonReason = "你的网络环境不佳,导致难以连接到服务器。请稍后重试,或使用 VPN 以改善网络环境。"
End If
'构造输出信息
Dim CommonReason As String = AnalyzeCommonReason(InnerEx, DescList)
If CommonReason IsNot Nothing Then
Return CommonReason & "详细错误:" & DescList.First
Else
@@ -1515,6 +1487,24 @@ RetryDir:
Return Join(DescList, " ← ")
End If
End Function
Private Function AnalyzeCommonReason(InnerEx As Exception, DescList As List(Of String)) As String
If TypeOf InnerEx Is TypeLoadException OrElse TypeOf InnerEx Is BadImageFormatException OrElse TypeOf InnerEx Is MissingMethodException OrElse TypeOf InnerEx Is NotImplementedException OrElse TypeOf InnerEx Is TypeInitializationException Then
Return "PCL 的运行环境存在问题。请尝试重新安装 .NET Framework 4.6.2 然后再试。若无法安装,请先卸载较新版本的 .NET Framework,然后再尝试安装。"
ElseIf TypeOf InnerEx Is UnauthorizedAccessException Then
Return "PCL 的权限不足。请尝试右键 PCL,选择以管理员身份运行。"
ElseIf TypeOf InnerEx Is OutOfMemoryException Then
Return "你的电脑运行内存不足,导致 PCL 无法继续运行。请在关闭一部分不需要的程序后再试。"
ElseIf TypeOf InnerEx Is Runtime.InteropServices.COMException Then
Return "由于操作系统或显卡存在问题,导致出现错误。请尝试重启 PCL。"
ElseIf TypeOf InnerEx Is SocketException AndAlso DescList.Any(Function(l) l.Contains("WSAStartup")) Then
Return "请尝试卸载中国移动云盘,然后再试。"
ElseIf {"远程主机强迫关闭了", "远程方已关闭传输流", "未能解析此远程名称", "由于目标计算机积极拒绝",
"操作已超时", "操作超时", "服务器超时", "连接超时"}.Any(Function(s) DescList.Any(Function(l) l.Contains(s))) Then
Return "你的网络环境不佳,导致难以连接到服务器。请稍后重试,或使用 VPN 以改善网络环境。"
Else
Return Nothing
End If
End Function
''' <summary>
''' 返回一个枚举对应的字符串。
@@ -1556,7 +1546,7 @@ RetryDir:
Return JsonConvert.DeserializeObject(Data, New JsonSerializerSettings With {.DateTimeZoneHandling = DateTimeZoneHandling.Local})
Catch ex As Exception
Dim Length As Integer = If(Data, "").Length
Throw New Exception("格式化 JSON 失败:" & If(Length > 2000, Data.Substring(0, 500) & $"...(全长 {Length} 个字符)..." & Right(Data, 500), Data))
Throw New Exception("格式化 JSON 失败:" & If(Length > 2000, Data.Substring(0, 500) & $"...(全长 {Length} 个字符)..." & Right(Data, 500), Data), ex)
End Try
End Function
@@ -2641,10 +2631,6 @@ Retry:
''' 相对增减控件的左边距。
''' </summary>
Public Sub DeltaLeft(control As FrameworkElement, newValue As Double)
'安全性检查
DebugAssert(Not Double.IsNaN(newValue))
DebugAssert(Not Double.IsInfinity(newValue))
If TypeOf control Is Window Then
'窗口改变
CType(control, Window).Left += newValue
@@ -2656,8 +2642,6 @@ Retry:
Case HorizontalAlignment.Right
control.Margin = New Thickness(control.Margin.Left, control.Margin.Top, control.Margin.Right - newValue, control.Margin.Bottom)
'control.Margin = New Thickness(control.Margin.Left, control.Margin.Top, CType(control.Parent, Object).ActualWidth - control.ActualWidth - newValue, control.Margin.Bottom)
Case Else
DebugAssert(False)
End Select
End If
End Sub
@@ -2665,17 +2649,12 @@ Retry:
''' 设置控件的左边距。(仅针对置左控件)
''' </summary>
Public Sub SetLeft(control As FrameworkElement, newValue As Double)
DebugAssert(control.HorizontalAlignment = HorizontalAlignment.Left)
control.Margin = New Thickness(newValue, control.Margin.Top, control.Margin.Right, control.Margin.Bottom)
End Sub
''' <summary>
''' 相对增减控件的上边距。
''' </summary>
Public Sub DeltaTop(control As FrameworkElement, newValue As Double)
'安全性检查
DebugAssert(Not Double.IsNaN(newValue))
DebugAssert(Not Double.IsInfinity(newValue))
If TypeOf control Is Window Then
'窗口改变
CType(control, Window).Top += newValue
@@ -2687,11 +2666,8 @@ Retry:
Case VerticalAlignment.Bottom
control.Margin = New Thickness(control.Margin.Left, control.Margin.Top, control.Margin.Right, control.Margin.Bottom - newValue)
'control.Margin = New Thickness(control.Margin.Left, control.Margin.Top, CType(control.Parent, Object).ActualWidth - control.ActualWidth - newValue, control.Margin.Bottom)
Case Else
DebugAssert(False)
End Select
End If
'If Double.IsNaN(newValue) OrElse Double.IsInfinity(newValue) Then Return '安全性检查
'Select Case control.VerticalAlignment
' Case VerticalAlignment.Top, VerticalAlignment.Stretch, VerticalAlignment.Center
@@ -2705,7 +2681,6 @@ Retry:
''' 设置控件的顶边距。(仅针对置上控件)
''' </summary>
Public Sub SetTop(control As FrameworkElement, newValue As Double)
DebugAssert(control.VerticalAlignment = VerticalAlignment.Top)
control.Margin = New Thickness(control.Margin.Left, newValue, control.Margin.Right, control.Margin.Bottom)
End Sub
@@ -2989,6 +2964,13 @@ Retry:
End If
End Select
'上报
If Level >= LogLevel.Hint Then
Telemetry("PCL 错误",
"Level", GetStringFromEnum(Level),
"Title", FilterUserName(FilterAccessToken(Title, "*"), "*"),
"Exception", FilterUserName(FilterAccessToken(Text, "*"), "*"))
End If
End Sub
''' <summary>
''' 输出错误信息。
@@ -3055,6 +3037,13 @@ Retry:
End If
End Select
'上报
If Level >= LogLevel.Hint Then
Telemetry("PCL 异常",
"Level", GetStringFromEnum(Level),
"Title", FilterUserName(FilterAccessToken(Title, "*"), "*"),
"Exception", FilterUserName(FilterAccessToken(ExFull, "*"), "*"))
End If
End Sub
'反馈
@@ -3091,9 +3080,23 @@ Retry:
"文件位置:" & Path)
End Sub
'断言
Public Sub DebugAssert(Exp As Boolean)
If Not Exp Then Throw New Exception("断言命中")
'遥测
Public Sub Telemetry([Event] As String, ParamArray Datas As String())
If Not Setup.Get("SystemSystemTelemetry") Then Return '用户关闭了遥测
If Not ClsBaseUrl.StartsWithF("http") Then Return '开源版没有设置遥测地址
RunInNewThread(
Sub()
Try
Log($"[System] 匿名数据上报:{[Event]}")
Dim Url As String = $"{ClsBaseUrl}&Event={WebUtility.UrlEncode([Event])}"
For i = 0 To Datas.Length - 1 Step 2
Url &= "&" & WebUtility.UrlEncode(Datas(i)) & "=" & WebUtility.UrlEncode(Datas(i + 1).Replace(vbCrLf, vbLf))
Next
NetRequestByClient(Url, MakeLog:=False)
Catch
Log("[System] 匿名数据上报失败", LogLevel.Debug)
End Try
End Sub, "Telemetry", ThreadPriority.Lowest)
End Sub
'获取当前的堆栈信息
+16 -10
View File
@@ -22,9 +22,6 @@ Public Module ModNet
Return If(Encoding, Encoding.UTF8).GetString(SendRequest(Url, Method, Content, HeaderDictionary, Timeout:=Timeout, Encoding:=Encoding, UseBrowserUserAgent:=UseBrowserUserAgent))
Catch ex As ThreadInterruptedException
Throw
Catch ex As ResponsedWebException
If MakeLog Then Log(ex, "网络请求失败,返回内容为:" & vbCrLf & ex.Response, LogLevel.Developer)
Throw
Catch ex As Exception
If MakeLog Then Log(ex, "网络请求失败", LogLevel.Developer)
Throw
@@ -244,7 +241,10 @@ RequestFinished:
If Response.IsSuccessStatusCode Then
Return ResponseBytes
Else
Throw New ResponsedWebException($"错误码 {Response.StatusCode} ({CInt(Response.StatusCode)}),{Method},{Url}", If(Encoding, Encoding.UTF8).GetString(ResponseBytes))
Dim ResponseMessage = If(Encoding, Encoding.UTF8).GetString(ResponseBytes)
Throw New ResponsedWebException(
$"错误码 {Response.StatusCode} ({CInt(Response.StatusCode)}),{Method},{Url}" &
If(String.IsNullOrEmpty(ResponseMessage), "", vbCrLf & ResponseMessage), ResponseMessage)
End If
Catch ex As ThreadInterruptedException
Throw
@@ -807,7 +807,7 @@ StartSingleThreadDownload:
'是否禁用多线程,以及规定碎片大小
Dim TargetUrl As String = GetSource().Url
If TargetUrl.Contains("pcl2-server") OrElse TargetUrl.Contains("bmclapi") OrElse TargetUrl.Contains("github.com") OrElse
TargetUrl.Contains("optifine.net") OrElse TargetUrl.Contains("modrinth") Then Return Nothing
TargetUrl.Contains("optifine.net") OrElse TargetUrl.Contains("modrinth") OrElse TargetUrl.Contains("momot.rs") Then Return Nothing
'寻找最大碎片
'FUTURE: 下载引擎重做,计算下载源平均链接时间和线程下载速度,按最高时间节省来开启多线程
Dim FilePieceMax As NetThread = Threads
@@ -990,7 +990,8 @@ NotSupportRange:
Th.DownloadDone += RealDataCount
ResultStream.Write(ResponseBytes, 0, RealDataCount)
'检查速度是否过慢
If DeltaTime > 1500 AndAlso DeltaTime > RealDataCount Then '数据包间隔大于 1.5s,且速度小于 1.5K/s
If DeltaTime > 1500 AndAlso DeltaTime > RealDataCount AndAlso '数据包间隔大于 1.5s,且速度小于 1.5K/s
Th.Source.SingleThread Is Nothing Then '并非单线程下载
Throw New TimeoutException("由于速度过慢断开链接,下载 " & RealDataCount & " B,消耗 " & DeltaTime & " ms。")
End If
Th.LastReceiveTime = GetTimeTick()
@@ -1027,7 +1028,8 @@ SourceBreak:
End SyncLock
'合并
If Not IsNoSplit Then ResultStream?.Dispose()
If ((FileSize >= 0 AndAlso DownloadDone >= FileSize) OrElse (FileSize = -1 AndAlso DownloadDone > 0)) AndAlso State < NetState.Merge Then Merge(Th)
If ((FileSize >= 0 AndAlso DownloadDone >= FileSize) OrElse (FileSize = -1 AndAlso DownloadDone > 0)) AndAlso
State < NetState.Merge AndAlso Th.State <> NetState.Error Then Merge(Th)
End Try
End Sub
Private Sub SourceFail(Th As NetThread, ex As Exception, IsMergeFailure As Boolean)
@@ -1069,7 +1071,7 @@ SourceBreak:
'当前源失败,但还有下载源:正常地继续执行
ElseIf Not Retried AndAlso Sources.Count > 1 Then
'合并失败或首次下载失败,未重试:将所有下载源重新标记为不允许断点续传的下载源,逐个重新尝试下载
Log($"[Download] {LocalName}:文件下载失败,正在自动重试……", If(ModeDebug, LogLevel.Hint, LogLevel.Debug)) '在调试模式下给出红色提示
Hint($"{LocalName}:文件下载失败,正在自动重试……", If(ModeDebug, HintType.Critical, HintType.Info)) '在调试模式下给出红色提示
Retried = True
SyncLock LockSource
SourcesOnce.Clear()
@@ -1525,10 +1527,14 @@ Retry:
'获取实际失败的文件
For Each File In Files
If File.State <> NetState.Error Then Continue For
Dim Detail As String = Join(File.Sources.Select(Function(s) $"{If(s.Ex?.Message, "无错误信息。")}({s.Url})"), vbCrLf)
[Error] = New Exception("文件下载失败:" & File.LocalPath & vbCrLf &
"各下载源的错误如下:" & vbCrLf &
Join(File.Sources.Select(Function(s) $"{If(s.Ex?.Message, "无错误信息。")}({s.Url})"), vbCrLf),
"各下载源的错误如下:" & vbCrLf & Detail,
[Error])
'上报
Telemetry("文件下载失败",
"FileName", File.LocalName,
"Exception", Detail)
Exit For
Next
'在设置 Error 对象后再更改为失败,避免 WaitForExit 无法捕获错误
@@ -2,7 +2,9 @@
'构造函数
Private TempFolder As String
Public Sub New(UUID As Integer)
Private TargetVersion As McVersion
Public Sub New(Optional TargetVersion As McVersion = Nothing)
Me.TargetVersion = TargetVersion
'构建文件结构
TempFolder = RequestTaskTempFolder()
Directory.CreateDirectory(TempFolder & "Temp\")
@@ -508,7 +510,7 @@ Done:
If LogMc.Contains("Couldn't set pixel format") Then AppendReason(CrashReason.显卡驱动不支持导致无法设置像素格式)
If LogMc.Contains("java.lang.OutOfMemoryError") OrElse LogMc.Contains("an out of memory error") Then AppendReason(CrashReason.内存不足)
If LogMc.Contains("java.lang.RuntimeException: Shaders Mod detected. Please remove it, OptiFine has built-in support for shaders.") Then AppendReason(CrashReason.ShadersMod与OptiFine同时安装)
If LogMc.Contains("java.lang.NoSuchMethodError: sun.security.util.ManifestEntryVerifier") Then AppendReason(CrashReason.低版本Forge与高版本Java不兼容)
If LogMc.Contains("java.lang.NoSuchMethodError: sun.security.util.ManifestEntryVerifier") OrElse LogMc.Contains("java.lang.NoSuchMethodError: 'void sun.security.util.ManifestEntryVerifier") Then AppendReason(CrashReason.低版本Forge与高版本Java不兼容)
If LogMc.Contains("1282: Invalid operation") Then AppendReason(CrashReason.光影或资源包导致OpenGL1282错误)
If LogMc.Contains("signer information does not match signer information of other classes in the same package") Then AppendReason(CrashReason.文件或内容校验失败, If(RegexSeek(LogMc, "(?<=class "")[^']+(?=""'s signer information)"), "").TrimEnd(vbCrLf))
If LogMc.Contains("Maybe try a lower resolution resourcepack?") Then AppendReason(CrashReason.材质过大或显卡配置不足)
@@ -856,12 +858,13 @@ NextStack:
''' <summary>
''' 弹出崩溃弹窗,并指导导出崩溃报告。
''' </summary>
Public Sub Output(IsHandAnalyze As Boolean, Optional ExtraFiles As List(Of String) = Nothing)
Public Sub Output(IsManualAnalyze As Boolean, Optional ExtraFiles As List(Of String) = Nothing)
'弹窗提示
FrmMain.ShowWindowToTop()
Select Case MyMsgBox(GetAnalyzeResult(IsHandAnalyze), If(IsHandAnalyze, "错误报告分析结果", "Minecraft 出现错误"),
"确定", If(IsHandAnalyze OrElse DirectFile Is Nothing, "", "查看日志"), If(IsHandAnalyze, "", "导出错误报告"),
Button2Action:=If(IsHandAnalyze OrElse DirectFile Is Nothing, Nothing,
Dim Detail As String = GetAnalyzeResult(IsManualAnalyze)
Select Case MyMsgBox(Detail, If(IsManualAnalyze, "错误报告分析结果", "Minecraft 出现错误"),
"确定", If(IsManualAnalyze OrElse DirectFile Is Nothing, "", "查看日志"), If(IsManualAnalyze, "", "导出错误报告"),
Button2Action:=If(IsManualAnalyze OrElse DirectFile Is Nothing, Nothing,
Sub()
'弹窗选择:查看日志
If File.Exists(DirectFile.Value.Key) Then
@@ -918,6 +921,11 @@ NextStack:
End Try
OpenExplorer(FileAddress)
End Select
'上报
If IsManualAnalyze Then Return
Telemetry("Minecraft 崩溃",
"Version", If(TargetVersion Is Nothing, "null", TargetVersion.Version.ToString),
"Detail", FilterUserName(Detail, "*"))
End Sub
''' <summary>
''' 获取崩溃分析的结果描述。
@@ -1102,7 +1110,7 @@ NextStack:
If(Not Results.Any(Function(r) r.EndsWithF("\h")) OrElse IsHandAnalyze, "",
vbCrLf & "如果要寻求帮助,请把错误报告文件发给对方,而不是发送这个窗口的照片或者截图。" &
If(If(PageSetupSystem.IsLauncherNewest(), True), "",
vbCrLf & vbCrLf & "此外,你正在使用老版本 PCL,更新 PCL 或许也能解决这个问题。" & vbCrLf & "你可以点击 设置 → 启动器 → 检查更新 来更新 PCL。"))
vbCrLf & vbCrLf & "此外,你正在使用老版本 PCL,更新 PCL 或许也能解决这个问题。" & vbCrLf & "你可以点击 [设置 → 其他 → 启动器 → 检查更新] 更新 PCL。"))
End Function
End Class
@@ -594,7 +594,7 @@
VersionName = Version
Me.Version = New Version(Version)
Me.Inherit = Inherit
FileVersion = Version & If(Branch Is Nothing, "", "-" & Branch)
FileVersion = Version & If(Branch Is Nothing, "", "-" & Branch)
End Sub
End Class
@@ -1106,26 +1106,27 @@
Public Function DlModRequest(Url As String, Optional Method As HttpMethod = Nothing,
Optional Content As String = Nothing, Optional ContentType As String = Nothing) As JToken
Dim Urls As New List(Of KeyValuePair(Of String, Integer))
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) '至少 10s,要不然有时候远端服务器来不及完成
Dim McimUrl As String = DlSourceModGet(Url)
If McimUrl <> Url Then
Select Case Setup.Get("ToolDownloadMod")
Case 0
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
'Dim McimUrl As String = DlSourceModGet(Url)
'If McimUrl <> Url Then
' Select Case Setup.Get("ToolDownloadMod")
' Case 0
' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
' Case 1
' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10))
' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
' Case Else
' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10))
' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
' End Select
'End If
Case 1
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) '至少 10s,要不然有时候远端服务器来不及完成
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
Case Else
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10))
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
End Select
Else
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10))
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
End If
Dim Exs As String = ""
For Each Source In Urls
Try
@@ -1232,7 +1233,14 @@
'Mod 下载源
Public Function DlSourceModGet(Original As String) As String
Return Original
Return Original.
Replace("api.modrinth.com", "mod.mcimirror.top/modrinth").
Replace("staging-api.modrinth.com", "mod.mcimirror.top/modrinth").
Replace("cdn.modrinth.com", "mod.mcimirror.top").
Replace("api.curseforge.com", "mod.mcimirror.top/curseforge").
Replace("edge.forgecdn.net", "mod.mcimirror.top").
Replace("mediafilez.forgecdn.net", "mod.mcimirror.top").
Replace("media.forgecdn.net", "mod.mcimirror.top")
End Function
'Loader 自动切换
@@ -66,7 +66,7 @@ Public Module ModLaunch
''' </summary>
Public Sub McLaunchLog(Text As String)
Text = FilterUserName(FilterAccessToken(Text, "*"), "*")
RunInUi(Sub() FrmLaunchRight.LabLog.Text += vbCrLf & "[" & GetTimeNow() & "] " & Text)
RunInUi(Sub() FrmLaunchRight.LabLog.Text += $"{vbCrLf}[{GetTimeNow()}] {Text}")
Log("[Launch] " & Text)
End Sub
@@ -101,6 +101,8 @@ Public Module ModLaunch
If Not ex.Message.StartsWithF("$$") Then Hint(ex.Message, HintType.Critical)
Throw
End Try
Dim IsSavingBatch As Boolean = CurrentLaunchOptions?.SaveBatch IsNot Nothing
'正式加载
Try
'构造主加载器
@@ -145,9 +147,15 @@ Public Module ModLaunch
Select Case LaunchLoader.State
Case LoadState.Finished
Hint(McVersionCurrent.Name & " 启动成功!", HintType.Finish)
'上报
If Not IsSavingBatch Then
Telemetry("Minecraft 启动成功",
"Version", McVersionCurrent.Version.ToString,
"LoginType", GetStringFromEnum(CType(Setup.Get("LoginType"), McLoginType)))
End If
Case LoadState.Aborted
If AbortHint Is Nothing Then
Hint(If(CurrentLaunchOptions?.SaveBatch Is Nothing, "已取消启动!", "已取消导出启动脚本!"), HintType.Info)
Hint(If(IsSavingBatch, "已取消导出启动脚本!", "已取消启动!"), HintType.Info)
Else
Hint(AbortHint, HintType.Finish)
End If
@@ -162,7 +170,7 @@ NextInner:
If CurrentEx.Message.StartsWithF("$") Then
'若有以 $ 开头的错误信息,则以此为准显示提示
'若错误信息为 $$,则不提示
If Not CurrentEx.Message = "$$" Then MyMsgBox(CurrentEx.Message.TrimStart("$"), If(CurrentLaunchOptions?.SaveBatch Is Nothing, "启动失败", "导出启动脚本失败"))
If Not CurrentEx.Message = "$$" Then MyMsgBox(CurrentEx.Message.TrimStart("$"), If(IsSavingBatch, "导出启动脚本失败", "启动失败"))
Throw
ElseIf CurrentEx.InnerException IsNot Nothing Then
'检查下一级错误
@@ -172,8 +180,15 @@ NextInner:
'没有特殊处理过的错误信息
McLaunchLog("错误:" & GetExceptionDetail(ex))
Log(ex,
If(CurrentLaunchOptions?.SaveBatch Is Nothing, "Minecraft 启动失败", "导出启动脚本失败"), LogLevel.Msgbox,
If(CurrentLaunchOptions?.SaveBatch Is Nothing, "启动失败", "导出启动脚本失败"))
If(IsSavingBatch, "导出启动脚本失败", "Minecraft 启动失败"), LogLevel.Msgbox,
If(IsSavingBatch, "导出启动脚本失败", "启动失败"))
'上报
If Not IsSavingBatch Then
Telemetry("Minecraft 启动失败",
"Version", McVersionCurrent.Version.ToString,
"LoginType", GetStringFromEnum(CType(Setup.Get("LoginType"), McLoginType)),
"Exception", FilterUserName(FilterAccessToken(GetExceptionDetail(ex), "*"), "*"))
End If
Throw
End If
End Try
@@ -891,9 +906,9 @@ Retry:
ContentType:="application/x-www-form-urlencoded",
Headers:={{"Accept-Language", "en-US,en;q=0.5"}, {"X-Requested-With", "XMLHttpRequest"}},
ThreadCount:=2)
Catch ex As Exception
If ex.Message.ContainsF("must sign in again", True) OrElse ex.Message.ContainsF("password expired", True) OrElse
(ex.Message.Contains("refresh_token") AndAlso ex.Message.Contains("is not valid")) Then '#269
Catch ex As ResponsedWebException
If ex.Response.ContainsF("must sign in again", True) OrElse ex.Response.ContainsF("password expired", True) OrElse
(ex.Response.Contains("refresh_token") AndAlso ex.Response.Contains("is not valid")) Then '#269
Return {"Relogin", ""}
Else
Throw
@@ -942,20 +957,20 @@ Retry:
Try
Result = NetRequestByClientMultiple("https://xsts.auth.xboxlive.com/xsts/authorize", HttpMethod.Post,
Content:=Request, ContentType:="application/json")
Catch ex As Net.WebException
Catch ex As ResponsedWebException
'参考 https://github.com/PrismarineJS/prismarine-auth/blob/master/src/common/Constants.js
If ex.Message.Contains("2148916227") Then
If ex.Response.Contains("2148916227") Then
MyMsgBox("该账号似乎已被微软封禁,无法登录。", "登录失败", "我知道了", IsWarn:=True)
Throw New Exception("$$")
ElseIf ex.Message.Contains("2148916233") Then
ElseIf ex.Response.Contains("2148916233") Then
If MyMsgBox("你尚未注册 Xbox 账户,请在注册后再登录。", "登录提示", "注册", "取消") = 1 Then
OpenWebsite("https://signup.live.com/signup")
End If
Throw New Exception("$$")
ElseIf ex.Message.Contains("2148916235") Then
ElseIf ex.Response.Contains("2148916235") Then
MyMsgBox($"你的网络所在的国家或地区无法登录微软账号。{vbCrLf}请使用加速器或 VPN。", "登录失败", "我知道了")
Throw New Exception("$$")
ElseIf ex.Message.Contains("2148916238") Then
ElseIf ex.Response.Contains("2148916238") Then
If MyMsgBox("该账号年龄不足,你需要先修改出生日期,然后才能登录。" & vbCrLf &
"该账号目前填写的年龄是否在 13 岁以上?", "登录提示", "13 岁以上", "12 岁以下", "我不知道") = 1 Then
OpenWebsite("https://account.live.com/editprof.aspx")
@@ -1364,13 +1379,13 @@ Retry:
McLaunchLog("新版 Game 参数获取成功")
End If
'编码参数(#4700、#5892、#5909)
If McLaunchJavaSelected.VersionCode >= 18 Then 'Dfile.encoding 需要放在 Dstdout.encoding 后面(#6934)
If Not Arguments.Contains("-Dfile.encoding=") Then Arguments = "-Dfile.encoding=COMPAT " & Arguments
End If
If McLaunchJavaSelected.VersionCode > 8 Then
If Not Arguments.Contains("-Dstdout.encoding=") Then Arguments = "-Dstdout.encoding=UTF-8 " & Arguments
If Not Arguments.Contains("-Dstderr.encoding=") Then Arguments = "-Dstderr.encoding=UTF-8 " & Arguments
End If
If McLaunchJavaSelected.VersionCode >= 18 Then
If Not Arguments.Contains("-Dfile.encoding=") Then Arguments = "-Dfile.encoding=COMPAT " & Arguments
End If
'MJSB
Arguments = Arguments.Replace(" -Dos.name=Windows 10", " -Dos.name=""Windows 10""")
'全屏
@@ -1692,7 +1707,7 @@ NextVersion:
GameArguments.Add("${access_token}", McLoginLoader.Output.AccessToken)
GameArguments.Add("${auth_session}", McLoginLoader.Output.AccessToken)
GameArguments.Add("${user_type}", "msa") '#1221
GameArguments.Add("${primary_jar}", Version.Path & Version.Name & ".jar")
GameArguments.Add("${primary_jar}", Version.Path & Version.Name & ".jar") '#6942
'窗口尺寸参数
Dim GameSize As Size
@@ -989,7 +989,7 @@ ExitDataLoad:
If ToString = "" Then
Return "原版 " & McName
Else
Return McName & ToString & If(ModeDebug, " (" & SortCode & "#)", "")
Return McName & ToString
End If
End Function
@@ -2415,7 +2415,7 @@ NextEntry:
Public Function FilterUserName(Raw As String, FilterChar As Char) As String
If Raw.Contains(":\Users\") Then
For Each Token In RegexSearch(Raw, "(?<=:\\Users\\)[^\\]+")
Raw = Raw.Replace(Token, New String(FilterChar, Token.Count))
Raw = Raw.Replace("\" & Token, "\" & New String(FilterChar, Token.Count))
Next
End If
Return Raw
@@ -349,14 +349,14 @@
State = MinecraftState.Crashed
'崩溃分析
WatcherLog("Minecraft 已崩溃,将在 2 秒后开始崩溃分析")
Hint("检测到 Minecraft 出现错误,错误分析已开始……")
Hint("检测到 Minecraft 出现错误,错误分析已开始……", HintType.Critical)
FeedbackInfo()
RunInNewThread(
Sub()
Try
Thread.Sleep(2000)
WatcherLog("崩溃分析开始")
Dim Analyzer As New CrashAnalyzer(PID)
Dim Analyzer As New CrashAnalyzer(Version)
Analyzer.Collect(Version.PathIndie, LatestLog.ToList)
Analyzer.Prepare()
Analyzer.Analyze(Version)
+1 -4
View File
@@ -116,11 +116,8 @@
End Try
Case "修改设置"
If Setup.IsEncoded(Data(0)) Then
Throw New Exception($"无法修改受加密保护的设置:{Data(0)}")
End If
Setup.Set(Data(0), Data(1))
Hint("已修改设置!", HintType.Finish)
Hint($"已写入设置:{Data(0)} → {Data(1)}", HintType.Finish)
Case Else
MyMsgBox("未知的事件类型:" & Type & vbCrLf & "请检查事件类型填写是否正确,或者 PCL 是否为最新版本。", "事件执行失败")
@@ -12,6 +12,8 @@ Friend Module ModSecret
Public OAuthClientId As String = If(Environment.GetEnvironmentVariable("PCL_MS_CLIENT_ID"), "")
'CurseForge API Key
Public CurseForgeAPIKey As String = If(Environment.GetEnvironmentVariable("PCL_CURSEFORGE_API_KEY"), "")
'用于匿名数据收集的腾讯云日志服务上报 URL,形如 https://{region}.cls.tencentcs.com/track?topic_id={topic_id}
Public Const ClsBaseUrl As String = ""
Friend Sub SecretOnApplicationStart()
'提升 UI 线程优先级
+1 -1
View File
@@ -137,7 +137,7 @@ Public Class DragHelper
Dim fileCount As UInteger = DragQueryFile(wParam, UInteger.MaxValue, Nothing, 0)
ReDim dropFilePaths(CInt(fileCount) - 1)
For i As UInteger = 0 To fileCount - 1
For i As UInteger = 0 To CInt(fileCount) - 1
Dim sb As New StringBuilder(MAX_PATH)
Dim result As UInteger = DragQueryFile(wParam, i, sb, sb.Capacity)
If result > 0 Then dropFilePaths(i) = sb.ToString()
@@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices
' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
' 方法是按如下所示使用“*”
<Assembly: AssemblyVersion("2.10.5.0")>
<Assembly: AssemblyFileVersion("2.10.5.0")>
<Assembly: AssemblyVersion("2.10.6.0")>
<Assembly: AssemblyFileVersion("2.10.6.0")>
<Assembly: NeutralResourcesLanguage("")>
@@ -243,11 +243,13 @@
If Not IsNothing(PageNew) AndAlso Not IsNothing(PageNew.Parent) Then PageNew.SetValue(ContentPresenter.ContentProperty, Nothing)
If Anim Then
'动画
Dispatcher.Invoke(Sub()
Dispatcher.Invoke(
Sub()
'执行动画
AniStart({
AaOpacity(PanLogin, -PanLogin.Opacity, 100,, New AniEaseOutFluent),
AaCode(Sub()
AaCode(
Sub()
AniControlEnabled += 1
PanLogin.Children.Clear()
PanLogin.Children.Add(PageNew)
@@ -93,7 +93,7 @@ Download:
GoTo Download
Case 3
Log("[Page] 主页预设:简单主页")
Url = "https://raw.gitcode.com/mfn233/PCL-Mainpage/raw/main/Custom.xaml"
Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/MFn233/Custom.xaml"
GoTo Download
Case 4
Log("[Page] 主页预设:每日整合包推荐")
@@ -129,7 +129,7 @@ Download:
GoTo Download
Case 12
Log("[Page] 主页预设:PCL GitHub 仪表盘")
Url = "https://raw.gitcode.com/Deep-Dark-Forest/PCL2-GitHub-Dashboard-Homepage/raw/main/custom.xaml"
Url = "https://ddf.pcl-community.org/Custom.xaml"
GoTo Download
End Select
End Select
@@ -17,7 +17,7 @@
<ColumnDefinition />
<ColumnDefinition Width="150" />
</Grid.ColumnDefinitions>
<local:MyListItem IsHitTestVisible="False" Title="龙腾猫跃" Margin="-5,0,15,0" Info="Plain Craft Launcher 的作者!" Grid.Row="0" Grid.Column="1" />
<local:MyListItem IsHitTestVisible="False" Title="龙腾猫跃" Margin="-5,0,15,0" Info="Plain Craft Launcher 的开发者!" Grid.Row="0" Grid.Column="1" />
<local:MyListItem IsHitTestVisible="False" Title="Plain Craft Launcher 2" Margin="-5,0,15,0" Info="当前版本:%VERSION%(%VERSIONCODE%.%BRANCH%)" Grid.Row="1" Grid.Column="1" x:Name="ItemAboutPcl" />
<Image Source="/Plain Craft Launcher 2;component/Images/Heads/Logo.png" Grid.Row="1" Margin="3">
<Image.Clip>
@@ -29,7 +29,7 @@
<EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
</Image.Clip>
</Image>
<local:MyButton Text="赞助作者" Grid.Column="2" Grid.Row="0" Height="35" EventType="打开网页" EventData="https://afdian.com/a/LTCat" />
<local:MyButton Text="赞助 PCL !" Grid.Column="2" Grid.Row="0" Height="35" EventType="打开网页" EventData="https://afdian.com/a/LTCat" ColorType="Highlight" />
<local:MyButton Text="查看源代码" Grid.Column="2" Grid.Row="1" Height="35" EventType="打开网页" EventData="https://github.com/Hex-Dragon/PCL2" />
</Grid>
</local:MyCard>
@@ -51,11 +51,12 @@
<ColumnDefinition Width="150" />
</Grid.ColumnDefinitions>
<local:MyListItem Title="bangbang93" Margin="-5,0,15,0" IsHitTestVisible="False" Info="提供 BMCLAPI 镜像源和 Forge 安装工具,详见 https://bmclapi.bangbang93.com" Grid.Row="0" Grid.Column="1" />
<local:MyButton x:Name="BtnAboutBmclapi" Text="赞助镜像源" Grid.Row="0" Grid.Column="2" Height="35" />
<local:MyButton Text="赞助镜像源" Grid.Row="0" Grid.Column="2" Height="35" EventType="打开网页" EventData="https://afdian.com/a/bangbang93" />
<local:MyListItem Title="MC 百科" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 Mod 名称的中文翻译和更多相关信息!" Grid.Row="1" Grid.Column="1" />
<local:MyButton x:Name="BtnAboutWiki" Text="打开百科" Grid.Row="1" Grid.Column="2" Height="35" />
<local:MyListItem Title="00ll00" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 Java Launch Wrapper 和一些重要服务支持!" Grid.Row="2" Grid.Column="1" />
<local:MyListItem Title="z0z0r4" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 MCIM 中国 Mod 下载镜像源和帮助库图床!" Grid.Row="3" Grid.Column="1" />
<local:MyButton Text="打开百科" Grid.Row="1" Grid.Column="2" Height="35" EventType="打开网页" EventData="https://www.mcmod.cn" />
<local:MyListItem Title="z0z0r4" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 MCIM 社区资源镜像源和帮助库图床!" Grid.Row="2" Grid.Column="1" />
<local:MyButton Text="MCIM 主页" Grid.Row="2" Grid.Column="2" Height="35" EventType="打开网页" EventData="https://github.com/mcmod-info-mirror" />
<local:MyListItem Title="00ll00" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 Java Launch Wrapper 和一些重要服务支持!" Grid.Row="3" Grid.Column="1" />
<local:MyListItem Title="Patrick" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="设计并制作了 PCL 图标,让我从做图标的水深火热中得到了解脱……" Grid.Row="4" Grid.Column="1" />
<local:MyListItem Title="Hao_Tian" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="在内测中找出了一大堆没人想得到的诡异 Bug,有非同寻常的 Bug 体质" Grid.Row="5" Grid.Column="1" />
<local:MyListItem Title="Minecraft 中文论坛" Margin="-5,0,15,0" IsHitTestVisible="False" Info="虽然已经关站了,但感谢此前提供了 MCBBS 镜像源……" Grid.Row="6" Grid.Column="1" />
@@ -70,12 +71,12 @@
<EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
</Image.Clip>
</Image>
<Image Source="/Plain Craft Launcher 2;component/Images/Heads/00ll00.png" Grid.Row="2" Margin="3">
<Image Source="/Plain Craft Launcher 2;component/Images/Heads/z0z0r4.png" Grid.Row="2" Margin="3">
<Image.Clip>
<EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
</Image.Clip>
</Image>
<Image Source="/Plain Craft Launcher 2;component/Images/Heads/z0z0r4.png" Grid.Row="3" Margin="3">
<Image Source="/Plain Craft Launcher 2;component/Images/Heads/00ll00.png" Grid.Row="3" Margin="3">
<Image.Clip>
<EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
</Image.Clip>
@@ -104,289 +105,245 @@
</local:MyCard>
<local:MyCard Margin="0,0,0,15" Title="赞助者">
<StackPanel Margin="25,40,10,20">
<TextBlock HorizontalAlignment="Left" Text="以下是 2025 年 6 月的高级赞助者们!感谢各位对 PCL 和伟大的咕咕咕事业的支持!" Margin="0,0,25,5.5" TextTrimming="None" TextWrapping="WrapWithOverflow" />
<WrapPanel Margin="0,0,0,10">
<TextBlock Width="120" Margin="0,1.5" Text="星月" />
<TextBlock Width="120" Margin="0,1.5" Text="Nemo" />
<TextBlock Width="120" Margin="0,1.5" Text="长歌当天" />
<TextBlock Width="120" Margin="0,1.5" Text="飒黎lIlIlI" />
<TextBlock Width="120" Margin="0,1.5" Text="hy" />
<TextBlock Width="120" Margin="0,1.5" Text="SaDhhJe" />
<TextBlock Width="120" Margin="0,1.5" Text="风铃子啊" />
<TextBlock Width="120" Margin="0,1.5" Text="柠娜" />
<TextBlock Width="120" Margin="0,1.5" Text="W丶北辰" />
<TextBlock Width="120" Margin="0,1.5" Text="才KRE" />
<TextBlock Width="120" Margin="0,1.5" Text="Yang_mistakeof" />
<TextBlock Width="120" Margin="0,1.5" Text="close eyes" />
<TextBlock Width="120" Margin="0,1.5" Text="顾顾" />
<TextBlock Width="120" Margin="0,1.5" Text="LTuuxj" />
<TextBlock Width="120" Margin="0,1.5" Text="花吃" />
<TextBlock Width="120" Margin="0,1.5" Text="FICazk" />
<TextBlock Width="120" Margin="0,1.5" Text="屑屑你" />
<TextBlock Width="120" Margin="0,1.5" Text="凉凉" />
<TextBlock Width="120" Margin="0,1.5" Text="WDSJ" />
<TextBlock Width="120" Margin="0,1.5" Text="Tohka" />
<TextBlock Width="120" Margin="0,1.5" Text="lz" />
<TextBlock Width="120" Margin="0,1.5" Text="哦嚯嚯嚯皮筋头" />
<TextBlock Width="120" Margin="0,1.5" Text="陈肖杰" />
<TextBlock Width="120" Margin="0,1.5" Text="MC小满" />
<TextBlock Width="120" Margin="0,1.5" Text="残光" />
<TextBlock Width="120" Margin="0,1.5" Text="玖玖璃" />
<TextBlock Width="120" Margin="0,1.5" Text="水晶OTZ" />
<TextBlock Width="120" Margin="0,1.5" Text="伯克礼" />
<TextBlock Width="120" Margin="0,1.5" Text="白猫海贼船" />
<TextBlock Width="120" Margin="0,1.5" Text="zhang1232" />
<TextBlock Width="120" Margin="0,1.5" Text="Never" />
<TextBlock Width="120" Margin="0,1.5" Text="Fish_pomelo" />
<TextBlock Width="120" Margin="0,1.5" Text="生风" />
<TextBlock Width="120" Margin="0,1.5" Text="富士山下" />
<TextBlock Width="120" Margin="0,1.5" Text="小七" />
<TextBlock Width="120" Margin="0,1.5" Text="发呆的呆毛君" />
<TextBlock Width="120" Margin="0,1.5" Text="天黑时看月亮" />
<TextBlock Width="120" Margin="0,1.5" Text="夜枫" />
<TextBlock Width="120" Margin="0,1.5" Text="_章333_" />
<TextBlock Width="120" Margin="0,1.5" Text="孙杰" />
<TextBlock Width="120" Margin="0,1.5" Text="wby" />
<TextBlock Width="120" Margin="0,1.5" Text="封尾==" />
<TextBlock Width="120" Margin="0,1.5" Text="你与空白皆无名" />
<TextBlock Width="120" Margin="0,1.5" Text="鱼" />
<TextBlock Width="120" Margin="0,1.5" Text="zzxniubi" />
<TextBlock Width="120" Margin="0,1.5" Text="炎燚火淼淼" />
<TextBlock Width="120" Margin="0,1.5" Text="三巿" />
<TextBlock Width="120" Margin="0,1.5" Text="奈落" />
<TextBlock Width="120" Margin="0,1.5" Text="华佗" />
<TextBlock Width="120" Margin="0,1.5" Text="oran9e" />
<TextBlock Width="120" Margin="0,1.5" Text="赤冰雨" />
<TextBlock Width="120" Margin="0,1.5" Text="Urizen" />
<TextBlock Width="120" Margin="0,1.5" Text=":)" />
<TextBlock Width="120" Margin="0,1.5" Text="skyqyzm" />
<TextBlock Width="120" Margin="0,1.5" Text="橘子皮丶" />
<TextBlock Width="120" Margin="0,1.5" Text="额外awa" />
<TextBlock Width="120" Margin="0,1.5" Text="安上月" />
<TextBlock Width="120" Margin="0,1.5" Text="念城南" />
<TextBlock Width="120" Margin="0,1.5" Text="多低山丘陵" />
<TextBlock Width="120" Margin="0,1.5" Text="书童呀" />
<TextBlock Width="120" Margin="0,1.5" Text="sxy192425" />
<TextBlock Width="120" Margin="0,1.5" Text="李好啊" />
<TextBlock Width="120" Margin="0,1.5" Text="MH_Nine" />
<TextBlock Width="120" Margin="0,1.5" Text="周先生" />
<TextBlock Width="120" Margin="0,1.5" Text="原" />
<TextBlock Width="120" Margin="0,1.5" Text="良田满穗" />
<TextBlock Width="120" Margin="0,1.5" Text="柴" />
<TextBlock Width="120" Margin="0,1.5" Text="庭师" />
<TextBlock Width="120" Margin="0,1.5" Text="。,。" />
<TextBlock Width="120" Margin="0,1.5" Text="DHLH" />
<TextBlock Width="120" Margin="0,1.5" Text="Xayj" />
<TextBlock Width="120" Margin="0,1.5" Text="绳网用户#37" />
<TextBlock Width="120" Margin="0,1.5" Text="LLLL" />
<TextBlock Width="120" Margin="0,1.5" Text="深绯红" />
<TextBlock Width="120" Margin="0,1.5" Text="奇伢七星" />
<TextBlock Width="120" Margin="0,1.5" Text="Akapigo" />
<TextBlock Width="120" Margin="0,1.5" Text="Shink_guns" />
<TextBlock Width="120" Margin="0,1.5" Text="Aqua 极&amp;坏." />
<TextBlock Width="120" Margin="0,1.5" Text="大事化小蛋糕" />
<TextBlock Width="120" Margin="0,1.5" Text="Nakiya233" />
<TextBlock Width="120" Margin="0,1.5" Text="花小妖" />
<TextBlock Width="120" Margin="0,1.5" Text="septebr" />
<TextBlock Width="120" Margin="0,1.5" Text="一只马喽" />
<TextBlock Width="120" Margin="0,1.5" Text="下暴雨BWB" />
<TextBlock Width="120" Margin="0,1.5" Text="QAQ" />
<TextBlock Width="240" Margin="0,1.5" Text="sl土豆社区服主B友" />
<TextBlock Width="120" Margin="0,1.5" Text="Wang" />
<TextBlock Width="120" Margin="0,1.5" Text="......" />
<TextBlock Width="120" Margin="0,1.5" Text="ResTmoW" />
<TextBlock Width="120" Margin="0,1.5" Text="bochibochibo" />
<TextBlock Width="120" Margin="0,1.5" Text="铸魂之灵" />
<TextBlock Width="120" Margin="0,1.5" Text="柏柏柏" />
<TextBlock Width="120" Margin="0,1.5" Text="Mart1s" />
<TextBlock Width="120" Margin="0,1.5" Text="KuruM148" />
<TextBlock Width="120" Margin="0,1.5" Text="KaiTouCrow" />
<TextBlock Width="120" Margin="0,1.5" Text="LIE-SHAN" />
<TextBlock Width="120" Margin="0,1.5" Text="慈悲方舟" />
<TextBlock Width="120" Margin="0,1.5" Text="于析" />
<TextBlock Width="120" Margin="0,1.5" Text="陌道" />
<TextBlock Width="120" Margin="0,1.5" Text="摇椅上的猫" />
<TextBlock Width="120" Margin="0,1.5" Text="五个麦卷" />
<TextBlock Width="120" Margin="0,1.5" Text="Miraclepoi" />
<TextBlock Width="120" Margin="0,1.5" Text="XiaoLI" />
<TextBlock Width="120" Margin="0,1.5" Text="啊吧啊吧的肥宅" />
<TextBlock Width="120" Margin="0,1.5" Text="不娶雨婷不改名" />
<TextBlock Width="120" Margin="0,1.5" Text="oppo19" />
<TextBlock Width="120" Margin="0,1.5" Text="博麗靈夢" />
<TextBlock Width="120" Margin="0,1.5" Text="莹 of yours" />
<TextBlock Width="120" Margin="0,1.5" Text="ChinaFZXPVP" />
<TextBlock Width="120" Margin="0,1.5" Text="城之内sama" />
<TextBlock Width="120" Margin="0,1.5" Text="ENXI" />
<TextBlock Width="120" Margin="0,1.5" Text="steve_c418" />
<TextBlock Width="120" Margin="0,1.5" Text="洛长安" />
<TextBlock Width="120" Margin="0,1.5" Text="magic_muggle" />
<TextBlock Width="120" Margin="0,1.5" Text="小猫游六喵" />
<TextBlock Width="120" Margin="0,1.5" Text="JY" />
<TextBlock Width="120" Margin="0,1.5" Text="雪豹起司可颂" />
<TextBlock Width="120" Margin="0,1.5" Text="wlsy" />
<TextBlock Width="120" Margin="0,1.5" Text="齐先生爱溜达" />
<TextBlock Width="120" Margin="0,1.5" Text="是小泠啊" />
<TextBlock Width="120" Margin="0,1.5" Text="xioyiao" />
<TextBlock Width="120" Margin="0,1.5" Text="BunnyMiku" />
<TextBlock Width="120" Margin="0,1.5" Text="dadagga" />
<TextBlock Width="120" Margin="0,1.5" Text="无极之笔" />
<TextBlock Width="120" Margin="0,1.5" Text="xiaoyu" />
<TextBlock Width="120" Margin="0,1.5" Text="王梓杰" />
<TextBlock Width="120" Margin="0,1.5" Text="wjbjjd" />
<TextBlock Width="120" Margin="0,1.5" Text="Candy_Mo" />
<TextBlock Width="120" Margin="0,1.5" Text="lettmin_" />
<TextBlock Width="120" Margin="0,1.5" Text="七九·Alnasl" />
<TextBlock Width="120" Margin="0,1.5" Text="辉" />
<TextBlock Width="120" Margin="0,1.5" Text="何为最优解" />
<TextBlock Width="120" Margin="0,1.5" Text="crazy丶天人" />
<TextBlock Width="120" Margin="0,1.5" Text="XsBlueSky" />
<TextBlock Width="120" Margin="0,1.5" Text="冬将軍" />
<TextBlock Width="120" Margin="0,1.5" Text="tiechui" />
<TextBlock Width="120" Margin="0,1.5" Text="Liu2Shi2Pu2" />
<TextBlock Width="120" Margin="0,1.5" Text="Yu_s" />
<TextBlock Width="120" Margin="0,1.5" Text="刘四妹" />
<TextBlock Width="120" Margin="0,1.5" Text="枝皙" />
<TextBlock Width="120" Margin="0,1.5" Text="CC" />
<TextBlock Width="120" Margin="0,1.5" Text="Slana23" />
<TextBlock Width="120" Margin="0,1.5" Text="MMMy" />
<TextBlock Width="120" Margin="0,1.5" Text="Venuse" />
<TextBlock Width="120" Margin="0,1.5" Text="microjie" />
<TextBlock Width="240" Margin="0,1.5" Text="Miner#Cetyleno~^" />
<TextBlock Width="120" Margin="0,1.5" Text="春江花月夜" />
<TextBlock Width="120" Margin="0,1.5" Text="落南子" />
<TextBlock Width="120" Margin="0,1.5" Text="AL1Su-爱丽丝" />
<TextBlock Width="120" Margin="0,1.5" Text="我木有呆毛" />
<TextBlock Width="120" Margin="0,1.5" Text="乌羽" />
<TextBlock Width="120" Margin="0,1.5" Text="知性de含羞草" />
<TextBlock Width="120" Margin="0,1.5" Text="星の殇" />
<TextBlock Width="120" Margin="0,1.5" Text="IED LTAM" />
<TextBlock Width="120" Margin="0,1.5" Text="格罗夫斯基" />
<TextBlock Width="120" Margin="0,1.5" Text="梦启泉" />
<TextBlock Width="120" Margin="0,1.5" Text="岁月无痕" />
<TextBlock Width="120" Margin="0,1.5" Text="????" />
<TextBlock Width="120" Margin="0,1.5" Text="超级脑壳" />
<TextBlock Width="120" Margin="0,1.5" Text="空梦" />
<TextBlock Width="120" Margin="0,1.5" Text="薛小欣" />
<TextBlock Width="120" Margin="0,1.5" Text="蛋黄豆角" />
<TextBlock Width="120" Margin="0,1.5" Text="芒果茶州" />
<TextBlock Width="120" Margin="0,1.5" Text="癫风院院长" />
<TextBlock Width="120" Margin="0,1.5" Text="三十一" />
<TextBlock Width="120" Margin="0,1.5" Text="美醉了" />
<TextBlock Width="240" Margin="0,1.5" Text="中科院在逃量子计算机" />
<TextBlock Width="120" Margin="0,1.5" Text="." />
<TextBlock Width="120" Margin="0,1.5" Text="枫" />
<TextBlock Width="120" Margin="0,1.5" Text="jjj" />
<TextBlock Width="120" Margin="0,1.5" Text="clilick" />
<TextBlock Width="120" Margin="0,1.5" Text="我很快乐" />
<TextBlock Width="120" Margin="0,1.5" Text="Phoenix tamer" />
<TextBlock Width="120" Margin="0,1.5" Text="Lsp77" />
<TextBlock Width="120" Margin="0,1.5" Text="太阳神" />
<TextBlock Width="120" Margin="0,1.5" Text="ikun0014" />
<TextBlock Width="120" Margin="0,1.5" Text="IncredibleYu" />
<TextBlock Width="120" Margin="0,1.5" Text="在下粉毛控" />
<TextBlock Width="120" Margin="0,1.5" Text="SuperCrazyK" />
<TextBlock Width="120" Margin="0,1.5" Text="阿柔" />
<TextBlock Width="120" Margin="0,1.5" Text="HaKNa" />
<TextBlock Width="120" Margin="0,1.5" Text="胡十一" />
<TextBlock Width="120" Margin="0,1.5" Text="菲利絲" />
<TextBlock Width="120" Margin="0,1.5" Text="迷梦的羽" />
<TextBlock Width="120" Margin="0,1.5" Text="20018" />
<TextBlock Width="120" Margin="0,1.5" Text="波比科普员" />
<TextBlock Width="120" Margin="0,1.5" Text="Xiao_JIA" />
<TextBlock Width="240" Margin="0,1.5" Text="龙腾我是你的头号粉丝" />
<TextBlock Width="120" Margin="0,1.5" Text="keer1563" />
<TextBlock Width="120" Margin="0,1.5" Text="百鬼まル" />
<TextBlock Width="120" Margin="0,1.5" Text="DPSYnt" />
<TextBlock Width="120" Margin="0,1.5" Text="七色彩羽" />
<TextBlock HorizontalAlignment="Left" Text="以下是 2025 年 7 月的高级赞助者们!感谢各位对 PCL 和伟大的咕咕咕事业的支持!" Margin="0,0,25,5.5" TextTrimming="None" TextWrapping="WrapWithOverflow" />
<WrapPanel Margin="0,0,0,10"> <TextBlock Width="120" Margin="0,1.5" Text="ZSF" />
<TextBlock Width="120" Margin="0,1.5" Text="TizhleF" />
<TextBlock Width="120" Margin="0,1.5" Text="方源" />
<TextBlock Width="120" Margin="0,1.5" Text="日月空呵" />
<TextBlock Width="120" Margin="0,1.5" Text="贾明志" />
<TextBlock Width="120" Margin="0,1.5" Text="百瑞" />
<TextBlock Width="120" Margin="0,1.5" Text="Flying___pig" />
<TextBlock Width="120" Margin="0,1.5" Text="绝世" />
<TextBlock Width="120" Margin="0,1.5" Text="Jwac" />
<TextBlock Width="120" Margin="0,1.5" Text="万玖" />
<TextBlock Width="120" Margin="0,1.5" Text="墨忆" />
<TextBlock Width="120" Margin="0,1.5" Text="天刹" />
<TextBlock Width="120" Margin="0,1.5" Text="Cess" />
<TextBlock Width="120" Margin="0,1.5" Text="ender_glass" />
<TextBlock Width="120" Margin="0,1.5" Text="TT" />
<TextBlock Width="120" Margin="0,1.5" Text="白玄.雪狼" />
<TextBlock Width="120" Margin="0,1.5" Text="MUCT" />
<TextBlock Width="120" Margin="0,1.5" Text="崇昀" />
<TextBlock Width="120" Margin="0,1.5" Text="绪" />
<TextBlock Width="120" Margin="0,1.5" Text="吾皇万岁" />
<TextBlock Width="120" Margin="0,1.5" Text="Ander·Les" />
<TextBlock Width="120" Margin="0,1.5" Text="Eoctopus" />
<TextBlock Width="120" Margin="0,1.5" Text="时光飞逝一下午" />
<TextBlock Width="120" Margin="0,1.5" Text="Carl7412" />
<TextBlock Width="120" Margin="0,1.5" Text="ShinyChariot" />
<TextBlock Width="120" Margin="0,1.5" Text="骨故谷" />
<TextBlock Width="120" Margin="0,1.5" Text="?" />
<TextBlock Width="120" Margin="0,1.5" Text="Jinji希子" />
<TextBlock Width="120" Margin="0,1.5" Text="自然选择" />
<TextBlock Width="120" Margin="0,1.5" Text="云念" />
<TextBlock Width="120" Margin="0,1.5" Text="钱尹鹏" />
<TextBlock Width="120" Margin="0,1.5" Text="TBONC" />
<TextBlock Width="120" Margin="0,1.5" Text="祈农" />
<TextBlock Width="120" Margin="0,1.5" Text="凤凰院凶真" />
<TextBlock Width="120" Margin="0,1.5" Text="ShuangDaoRen" />
<TextBlock Width="120" Margin="0,1.5" Text="PXZ233" />
<TextBlock Width="120" Margin="0,1.5" Text="二十二今天有没有" />
<TextBlock Width="120" Margin="0,1.5" Text="天魕" />
<TextBlock Width="120" Margin="0,1.5" Text="南华清" />
<TextBlock Width="120" Margin="0,1.5" Text="66112447" />
<TextBlock Width="120" Margin="0,1.5" Text="夏行子" />
<TextBlock Width="120" Margin="0,1.5" Text="周俊成" />
<TextBlock Width="120" Margin="0,1.5" Text="乌漆嘛黑" />
<TextBlock Width="120" Margin="0,1.5" Text="肘击恶魔佐巴扬" />
<TextBlock Width="120" Margin="0,1.5" Text="Pari~" />
<TextBlock Width="120" Margin="0,1.5" Text="红云" />
<TextBlock Width="120" Margin="0,1.5" Text="Link-an" />
<TextBlock Width="120" Margin="0,1.5" Text="想要钱用不完" />
<TextBlock Width="120" Margin="0,1.5" Text="花宝" />
<TextBlock Width="120" Margin="0,1.5" Text="生于春天的雷电" />
<TextBlock Width="120" Margin="0,1.5" Text="被偷去的睡眠" />
<TextBlock Width="120" Margin="0,1.5" Text="liuxuan" />
<TextBlock Width="120" Margin="0,1.5" Text="寒枫凌" />
<TextBlock Width="120" Margin="0,1.5" Text="雀色时" />
<TextBlock Width="120" Margin="0,1.5" Text="架" />
<TextBlock Width="120" Margin="0,1.5" Text="终成究竟觉" />
<TextBlock Width="120" Margin="0,1.5" Text="S0D1UM" />
<TextBlock Width="120" Margin="0,1.5" Text="吞仔送命" />
<TextBlock Width="120" Margin="0,1.5" Text="白浪宇宙" />
<TextBlock Width="120" Margin="0,1.5" Text="Crimson" />
<TextBlock Width="120" Margin="0,1.5" Text="Mibo_MkIX" />
<TextBlock Width="120" Margin="0,1.5" Text="G.snine18^7" />
<TextBlock Width="120" Margin="0,1.5" Text="两把雨伞" />
<TextBlock Width="120" Margin="0,1.5" Text="古明地苑" />
<TextBlock Width="240" Margin="0,1.5" Text="MarbleMionshevic" />
<TextBlock Width="120" Margin="0,1.5" Text=":〈" />
<TextBlock Width="120" Margin="0,1.5" Text="紫罗兰" />
<TextBlock Width="120" Margin="0,1.5" Text="asai" />
<TextBlock Width="120" Margin="0,1.5" Text="隔壁小明" />
<TextBlock Width="120" Margin="0,1.5" Text="就爱唱歌" />
<TextBlock Width="120" Margin="0,1.5" Text="沫神鹤" />
<TextBlock Width="120" Margin="0,1.5" Text="风已消逝" />
<TextBlock Width="120" Margin="0,1.5" Text="光意留闪" />
<TextBlock Width="120" Margin="0,1.5" Text="我们长征的路上" />
<TextBlock Width="120" Margin="0,1.5" Text="芸芷" />
<TextBlock Width="120" Margin="0,1.5" Text="函数极限" />
<TextBlock Width="120" Margin="0,1.5" Text="冰川泥" />
<TextBlock Width="120" Margin="0,1.5" Text="XunWei" />
<TextBlock Width="120" Margin="0,1.5" Text="sirous" />
<TextBlock Width="120" Margin="0,1.5" Text="路过某打酱油的" />
<TextBlock Width="120" Margin="0,1.5" Text="Gnight07" />
<TextBlock Width="120" Margin="0,1.5" Text="结构德古拉" />
<TextBlock Width="120" Margin="0,1.5" Text="myyukee" />
<TextBlock Width="240" Margin="0,1.5" Text="云之彼端约定的地方" />
<TextBlock Width="120" Margin="0,1.5" Text="苏玖" />
<TextBlock Width="120" Margin="0,1.5" Text="赤沃净" />
<TextBlock Width="120" Margin="0,1.5" Text="YYC" />
<TextBlock Width="120" Margin="0,1.5" Text="晨曦酒庄高冷男" />
<TextBlock Width="120" Margin="0,1.5" Text="herald112" />
<TextBlock Width="120" Margin="0,1.5" Text="Foxman" />
<TextBlock Width="120" Margin="0,1.5" Text="KoreQAQ" />
<TextBlock Width="120" Margin="0,1.5" Text="TechOfRevo" />
<TextBlock Width="120" Margin="0,1.5" Text="lqs" />
<TextBlock Width="120" Margin="0,1.5" Text="简某" />
<TextBlock Width="120" Margin="0,1.5" Text="源起于此" />
<TextBlock Width="120" Margin="0,1.5" Text="爱莉希雅" />
<TextBlock Width="120" Margin="0,1.5" Text=" 和忧" />
<TextBlock Width="240" Margin="0,1.5" Text="全明星小面包批发商DIO" />
<TextBlock Width="120" Margin="0,1.5" Text="碎序" />
<TextBlock Width="120" Margin="0,1.5" Text="U" />
<TextBlock Width="120" Margin="0,1.5" Text="Dumlet" />
<TextBlock Width="120" Margin="0,1.5" Text="johnqian" />
<TextBlock Width="120" Margin="0,1.5" Text="KANG" />
<TextBlock Width="120" Margin="0,1.5" Text="owod" />
<TextBlock Width="120" Margin="0,1.5" Text="九" />
<TextBlock Width="120" Margin="0,1.5" Text="苑煜" />
<TextBlock Width="120" Margin="0,1.5" Text="壹" />
<TextBlock Width="120" Margin="0,1.5" Text="UA-Ming" />
<TextBlock Width="120" Margin="0,1.5" Text="可爱小探姬" />
<TextBlock Width="120" Margin="0,1.5" Text="霜月" />
<TextBlock Width="120" Margin="0,1.5" Text="bud" />
<TextBlock Width="120" Margin="0,1.5" Text="小虐SAIKYO" />
<TextBlock Width="120" Margin="0,1.5" Text="zealotand" />
<TextBlock Width="120" Margin="0,1.5" Text="comico" />
<TextBlock Width="120" Margin="0,1.5" Text="万山松" />
<TextBlock Width="120" Margin="0,1.5" Text="依梦明天" />
<TextBlock Width="120" Margin="0,1.5" Text="化形彧九尾" />
<TextBlock Width="120" Margin="0,1.5" Text="知崎" />
<TextBlock Width="120" Margin="0,1.5" Text="LOG175" />
<TextBlock Width="120" Margin="0,1.5" Text="绵" />
<TextBlock Width="120" Margin="0,1.5" Text="scp00813" />
<TextBlock Width="120" Margin="0,1.5" Text="宝宝" />
<TextBlock Width="120" Margin="0,1.5" Text="9527" />
<TextBlock Width="120" Margin="0,1.5" Text="ICE_xwx" />
<TextBlock Width="120" Margin="0,1.5" Text="羽笙喵喵" />
<TextBlock Width="120" Margin="0,1.5" Text="ssvgg(☉ x ☉)" />
<TextBlock Width="120" Margin="0,1.5" Text="Happymeals" />
<TextBlock Width="120" Margin="0,1.5" Text="shen12244" />
<TextBlock Width="120" Margin="0,1.5" Text="一般路过AAA" />
<TextBlock Width="120" Margin="0,1.5" Text="Niko" />
<TextBlock Width="120" Margin="0,1.5" Text="qroiwopqri" />
<TextBlock Width="120" Margin="0,1.5" Text="TringDron" />
<TextBlock Width="120" Margin="0,1.5" Text="有屳則名" />
<TextBlock Width="120" Margin="0,1.5" Text="TX2006" />
<TextBlock Width="120" Margin="0,1.5" Text="滑天下之大稽" />
<TextBlock Width="120" Margin="0,1.5" Text="中东悍匪" />
<TextBlock Width="120" Margin="0,1.5" Text="鬼泣々离殇" />
<TextBlock Width="120" Margin="0,1.5" Text="蒼崎青子" />
<TextBlock Width="120" Margin="0,1.5" Text="wyh114514" />
<TextBlock Width="120" Margin="0,1.5" Text="飞飞在睡觉。" />
<TextBlock Width="120" Margin="0,1.5" Text="柚西" />
<TextBlock Width="120" Margin="0,1.5" Text="XIAOSHUAI" />
<TextBlock Width="120" Margin="0,1.5" Text="saxioh" />
<TextBlock Width="120" Margin="0,1.5" Text="baibaibai" />
<TextBlock Width="120" Margin="0,1.5" Text="事屑Jerry" />
<TextBlock Width="120" Margin="0,1.5" Text="Rs32" />
<TextBlock Width="120" Margin="0,1.5" Text="SPDish" />
<TextBlock Width="120" Margin="0,1.5" Text="风早九夜" />
<TextBlock Width="120" Margin="0,1.5" Text="Reg" />
<TextBlock Width="120" Margin="0,1.5" Text="hellord" />
<TextBlock Width="120" Margin="0,1.5" Text="时本ki" />
<TextBlock Width="120" Margin="0,1.5" Text="mamana" />
<TextBlock Width="120" Margin="0,1.5" Text="放肆的微笑" />
<TextBlock Width="120" Margin="0,1.5" Text="人没逝" />
<TextBlock Width="120" Margin="0,1.5" Text="wddjww" />
<TextBlock Width="120" Margin="0,1.5" Text="xiao澄" />
<TextBlock Width="120" Margin="0,1.5" Text="银狼碎片" />
<TextBlock Width="120" Margin="0,1.5" Text="OniKata_Kayoko" />
<TextBlock Width="120" Margin="0,1.5" Text="曦" />
<TextBlock Width="120" Margin="0,1.5" Text="Echo" />
<TextBlock Width="120" Margin="0,1.5" Text="画卿颜" />
<TextBlock Width="120" Margin="0,1.5" Text="夏 " />
<TextBlock Width="120" Margin="0,1.5" Text="jiege45" />
<TextBlock Width="120" Margin="0,1.5" Text="甜食先生" />
<TextBlock Width="120" Margin="0,1.5" Text="虚莫妄玄" />
<TextBlock Width="120" Margin="0,1.5" Text="天恒" />
<TextBlock Width="120" Margin="0,1.5" Text="我有馄饨" />
<TextBlock Width="120" Margin="0,1.5" Text="布布曼" />
<TextBlock Width="120" Margin="0,1.5" Text="qwqewe" />
<TextBlock Width="120" Margin="0,1.5" Text="114514" />
<TextBlock Width="120" Margin="0,1.5" Text="YJ_42" />
<TextBlock Width="120" Margin="0,1.5" Text="Xricron" />
<TextBlock Width="120" Margin="0,1.5" Text="抛弃大脑" />
<TextBlock Width="120" Margin="0,1.5" Text="10455885" />
<TextBlock Width="120" Margin="0,1.5" Text="羽渡白砂" />
<TextBlock Width="120" Margin="0,1.5" Text="沙" />
<TextBlock Width="120" Margin="0,1.5" Text="sukous" />
<TextBlock Width="120" Margin="0,1.5" Text="册那" />
<TextBlock Width="120" Margin="0,1.5" Text="KMYLS" />
<TextBlock Width="120" Margin="0,1.5" Text="kakadeso" />
<TextBlock Width="120" Margin="0,1.5" Text="懒猫" />
<TextBlock Width="120" Margin="0,1.5" Text="清岚" />
<TextBlock Width="120" Margin="0,1.5" Text="Atopos" />
<TextBlock Width="120" Margin="0,1.5" Text="苦尽柑来" />
<TextBlock Width="120" Margin="0,1.5" Text="脑洞大开的血魔" />
<TextBlock Width="120" Margin="0,1.5" Text="ももかわるこ" />
<TextBlock Width="120" Margin="0,1.5" Text="空中的风" />
<TextBlock Width="120" Margin="0,1.5" Text="黑夜幽灵" />
<TextBlock Width="120" Margin="0,1.5" Text="H1saNe" />
<TextBlock Width="120" Margin="0,1.5" Text="故风" />
<TextBlock Width="120" Margin="0,1.5" Text="臭氧化碳" />
<TextBlock Width="120" Margin="0,1.5" Text="情来风" />
<TextBlock Width="120" Margin="0,1.5" Text="柒月" />
<TextBlock Width="120" Margin="0,1.5" Text="汪汪队队长" />
<TextBlock Width="120" Margin="0,1.5" Text="迷路的猫" />
<TextBlock Width="120" Margin="0,1.5" Text="ktyxlan_lan" />
<TextBlock Width="120" Margin="0,1.5" Text="琳琅039" />
<TextBlock Width="120" Margin="0,1.5" Text="黑色额度" />
<TextBlock Width="120" Margin="0,1.5" Text="sahaua" />
<TextBlock Width="120" Margin="0,1.5" Text="宦昭" />
<TextBlock Width="120" Margin="0,1.5" Text="镜刹" />
<TextBlock Width="120" Margin="0,1.5" Text="房石诶多" />
<TextBlock Width="120" Margin="0,1.5" Text="熊" />
<TextBlock Width="120" Margin="0,1.5" Text="NQ" />
<TextBlock Width="120" Margin="0,1.5" Text="我志永纯" />
<TextBlock Width="120" Margin="0,1.5" Text="漫城" />
<TextBlock Width="120" Margin="0,1.5" Text="憨憨的小草" />
<TextBlock Width="120" Margin="0,1.5" Text="泽涛" />
<TextBlock Width="120" Margin="0,1.5" Text="星海鹿樱" />
<TextBlock Width="120" Margin="0,1.5" Text="祭°" />
<TextBlock Width="120" Margin="0,1.5" Text="赛冷特呀" />
<TextBlock Width="120" Margin="0,1.5" Text="无妄之灾" />
<TextBlock Width="120" Margin="0,1.5" Text="ZGW2008" />
<TextBlock Width="120" Margin="0,1.5" Text="没事多喝感冒灵" />
<TextBlock Width="120" Margin="0,1.5" Text="一梦筱筱" />
<TextBlock Width="120" Margin="0,1.5" Text="twokness" />
<TextBlock Width="120" Margin="0,1.5" Text="hhy7171" />
<TextBlock Width="120" Margin="0,1.5" Text="子虚" />
<TextBlock Width="120" Margin="0,1.5" Text="猫羽" />
<TextBlock Width="120" Margin="0,1.5" Text="有氧丁真" />
<TextBlock Width="120" Margin="0,1.5" Text="dddr" />
<TextBlock Width="120" Margin="0,1.5" Text="天气热" />
<TextBlock Width="120" Margin="0,1.5" Text="Emmanuel" />
<TextBlock Width="120" Margin="0,1.5" Text="夕尽暮染" />
<TextBlock Width="120" Margin="0,1.5" Text="Bob_Marcus" />
<TextBlock Width="120" Margin="0,1.5" Text="初心无尘" />
<TextBlock Width="120" Margin="0,1.5" Text="朱利安" />
<TextBlock Width="120" Margin="0,1.5" Text="461863352" />
<TextBlock Width="120" Margin="0,1.5" Text="庭" />
<TextBlock Width="120" Margin="0,1.5" Text="Xing_K" />
<TextBlock Width="120" Margin="0,1.5" Text="yzt" />
<TextBlock Width="120" Margin="0,1.5" Text="nuycn" />
<TextBlock Width="120" Margin="0,1.5" Text="鸡人" />
<TextBlock Width="120" Margin="0,1.5" Text="爱无界i" />
<TextBlock Width="120" Margin="0,1.5" Text="Zik yeung" />
<TextBlock Width="120" Margin="0,1.5" Text="墨子吉安" />
<TextBlock Width="120" Margin="0,1.5" Text="柠果籽" />
<TextBlock Width="120" Margin="0,1.5" Text="cai1" />
<TextBlock Width="120" Margin="0,1.5" Text="小比登T^T" />
<TextBlock Width="120" Margin="0,1.5" Text="hb" />
<TextBlock Width="120" Margin="0,1.5" Text="caizzz" />
<TextBlock Width="120" Margin="0,1.5" Text="yyin" />
<TextBlock Width="120" Margin="0,1.5" Text="無言" />
<TextBlock Width="120" Margin="0,1.5" Text="修" />
<TextBlock Width="120" Margin="0,1.5" Text="改头换面" />
<TextBlock Width="120" Margin="0,1.5" Text="无敌百搭的款式" />
<TextBlock Width="120" Margin="0,1.5" Text="御坂1354号" />
<TextBlock Width="120" Margin="0,1.5" Text="木子" />
<TextBlock Width="120" Margin="0,1.5" Text="萤火焱攸" />
<TextBlock Width="120" Margin="0,1.5" Text="盼盼不是Panda" />
<TextBlock Width="120" Margin="0,1.5" Text="烤肉真香" />
<TextBlock Width="120" Margin="0,1.5" Text="ZhuTan12" />
<TextBlock Width="120" Margin="0,1.5" Text="tom" />
<TextBlock Width="120" Margin="0,1.5" Text="洛竹" />
<TextBlock Width="120" Margin="0,1.5" Text="foob" />
<TextBlock Width="120" Margin="0,1.5" Text="Garylu" />
<TextBlock Width="120" Margin="0,1.5" Text="阮绍轩" />
<TextBlock Width="120" Margin="0,1.5" Text="xin822" />
<TextBlock Width="120" Margin="0,1.5" Text="BAIgivele" />
<TextBlock Width="120" Margin="0,1.5" Text="ljc" />
<TextBlock Width="120" Margin="0,1.5" Text="暖笑" />
<TextBlock Width="120" Margin="0,1.5" Text="焦糖流酥" />
<TextBlock Width="120" Margin="0,1.5" Text="绚丽的星河" />
<TextBlock Width="120" Margin="0,1.5" Text="魔导兔" />
<TextBlock Width="120" Margin="0,1.5" Text="吾乃斗笔" />
<TextBlock Width="120" Margin="0,1.5" Text="君殇" />
<TextBlock Width="120" Margin="0,1.5" Text="沙轻" />
<TextBlock Width="120" Margin="0,1.5" Text="邓布利多" />
<TextBlock Width="120" Margin="0,1.5" Text="红薯散养专业户" />
<TextBlock Width="120" Margin="0,1.5" Text="十言" />
<TextBlock Width="120" Margin="0,1.5" Text="vvvghjvvv" />
<TextBlock Width="120" Margin="0,1.5" Text="法斯" />
<TextBlock Width="120" Margin="0,1.5" Text="DASENSUN" />
<TextBlock Width="120" Margin="0,1.5" Text="HTS" />
<TextBlock Width="120" Margin="0,1.5" Text="握不住信新心" />
<TextBlock Width="120" Margin="0,1.5" Text="sycuuj133" />
<TextBlock Width="120" Margin="0,1.5" Text="天杉大将军" />
<TextBlock Width="120" Margin="0,1.5" Text="风见翎" />
<TextBlock Width="120" Margin="0,1.5" Text="江心Rain" />
<TextBlock Width="120" Margin="0,1.5" Text="云阿云" />
<TextBlock Width="120" Margin="0,1.5" Text="小命" />
<TextBlock Width="120" Margin="0,1.5" Text="南宫若兮" />
<TextBlock Width="120" Margin="0,1.5" Text="Landsilde" />
<TextBlock Width="120" Margin="0,1.5" Text="zzz" />
<TextBlock Width="120" Margin="0,1.5" Text="星期三" />
<TextBlock Width="120" Margin="0,1.5" Text="Ashburn" />
<TextBlock Width="120" Margin="0,1.5" Text="123" />
<TextBlock Width="120" Margin="0,1.5" Text="九日" />
<TextBlock Width="120" Margin="0,1.5" Text="古神" />
<TextBlock Width="120" Margin="0,1.5" Text="月宫星耀" />
<TextBlock Width="120" Margin="0,1.5" Text="郁子恒是FW" />
<TextBlock Width="240" Margin="0,1.5" Text="每天吃吃吃吃吃不饱" />
<TextBlock Width="120" Margin="0,1.5" Text="Freezhao" />
<TextBlock Width="120" Margin="0,1.5" Text="ZHypocrite" />
<TextBlock Width="120" Margin="0,1.5" Text="十下小雨" />
<TextBlock Width="120" Margin="0,1.5" Text="九 十" />
<TextBlock Width="120" Margin="0,1.5" Text="RuthlessXdream" />
<TextBlock Width="120" Margin="0,1.5" Text="zv-vz" />
<TextBlock Width="120" Margin="0,1.5" Text="汐沄的随记" />
<TextBlock Width="120" Margin="0,1.5" Text="REMOTE" />
<TextBlock Width="120" Margin="0,1.5" Text="昔阳" />
<TextBlock Width="120" Margin="0,1.5" Text="七度ユキノ" />
<TextBlock Width="120" Margin="0,1.5" Text="KNISX" />
<TextBlock Width="120" Margin="0,1.5" Text="RainbowDashRD" />
<TextBlock Width="120" Margin="0,1.5" Text="夢曦" />
<TextBlock Width="120" Margin="0,1.5" Text="跳雨风" />
<TextBlock Width="120" Margin="0,1.5" Text="望言苏" />
<TextBlock Width="120" Margin="0,1.5" Text="四分白Fortenz" />
<TextBlock Width="120" Margin="0,1.5" Text="UUZ" />
<TextBlock Width="120" Margin="0,1.5" Text="Ankairis" />
<TextBlock Width="120" Margin="0,1.5" Text="Jn1E" />
<TextBlock Width="120" Margin="0,1.5" Text="云山如昨好" />
<TextBlock Width="120" Margin="0,1.5" Text="LYJ0415" />
<TextBlock Width="120" Margin="0,1.5" Text="空?" />
<TextBlock Width="120" Margin="0,1.5" Text="Awfrlu+" />
<TextBlock Width="120" Margin="0,1.5" Text="懒帝" />
<TextBlock Width="120" Margin="0,1.5" Text="北安丶七叔" />
<TextBlock Width="120" Margin="0,1.5" Text="xkw" />
<TextBlock Width="120" Margin="0,1.5" Text="KINO" />
<TextBlock Width="120" Margin="0,1.5" Text="POTATO" />
<TextBlock Width="120" Margin="0,1.5" Text="少昊氏" />
<TextBlock Width="240" Margin="0,1.5" Text="狂踹瘸子那條好腿丶" />
<TextBlock Width="240" Margin="0,1.5" Text="Thallium_Ash【铊尘】(坨坨)" />
<TextBlock Width="120" Margin="0,1.5" Text="陌雨泠涯" />
<TextBlock Width="120" Margin="0,1.5" Text="bajie79" />
<TextBlock Width="120" Margin="0,1.5" Text="紘垰" />
</WrapPanel>
<Grid Height="35">
<Grid.ColumnDefinitions>
@@ -403,9 +360,11 @@
</local:MyCard>
<local:MyCard Margin="0,0,0,15" Title="法律信息" IsSwapped="True" CanSwap="True">
<StackPanel Margin="25,39,23,20">
<TextBlock Text="隐私说明" TextWrapping="Wrap" Margin="0,6,0,4" FontWeight="Bold" />
<TextBlock Margin="0,0,0,2" LineHeight="17" Text="本软件的 User Agent 中包含启动器的版本号,以统计各版本的用户数量。&#13;除此之外,本软件不会向开发者上传任何其他信息。" TextWrapping="Wrap" />
<TextBlock Text="其他信息" TextWrapping="Wrap" Margin="0,12,0,4" FontWeight="Bold" />
<TextBlock Text="匿名数据收集" TextWrapping="Wrap" Margin="0,6,0,4" FontWeight="Bold" />
<TextBlock Margin="0,0,0,2" LineHeight="17" Text="当下载失败、PCL 出错、游戏崩溃等事件时,PCL 会匿名上报信息,以通知龙猫 “哦吼,出错了”,让龙猫能更好地修 Bug……(PCL 不会上传或收集任何个人信息,包括上报的东西里面也没有!)&#xa;你可以在 设置 → 其他 → 启动器 中关闭上报,不过龙猫就不知道你遇到了什么 Bug 了……" TextWrapping="Wrap" />
<TextBlock Text="隐私声明与个人信息保护政策" TextWrapping="Wrap" Margin="0,10,0,4" FontWeight="Bold" />
<TextBlock Margin="0,0,0,2" LineHeight="17" Text="PCL 没有收集个人信息,所以这里其实啥都不用写……&#xa;留个这个其实只是为了让你知道 PCL 没有收集个人信息,诶嘿。" TextWrapping="Wrap" />
<TextBlock Text="其他信息" TextWrapping="Wrap" Margin="0,10,0,4" FontWeight="Bold" />
<TextBlock Margin="0,0,0,2" LineHeight="17" Text="Copyright © 龙腾猫跃 2016. All Rights Reserved.&#13;计算机软件著作权登记号:2020SR0875133&#13;违法违规行为举报投诉邮箱:hexdragon@vip.qq.com&#13;非 MINECRAFT 官方产品。未经 MOJANG 或 MICROSOFT 批准,也不与 MOJANG 或 MICROSOFT 关联。" TextWrapping="Wrap" />
<StackPanel Orientation="Horizontal" Height="35" HorizontalAlignment="Left" Margin="0,12,0,0">
<local:MyButton Text="用户协议与免责声明" Width="170" Padding="13,0" Margin="0,0,20,0" ColorType="Highlight" EventType="打开网页" EventData="https://shimo.im/docs/rGrd8pY8xWkt6ryW" />
@@ -18,12 +18,6 @@
End Sub
Private Sub BtnAboutBmclapi_Click(sender As Object, e As EventArgs) Handles BtnAboutBmclapi.Click
OpenWebsite("https://afdian.com/a/bangbang93")
End Sub
Private Sub BtnAboutWiki_Click(sender As Object, e As EventArgs) Handles BtnAboutWiki.Click
OpenWebsite("https://www.mcmod.cn")
End Sub
Public Shared Sub CopyUniqueAddress() Handles BtnDonateCopy.Click
ClipboardSet(UniqueAddress)
End Sub
@@ -41,6 +41,7 @@
{"SystemSystemCache", New SetupEntry("", Source:=SetupSource.Registry)},
{"SystemSystemUpdate", New SetupEntry(0)},
{"SystemSystemActivity", New SetupEntry(0)},
{"SystemSystemTelemetry", New SetupEntry(True, Source:=SetupSource.Registry)},
{"CacheExportConfig", New SetupEntry("", Source:=SetupSource.Registry)},
{"CacheSavedPageUrl", New SetupEntry("", Source:=SetupSource.Registry)},
{"CacheSavedPageVersion", New SetupEntry("", Source:=SetupSource.Registry)},
@@ -123,7 +124,7 @@
{"ToolDownloadTranslateV2", New SetupEntry(1, Source:=SetupSource.Registry)},
{"ToolDownloadIgnoreQuilt", New SetupEntry(True, Source:=SetupSource.Registry)},
{"ToolDownloadCert", New SetupEntry(False, Source:=SetupSource.Registry)},
{"ToolDownloadMod", New SetupEntry(1, Source:=SetupSource.Registry)},
{"ToolDownloadMod", New SetupEntry(2, Source:=SetupSource.Registry)},
{"ToolModLocalNameStyle", New SetupEntry(0, Source:=SetupSource.Registry)},
{"ToolUpdateAlpha", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
{"ToolUpdateRelease", New SetupEntry(False, Source:=SetupSource.Registry)},
@@ -356,13 +357,6 @@
Return Not HasIniKey(Version.Path & "PCL\Setup.ini", Key)
End Select
End Function
''' <summary>
''' 某个设置项是否加密。
''' </summary>
Public Function IsEncoded(Key As String) As Boolean
If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key) With {.Source = Key}
Return SetupDict(Key).Encoded
End Function
''' <summary>
''' 读取设置。
@@ -242,7 +242,7 @@
</StackPanel>
<local:MyTextBox x:Name="TextAdvanceJvm" Grid.ColumnSpan="2" Tag="LaunchAdvanceJvm" Grid.Column="1" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,除非有确定把握,否则请不要修改。&#xa;支持 Minecraft 版本 JSON 中的字符串替换标记,例如 ${library_directory}。" MaxLength="4000"
Height="100" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" Padding="0,5" VerticalScrollBarVisibility="Auto" />
<TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="游戏参数尾部" Margin="0,0,25,0" />
<TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="游戏参数" Margin="0,0,25,0" />
<local:MyTextBox x:Name="TextAdvanceGame" Grid.Row="2" Grid.ColumnSpan="2" Tag="LaunchAdvanceGame" Grid.Column="1" ToolTip="文本框中的内容将会被直接拼合在启动参数的末尾。&#xa;例如,输入 --demo 则会以试玩模式启动游戏。&#xa;支持 Minecraft 版本 JSON 中的字符串替换标记,例如 ${library_directory}。" />
<TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="启动前执行命令" Margin="0,0,25,0" />
<local:MyTextBox x:Name="TextAdvanceRun" Grid.Row="4" Grid.ColumnSpan="2" Tag="LaunchAdvanceRun" Grid.Column="1" HintText=""
@@ -62,16 +62,18 @@
<RowDefinition Height="7" />
<RowDefinition Height="28" />
<RowDefinition Height="7" />
<RowDefinition Height="28" />
<RowDefinition Height="7" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!--<TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="下载源" Margin="0,0,25,0" />
<TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="来源" Margin="0,0,25,0" />
<local:MyComboBox x:Name="ComboDownloadMod" Grid.Row="0" Grid.ColumnSpan="2" Tag="ToolDownloadMod" Grid.Column="1">
<local:MyComboBoxItem Content="尽量使用镜像源(暂时无效)" />
<local:MyComboBoxItem Content="尽量使用镜像源(可能缺少刚刚更新的版本)" />
<local:MyComboBoxItem Content="仅在官方源加载缓慢时改用镜像源" />
<local:MyComboBoxItem Content="尽量使用官方源" IsSelected="True" />
</local:MyComboBox>-->
<TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="文件名格式" Margin="0,0,25,0" />
<local:MyComboBox Grid.Row="0" x:Name="ComboDownloadTranslateV2" Grid.ColumnSpan="2" Tag="ToolDownloadTranslateV2" Grid.Column="1"
</local:MyComboBox>
<TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="文件名格式" Margin="0,0,25,0" />
<local:MyComboBox Grid.Row="2" x:Name="ComboDownloadTranslateV2" Grid.ColumnSpan="2" Tag="ToolDownloadTranslateV2" Grid.Column="1"
ToolTip="下载社区资源时,其默认文件名的格式">
<local:MyComboBoxItem Content="【机械动力】create-1.21.1-6.0.4" />
<local:MyComboBoxItem Content="[机械动力] create-1.21.1-6.0.4" IsSelected="True" />
@@ -79,13 +81,13 @@
<local:MyComboBoxItem Content="create-1.21.1-6.0.4-机械动力" />
<local:MyComboBoxItem Content="create-1.21.1-6.0.4" />
</local:MyComboBox>
<TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="Mod 管理样式" Margin="0,0,25,0" />
<local:MyComboBox Grid.Row="2" x:Name="ComboModLocalNameStyle" Grid.ColumnSpan="2" Tag="ToolModLocalNameStyle" Grid.Column="1"
<TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="Mod 管理样式" Margin="0,0,25,0" />
<local:MyComboBox Grid.Row="4" x:Name="ComboModLocalNameStyle" Grid.ColumnSpan="2" Tag="ToolModLocalNameStyle" Grid.Column="1"
ToolTip="在 Mod 管理页面中,Mod 项的显示方式">
<local:MyComboBoxItem Content="标题显示译名,详情显示文件名" IsSelected="True" />
<local:MyComboBoxItem Content="标题显示文件名,详情显示译名" />
</local:MyComboBox>
<local:MyCheckBox Margin="0,2,0,4" Text="在显示 Mod 加载器时忽略 Quilt" Grid.Row="4" Height="22" Grid.ColumnSpan="2"
<local:MyCheckBox Margin="0,2,0,4" Text="在显示 Mod 加载器时忽略 Quilt" Grid.Row="6" Height="22" Grid.ColumnSpan="2"
x:Name="CheckDownloadIgnoreQuilt" Tag="ToolDownloadIgnoreQuilt" />
</Grid>
</StackPanel>
@@ -109,7 +111,7 @@
<local:MyCheckBox Text="自动设置为中文" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="5" x:Name="CheckHelpChinese" Tag="ToolHelpChinese" />
</Grid>
</local:MyCard>
<local:MyCard Margin="0,0,0,15" Title="系统">
<local:MyCard Margin="0,0,0,15" Title="启动器">
<Grid Margin="25,40,25,20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Name" />
@@ -124,6 +126,7 @@
<RowDefinition Height="5" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text="启动器更新" Margin="0,0,25,0" />
<local:MyComboBox x:Name="ComboSystemUpdate" Tag="SystemSystemUpdate" Grid.Column="1">
@@ -145,7 +148,10 @@
<local:ValidateFolderPath UseMinecraftCharCheck="False" />
</local:MyTextBox.ValidateRules>
</local:MyTextBox>
<Grid Height="35" Grid.Row="6" Grid.ColumnSpan="5" Margin="0,12,0,0">
<local:MyCheckBox Margin="0,5,0,4" Text="匿名数据收集" Grid.Row="6" Height="22" Grid.ColumnSpan="2"
x:Name="CheckSystemTelemetry" Tag="SystemSystemTelemetry"
ToolTip="当下载失败、PCL 出错、游戏崩溃等事件时,PCL 会匿名上报情况,以通知龙猫 “哦吼,出错了”,让龙猫能更好地修 Bug……&#xa;你可以关闭上报,不过龙猫就不知道你遇到了什么 Bug 了……&#13;PCL 不会上传或收集任何个人信息,包括上报的东西里面也没有!" />
<Grid Height="35" Grid.Row="7" Grid.ColumnSpan="5" Margin="0,12,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
@@ -155,7 +161,7 @@
<local:MyButton Grid.Column="1" x:Name="BtnSystemSettingExp" MinWidth="140" Text="导出设置" Padding="13,0" Margin="0,0,20,0" />
<local:MyButton Grid.Column="2" x:Name="BtnSystemSettingImp" MinWidth="140" Text="导入设置" Padding="13,0" Margin="0,0,20,0" />
</Grid>
<Grid Height="35" Grid.Row="7" Grid.ColumnSpan="5" Margin="0,12,0,0" x:Name="PanDonate">
<Grid Height="35" Grid.Row="8" Grid.ColumnSpan="5" Margin="0,12,0,0" x:Name="PanDonate">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
@@ -35,7 +35,7 @@
'Mod 与整合包
ComboDownloadTranslateV2.SelectedIndex = Setup.Get("ToolDownloadTranslateV2")
'ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod")
ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod")
ComboModLocalNameStyle.SelectedIndex = Setup.Get("ToolModLocalNameStyle")
CheckDownloadIgnoreQuilt.Checked = Setup.Get("ToolDownloadIgnoreQuilt")
@@ -50,6 +50,7 @@
ComboSystemUpdate.SelectedIndex = Setup.Get("SystemSystemUpdate")
ComboSystemActivity.SelectedIndex = Setup.Get("SystemSystemActivity")
TextSystemCache.Text = Setup.Get("SystemSystemCache")
CheckSystemTelemetry.Checked = Setup.Get("SystemSystemTelemetry")
'调试选项
CheckDebugMode.Checked = Setup.Get("SystemDebugMode")
@@ -81,6 +82,7 @@
Setup.Reset("SystemSystemCache")
Setup.Reset("SystemSystemUpdate")
Setup.Reset("SystemSystemActivity")
Setup.Reset("SystemSystemTelemetry")
Log("[Setup] 已初始化启动器页设置")
Hint("已初始化启动器页设置!", HintType.Finish, False)
@@ -92,13 +94,13 @@
End Sub
'将控件改变路由到设置改变
Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckDebugMode.Change, CheckDebugDelay.Change, CheckDebugSkipCopy.Change, CheckUpdateRelease.Change, CheckUpdateSnapshot.Change, CheckHelpChinese.Change, CheckDownloadIgnoreQuilt.Change, CheckDownloadCert.Change
Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckDebugMode.Change, CheckDebugDelay.Change, CheckDebugSkipCopy.Change, CheckUpdateRelease.Change, CheckUpdateSnapshot.Change, CheckHelpChinese.Change, CheckDownloadIgnoreQuilt.Change, CheckDownloadCert.Change, CheckSystemTelemetry.Change
If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked)
End Sub
Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderDebugAnim.Change, SliderDownloadThread.Change, SliderDownloadSpeed.Change
If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value)
End Sub
Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboDownloadVersion.SelectionChanged, ComboModLocalNameStyle.SelectionChanged, ComboDownloadTranslateV2.SelectionChanged, ComboSystemUpdate.SelectionChanged, ComboSystemActivity.SelectionChanged, ComboDownloadSource.SelectionChanged
Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboDownloadVersion.SelectionChanged, ComboModLocalNameStyle.SelectionChanged, ComboDownloadTranslateV2.SelectionChanged, ComboSystemUpdate.SelectionChanged, ComboSystemActivity.SelectionChanged, ComboDownloadSource.SelectionChanged, ComboDownloadMod.SelectionChanged
If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex)
End Sub
Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextSystemCache.ValidatedTextChanged
@@ -211,7 +211,7 @@
<TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="Java 虚拟机参数" Margin="0,0,25,0" />
<local:MyTextBox x:Name="TextAdvanceJvm" Grid.Row="0" Grid.ColumnSpan="2" Tag="VersionAdvanceJvm" Grid.Column="1" MaxLength="4000" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,在没有确定把握的情况下请不要尝试修改。&#xa;支持 Minecraft 版本 JSON 中的字符串替换标记,例如 ${library_directory}。&#xa;&#xa;若留空,则跟随全局设置的值。" HintText="跟随全局设置"
Height="100" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" Padding="0,5" VerticalScrollBarVisibility="Auto" />
<TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="游戏参数尾部" Margin="0,0,25,0" />
<TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="游戏参数" Margin="0,0,25,0" />
<local:MyTextBox x:Name="TextAdvanceGame" Grid.Row="2" Grid.ColumnSpan="2" Tag="VersionAdvanceGame" Grid.Column="1" ToolTip="文本框中的内容将会被直接拼合在启动参数的末尾。&#xa;例如,输入 --demo 则会以试玩模式启动游戏。&#xa;支持 Minecraft 版本 JSON 中的字符串替换标记,例如 ${library_directory}。&#xa;&#xa;若留空,则跟随全局设置的值。" HintText="跟随全局设置" />
<TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="启动前执行命令" Margin="0,0,25,3" />
<local:MyTextBox x:Name="TextAdvanceRun" Grid.Row="4" Grid.ColumnSpan="2" Tag="VersionAdvanceRun" Grid.Column="1" HintText="" Margin="0,0,0,3"
@@ -355,6 +355,15 @@ PreFin:
#Region "服务器"
'自动替换标点
Private Sub TextServerEnter_Change() Handles TextServerEnter.TextChanged
Dim NewText = TextServerEnter.Text.Replace(":", ":").Replace("。", ".")
If NewText = TextServerEnter.Text Then Return
Dim CurrentPosition = TextServerEnter.SelectionStart '重设焦点
TextServerEnter.Text = NewText
TextServerEnter.SelectionStart = CurrentPosition
End Sub
'全局
Private ComboServerLoginLast As Integer
Private Sub ComboServerLogin_Changed() Handles ComboServerLogin.SelectionChanged, TextServerNide.ValidatedTextChanged, TextServerAuthServer.ValidatedTextChanged, TextServerAuthRegister.ValidatedTextChanged
@@ -399,9 +408,6 @@ PreFin:
TextServerAuthName.Text = "LittleSkin 登录"
End Sub
Private Shared Sub TextServerEnter_Change(sender As MyTextBox, e As Object) Handles TextServerEnter.LostFocus
sender.Text = sender.Text.Replace(":", ":")
End Sub
#End Region
#Region "Java 选择"
@@ -138,6 +138,10 @@
Text="· 下载版本:切换到 EventData 对应的 Minecraft 下载页面"/>
<local:MyButton Margin="0,5,0,6" Width="250" Height="35"
Text="下载 Minecraft 1.12.2" EventType="下载版本" EventData="1.12.2"/>
<TextBlock Margin="0,4,0,4"
Text="· 修改设置:将 PCL 的特定设置修改为特定值"/>
<local:MyButton Margin="0,5,0,6" Width="250" Height="35"
Text="将窗口改为半透明" EventType="修改设置" EventData="UiLauncherTransparent|400"/>
</StackPanel>
</local:MyCard>
Binary file not shown.