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" <Application x:Class="Application"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:behaviors="clr-namespace:PCL.Controls.Behaviors"
xmlns:local="clr-namespace:PCL" xmlns:local="clr-namespace:PCL"
xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:behaviors="clr-namespace:PCL.Controls.Behaviors"
StartupUri="FormMain.xaml" StartupUri="FormMain.xaml"
ShutdownMode="OnExplicitShutdown"> ShutdownMode="OnExplicitShutdown">
<Application.Resources> <Application.Resources>
@@ -345,6 +345,7 @@
</ControlTemplate> </ControlTemplate>
</Setter.Value> </Setter.Value>
</Setter> </Setter>
<Setter Property="behaviors:ClipboardInterceptor.EnableSafeClipboard" Value="True" />
</Style> </Style>
<!-- ComboBox --> <!-- ComboBox -->
@@ -140,6 +140,7 @@ WaitRetry:
ServicePointManager.Expect100Continue = True ServicePointManager.Expect100Continue = True
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12
ServicePointManager.DefaultConnectionLimit = 1024 ServicePointManager.DefaultConnectionLimit = 1024
ServicePointManager.UseNagleAlgorithm = False
'计时 '计时
Log("[Start] 第一阶段加载用时:" & GetTimeTick() - ApplicationStartTick & " ms") Log("[Start] 第一阶段加载用时:" & GetTimeTick() - ApplicationStartTick & " ms")
ApplicationStartTick = GetTimeTick() ApplicationStartTick = GetTimeTick()
+1 -2
View File
@@ -320,11 +320,10 @@
End Set End Set
End Property End Property
Private _IsSwapped As Boolean = False Private _IsSwapped As Boolean = False
''' <summary> ''' <summary>
''' 是否已被折叠。(已过时,请使用 IsSwapped) ''' 是否已被折叠。(已过时,请使用 IsSwapped)
''' </summary> ''' </summary>
<Obsolete("请使用 IsSwapped 属性,IsSwaped 存在拼写错误")> <Obsolete("IsSwaped 存在拼写错误,请换用 IsSwapped 属性。")>
Public Property IsSwaped As Boolean Public Property IsSwaped As Boolean
Get Get
Return IsSwapped Return IsSwapped
+22 -6
View File
@@ -11,6 +11,19 @@ Public Class FormMain
Dim FeatureList As New List(Of KeyValuePair(Of Integer, String)) Dim FeatureList As New List(Of KeyValuePair(Of Integer, String))
'统计更新日志条目 '统计更新日志条目
#If BETA Then #If BETA Then
If LastVersion < 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 If LastVersion < 361 Then 'Release 2.10.3
FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法安装部分使用老版本 PCL 导出的整合包")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复:无法安装部分使用老版本 PCL 导出的整合包"))
End If End If
@@ -83,6 +96,12 @@ Public Class FormMain
'3:BUG+ IMP* FEAT- '3:BUG+ IMP* FEAT-
'2:BUG* IMP- '2:BUG* IMP-
'1:BUG- '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 < 364 Then 'Snapshot 2.10.5
If LastVersion >= 363 Then If LastVersion >= 363 Then
FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法添加新的正版账号")) FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复:无法添加新的正版账号"))
@@ -268,11 +287,6 @@ Public Class FormMain
AddHandler Closing, Sub() Helper.RemoveDragHook() AddHandler Closing, Sub() Helper.RemoveDragHook()
AddHandler Helper.DragDrop, Sub() FileDrag(Helper.DropFilePaths) AddHandler Helper.DragDrop, Sub() FileDrag(Helper.DropFilePaths)
End If 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(FrmLaunchLeft.Parent) Then FrmLaunchLeft.SetValue(ContentPresenter.ContentProperty, Nothing)
If Not IsNothing(FrmLaunchRight.Parent) Then FrmLaunchRight.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 Catch ex As Exception
Log(ex, "清理自动更新文件失败") Log(ex, "清理自动更新文件失败")
End Try End Try
'上报
Telemetry("启动")
End Sub, "初始化", ThreadPriority.Lowest) End Sub, "初始化", ThreadPriority.Lowest)
Log("[Start] 第三阶段加载用时:" & GetTimeTick() - ApplicationStartTick & " ms") Log("[Start] 第三阶段加载用时:" & GetTimeTick() - ApplicationStartTick & " ms")
@@ -874,7 +890,7 @@ Public Class FormMain
'错误报告分析 '错误报告分析
Try Try
Log("[System] 尝试进行错误报告分析") Log("[System] 尝试进行错误报告分析")
Dim Analyzer As New CrashAnalyzer(GetUuid()) Dim Analyzer As New CrashAnalyzer
Analyzer.Import(FilePath) Analyzer.Import(FilePath)
If Not Analyzer.Prepare() Then Exit Try If Not Analyzer.Prepare() Then Exit Try
Analyzer.Analyze() Analyzer.Analyze()
+68 -65
View File
@@ -1,6 +1,6 @@
Imports System.Globalization Imports System.Globalization
Imports System.IO.Compression Imports System.IO.Compression
Imports System.Reflection Imports System.Net.Sockets
Imports System.Runtime.CompilerServices Imports System.Runtime.CompilerServices
Imports System.Security.Cryptography Imports System.Security.Cryptography
Imports System.Security.Principal Imports System.Security.Principal
@@ -13,13 +13,13 @@ Public Module ModBase
#Region "声明" #Region "声明"
'下列版本信息由更新器自动修改 '下列版本信息由更新器自动修改
Public Const VersionBaseName As String = "2.10.5" '不含分支前缀的显示用版本名 Public Const VersionBaseName As String = "2.10.6" '不含分支前缀的显示用版本名
Public Const VersionStandardCode As String = "2.10.5." & VersionBranchCode '标准格式的四段式版本号 Public Const VersionStandardCode As String = "2.10.6." & VersionBranchCode '标准格式的四段式版本号
Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换 Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换
#If BETA Then #If BETA Then
Public Const VersionCode As Integer = 361 'Release Public Const VersionCode As Integer = 367 'Release
#Else #Else
Public Const VersionCode As Integer = 364 'Snapshot Public Const VersionCode As Integer = 366 'Snapshot
#End If #End If
'自动生成的版本信息 '自动生成的版本信息
Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
@@ -791,8 +791,8 @@ Public Module ModBase
Public Sub CopyFile(FromPath As String, ToPath As String) Public Sub CopyFile(FromPath As String, ToPath As String)
Try Try
'还原文件路径 '还原文件路径
If Not FromPath.Contains(":\") Then FromPath = Path & FromPath FromPath = ShortenPath(If(FromPath.Contains(":\"), FromPath, Path & FromPath))
If Not ToPath.Contains(":\") Then ToPath = Path & ToPath ToPath = ShortenPath(If(ToPath.Contains(":\"), ToPath, Path & ToPath))
'如果复制同一个文件则跳过 '如果复制同一个文件则跳过
If FromPath = ToPath Then Return If FromPath = ToPath Then Return
'确保目录存在 '确保目录存在
@@ -861,7 +861,7 @@ Public Module ModBase
''' <param name="Append">是否将文件内容追加到当前文件,而不是覆盖它。</param> ''' <param name="Append">是否将文件内容追加到当前文件,而不是覆盖它。</param>
Public Sub WriteFile(FilePath As String, Text As String, Optional Append As Boolean = False, Optional Encoding As Encoding = Nothing) 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)) Directory.CreateDirectory(GetPathFromFullPath(FilePath))
'写入文件 '写入文件
@@ -886,7 +886,7 @@ Public Module ModBase
''' <param name="Append">是否将文件内容追加到当前文件,而不是覆盖它。</param> ''' <param name="Append">是否将文件内容追加到当前文件,而不是覆盖它。</param>
Public Sub WriteFile(FilePath As String, Content As Byte(), Optional Append As Boolean = False) 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)) Directory.CreateDirectory(GetPathFromFullPath(FilePath))
'写入文件 '写入文件
@@ -1294,11 +1294,11 @@ Re:
''' </summary> ''' </summary>
Public Sub ExtractFile(CompressFilePath As String, DestDirectory As String, Optional Encode As Encoding = Nothing, Public Sub ExtractFile(CompressFilePath As String, DestDirectory As String, Optional Encode As Encoding = Nothing,
Optional ProgressIncrementHandler As Action(Of Double) = Nothing) Optional ProgressIncrementHandler As Action(Of Double) = Nothing)
Directory.CreateDirectory(DestDirectory) Directory.CreateDirectory(ShortenPath(DestDirectory))
If CompressFilePath.EndsWithF(".gz", True) Then If CompressFilePath.EndsWithF(".gz", True) Then
'以 gz 方式解压 '以 gz 方式解压
Dim stream As New GZipStream(New FileStream(CompressFilePath, FileMode.Open, FileAccess.ReadWrite), CompressionMode.Decompress) 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() Dim data As Integer = stream.ReadByte()
While data <> -1 While data <> -1
decompressedFile.WriteByte(data) decompressedFile.WriteByte(data)
@@ -1309,10 +1309,10 @@ Re:
Else Else
'以 zip 方式解压 '以 zip 方式解压
Using Archive = ZipFile.Open(CompressFilePath, ZipArchiveMode.Read, If(Encode, Encoding.GetEncoding("GB18030"))) 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 For Each Entry As ZipArchiveEntry In Archive.Entries
If ProgressIncrementHandler IsNot Nothing Then ProgressIncrementHandler(1 / TotalCount) If ProgressIncrementHandler IsNot Nothing AndAlso TotalCount > 0 Then ProgressIncrementHandler(1 / TotalCount)
Dim DestinationPath As String = IO.Path.Combine(DestDirectory, Entry.FullName) Dim DestinationPath As String = ShortenPath(IO.Path.Combine(DestDirectory, Entry.FullName))
If DestinationPath.EndsWithF("\") OrElse DestinationPath.EndsWithF("/") Then If DestinationPath.EndsWithF("\") OrElse DestinationPath.EndsWithF("/") Then
Continue For '不创建空文件夹 Continue For '不创建空文件夹
Else Else
@@ -1387,10 +1387,10 @@ RetryDir:
ToPath = ToPath.Replace("/", "\") ToPath = ToPath.Replace("/", "\")
If Not ToPath.EndsWithF("\") Then ToPath &= "\" If Not ToPath.EndsWithF("\") Then ToPath &= "\"
Dim AllFiles = EnumerateFiles(FromPath).ToList Dim AllFiles = EnumerateFiles(FromPath).ToList
Dim FileCount As Integer = AllFiles.Count Dim FileCount As Long = AllFiles.Count
For Each File In AllFiles For Each File In AllFiles
CopyFile(File.FullName, File.FullName.Replace(FromPath, ToPath)) 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 Next
End Sub End Sub
''' <summary> ''' <summary>
@@ -1449,22 +1449,8 @@ RetryDir:
IsInner = True IsInner = True
Loop 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 If CommonReason Is Nothing Then
Return DescList.Join(vbCrLf) Return DescList.Join(vbCrLf)
Else Else
@@ -1492,22 +1478,8 @@ RetryDir:
DescList = DescList.Distinct.ToList DescList = DescList.Distinct.ToList
Dim Desc As String = Join(DescList, vbCrLf & "→ ") 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 If CommonReason IsNot Nothing Then
Return CommonReason & "详细错误:" & DescList.First Return CommonReason & "详细错误:" & DescList.First
Else Else
@@ -1515,6 +1487,24 @@ RetryDir:
Return Join(DescList, " ← ") Return Join(DescList, " ← ")
End If End If
End Function 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> ''' <summary>
''' 返回一个枚举对应的字符串。 ''' 返回一个枚举对应的字符串。
@@ -1556,7 +1546,7 @@ RetryDir:
Return JsonConvert.DeserializeObject(Data, New JsonSerializerSettings With {.DateTimeZoneHandling = DateTimeZoneHandling.Local}) Return JsonConvert.DeserializeObject(Data, New JsonSerializerSettings With {.DateTimeZoneHandling = DateTimeZoneHandling.Local})
Catch ex As Exception Catch ex As Exception
Dim Length As Integer = If(Data, "").Length 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 Try
End Function End Function
@@ -2641,10 +2631,6 @@ Retry:
''' 相对增减控件的左边距。 ''' 相对增减控件的左边距。
''' </summary> ''' </summary>
Public Sub DeltaLeft(control As FrameworkElement, newValue As Double) 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 If TypeOf control Is Window Then
'窗口改变 '窗口改变
CType(control, Window).Left += newValue CType(control, Window).Left += newValue
@@ -2656,8 +2642,6 @@ Retry:
Case HorizontalAlignment.Right 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, 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) '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 Select
End If End If
End Sub End Sub
@@ -2665,17 +2649,12 @@ Retry:
''' 设置控件的左边距。(仅针对置左控件) ''' 设置控件的左边距。(仅针对置左控件)
''' </summary> ''' </summary>
Public Sub SetLeft(control As FrameworkElement, newValue As Double) 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) control.Margin = New Thickness(newValue, control.Margin.Top, control.Margin.Right, control.Margin.Bottom)
End Sub End Sub
''' <summary> ''' <summary>
''' 相对增减控件的上边距。 ''' 相对增减控件的上边距。
''' </summary> ''' </summary>
Public Sub DeltaTop(control As FrameworkElement, newValue As Double) 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 If TypeOf control Is Window Then
'窗口改变 '窗口改变
CType(control, Window).Top += newValue CType(control, Window).Top += newValue
@@ -2687,11 +2666,8 @@ Retry:
Case VerticalAlignment.Bottom 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, 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) '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 Select
End If End If
'If Double.IsNaN(newValue) OrElse Double.IsInfinity(newValue) Then Return '安全性检查 'If Double.IsNaN(newValue) OrElse Double.IsInfinity(newValue) Then Return '安全性检查
'Select Case control.VerticalAlignment 'Select Case control.VerticalAlignment
' Case VerticalAlignment.Top, VerticalAlignment.Stretch, VerticalAlignment.Center ' Case VerticalAlignment.Top, VerticalAlignment.Stretch, VerticalAlignment.Center
@@ -2705,7 +2681,6 @@ Retry:
''' 设置控件的顶边距。(仅针对置上控件) ''' 设置控件的顶边距。(仅针对置上控件)
''' </summary> ''' </summary>
Public Sub SetTop(control As FrameworkElement, newValue As Double) 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) control.Margin = New Thickness(control.Margin.Left, newValue, control.Margin.Right, control.Margin.Bottom)
End Sub End Sub
@@ -2989,6 +2964,13 @@ Retry:
End If End If
End Select End Select
'上报
If Level >= LogLevel.Hint Then
Telemetry("PCL 错误",
"Level", GetStringFromEnum(Level),
"Title", FilterUserName(FilterAccessToken(Title, "*"), "*"),
"Exception", FilterUserName(FilterAccessToken(Text, "*"), "*"))
End If
End Sub End Sub
''' <summary> ''' <summary>
''' 输出错误信息。 ''' 输出错误信息。
@@ -3055,6 +3037,13 @@ Retry:
End If End If
End Select End Select
'上报
If Level >= LogLevel.Hint Then
Telemetry("PCL 异常",
"Level", GetStringFromEnum(Level),
"Title", FilterUserName(FilterAccessToken(Title, "*"), "*"),
"Exception", FilterUserName(FilterAccessToken(ExFull, "*"), "*"))
End If
End Sub End Sub
'反馈 '反馈
@@ -3091,9 +3080,23 @@ Retry:
"文件位置:" & Path) "文件位置:" & Path)
End Sub End Sub
'断言 '遥测
Public Sub DebugAssert(Exp As Boolean) Public Sub Telemetry([Event] As String, ParamArray Datas As String())
If Not Exp Then Throw New Exception("断言命中") 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 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)) Return If(Encoding, Encoding.UTF8).GetString(SendRequest(Url, Method, Content, HeaderDictionary, Timeout:=Timeout, Encoding:=Encoding, UseBrowserUserAgent:=UseBrowserUserAgent))
Catch ex As ThreadInterruptedException Catch ex As ThreadInterruptedException
Throw Throw
Catch ex As ResponsedWebException
If MakeLog Then Log(ex, "网络请求失败,返回内容为:" & vbCrLf & ex.Response, LogLevel.Developer)
Throw
Catch ex As Exception Catch ex As Exception
If MakeLog Then Log(ex, "网络请求失败", LogLevel.Developer) If MakeLog Then Log(ex, "网络请求失败", LogLevel.Developer)
Throw Throw
@@ -244,7 +241,10 @@ RequestFinished:
If Response.IsSuccessStatusCode Then If Response.IsSuccessStatusCode Then
Return ResponseBytes Return ResponseBytes
Else 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 End If
Catch ex As ThreadInterruptedException Catch ex As ThreadInterruptedException
Throw Throw
@@ -807,7 +807,7 @@ StartSingleThreadDownload:
'是否禁用多线程,以及规定碎片大小 '是否禁用多线程,以及规定碎片大小
Dim TargetUrl As String = GetSource().Url Dim TargetUrl As String = GetSource().Url
If TargetUrl.Contains("pcl2-server") OrElse TargetUrl.Contains("bmclapi") OrElse TargetUrl.Contains("github.com") OrElse 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: 下载引擎重做,计算下载源平均链接时间和线程下载速度,按最高时间节省来开启多线程 'FUTURE: 下载引擎重做,计算下载源平均链接时间和线程下载速度,按最高时间节省来开启多线程
Dim FilePieceMax As NetThread = Threads Dim FilePieceMax As NetThread = Threads
@@ -990,7 +990,8 @@ NotSupportRange:
Th.DownloadDone += RealDataCount Th.DownloadDone += RealDataCount
ResultStream.Write(ResponseBytes, 0, 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。") Throw New TimeoutException("由于速度过慢断开链接,下载 " & RealDataCount & " B,消耗 " & DeltaTime & " ms。")
End If End If
Th.LastReceiveTime = GetTimeTick() Th.LastReceiveTime = GetTimeTick()
@@ -1027,7 +1028,8 @@ SourceBreak:
End SyncLock End SyncLock
'合并 '合并
If Not IsNoSplit Then ResultStream?.Dispose() 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 Try
End Sub End Sub
Private Sub SourceFail(Th As NetThread, ex As Exception, IsMergeFailure As Boolean) 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 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 Retried = True
SyncLock LockSource SyncLock LockSource
SourcesOnce.Clear() SourcesOnce.Clear()
@@ -1525,10 +1527,14 @@ Retry:
'获取实际失败的文件 '获取实际失败的文件
For Each File In Files For Each File In Files
If File.State <> NetState.Error Then Continue For 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 & [Error] = New Exception("文件下载失败:" & File.LocalPath & vbCrLf &
"各下载源的错误如下:" & vbCrLf & "各下载源的错误如下:" & vbCrLf & Detail,
Join(File.Sources.Select(Function(s) $"{If(s.Ex?.Message, "无错误信息。")}({s.Url})"), vbCrLf),
[Error]) [Error])
'上报
Telemetry("文件下载失败",
"FileName", File.LocalName,
"Exception", Detail)
Exit For Exit For
Next Next
'在设置 Error 对象后再更改为失败,避免 WaitForExit 无法捕获错误 '在设置 Error 对象后再更改为失败,避免 WaitForExit 无法捕获错误
@@ -2,7 +2,9 @@
'构造函数 '构造函数
Private TempFolder As String 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() TempFolder = RequestTaskTempFolder()
Directory.CreateDirectory(TempFolder & "Temp\") Directory.CreateDirectory(TempFolder & "Temp\")
@@ -508,7 +510,7 @@ Done:
If LogMc.Contains("Couldn't set pixel format") Then AppendReason(CrashReason.显卡驱动不支持导致无法设置像素格式) 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.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.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("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("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.材质过大或显卡配置不足) If LogMc.Contains("Maybe try a lower resolution resourcepack?") Then AppendReason(CrashReason.材质过大或显卡配置不足)
@@ -856,12 +858,13 @@ NextStack:
''' <summary> ''' <summary>
''' 弹出崩溃弹窗,并指导导出崩溃报告。 ''' 弹出崩溃弹窗,并指导导出崩溃报告。
''' </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() FrmMain.ShowWindowToTop()
Select Case MyMsgBox(GetAnalyzeResult(IsHandAnalyze), If(IsHandAnalyze, "错误报告分析结果", "Minecraft 出现错误"), Dim Detail As String = GetAnalyzeResult(IsManualAnalyze)
"确定", If(IsHandAnalyze OrElse DirectFile Is Nothing, "", "查看日志"), If(IsHandAnalyze, "", "导出错误报告"), Select Case MyMsgBox(Detail, If(IsManualAnalyze, "错误报告分析结果", "Minecraft 出现错误"),
Button2Action:=If(IsHandAnalyze OrElse DirectFile Is Nothing, Nothing, "确定", If(IsManualAnalyze OrElse DirectFile Is Nothing, "", "查看日志"), If(IsManualAnalyze, "", "导出错误报告"),
Button2Action:=If(IsManualAnalyze OrElse DirectFile Is Nothing, Nothing,
Sub() Sub()
'弹窗选择:查看日志 '弹窗选择:查看日志
If File.Exists(DirectFile.Value.Key) Then If File.Exists(DirectFile.Value.Key) Then
@@ -918,6 +921,11 @@ NextStack:
End Try End Try
OpenExplorer(FileAddress) OpenExplorer(FileAddress)
End Select End Select
'上报
If IsManualAnalyze Then Return
Telemetry("Minecraft 崩溃",
"Version", If(TargetVersion Is Nothing, "null", TargetVersion.Version.ToString),
"Detail", FilterUserName(Detail, "*"))
End Sub End Sub
''' <summary> ''' <summary>
''' 获取崩溃分析的结果描述。 ''' 获取崩溃分析的结果描述。
@@ -1102,7 +1110,7 @@ NextStack:
If(Not Results.Any(Function(r) r.EndsWithF("\h")) OrElse IsHandAnalyze, "", If(Not Results.Any(Function(r) r.EndsWithF("\h")) OrElse IsHandAnalyze, "",
vbCrLf & "如果要寻求帮助,请把错误报告文件发给对方,而不是发送这个窗口的照片或者截图。" & vbCrLf & "如果要寻求帮助,请把错误报告文件发给对方,而不是发送这个窗口的照片或者截图。" &
If(If(PageSetupSystem.IsLauncherNewest(), True), "", If(If(PageSetupSystem.IsLauncherNewest(), True), "",
vbCrLf & vbCrLf & "此外,你正在使用老版本 PCL,更新 PCL 或许也能解决这个问题。" & vbCrLf & "你可以点击 设置 → 启动器 → 检查更新 来更新 PCL。")) vbCrLf & vbCrLf & "此外,你正在使用老版本 PCL,更新 PCL 或许也能解决这个问题。" & vbCrLf & "你可以点击 [设置 → 其他 → 启动器 → 检查更新] 更新 PCL。"))
End Function End Function
End Class End Class
@@ -594,7 +594,7 @@
VersionName = Version VersionName = Version
Me.Version = New Version(Version) Me.Version = New Version(Version)
Me.Inherit = Inherit Me.Inherit = Inherit
FileVersion = Version & If(Branch Is Nothing, "", "-" & Branch) FileVersion = Version & If(Branch Is Nothing, "", "-" & Branch)
End Sub End Sub
End Class End Class
@@ -1106,26 +1106,27 @@
Public Function DlModRequest(Url As String, Optional Method As HttpMethod = Nothing, Public Function DlModRequest(Url As String, Optional Method As HttpMethod = Nothing,
Optional Content As String = Nothing, Optional ContentType As String = Nothing) As JToken Optional Content As String = Nothing, Optional ContentType As String = Nothing) As JToken
Dim Urls As New List(Of KeyValuePair(Of String, Integer)) 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)
Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) If McimUrl <> Url Then
'Dim McimUrl As String = DlSourceModGet(Url) Select Case Setup.Get("ToolDownloadMod")
'If McimUrl <> Url Then Case 0
' Select Case Setup.Get("ToolDownloadMod") Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
' 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))
' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) Case 1
' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) '至少 10s,要不然有时候远端服务器来不及完成
' Case 1 Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
' 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, 10)) Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) Case Else
' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10))
' Case Else Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) End Select
' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) Else
' End Select Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10))
'End If Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
End If
Dim Exs As String = "" Dim Exs As String = ""
For Each Source In Urls For Each Source In Urls
Try Try
@@ -1232,7 +1233,14 @@
'Mod 下载源 'Mod 下载源
Public Function DlSourceModGet(Original As String) As String 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 End Function
'Loader 自动切换 'Loader 自动切换
@@ -66,7 +66,7 @@ Public Module ModLaunch
''' </summary> ''' </summary>
Public Sub McLaunchLog(Text As String) Public Sub McLaunchLog(Text As String)
Text = FilterUserName(FilterAccessToken(Text, "*"), "*") Text = FilterUserName(FilterAccessToken(Text, "*"), "*")
RunInUi(Sub() FrmLaunchRight.LabLog.Text += vbCrLf & "[" & GetTimeNow() & "] " & Text) RunInUi(Sub() FrmLaunchRight.LabLog.Text += $"{vbCrLf}[{GetTimeNow()}] {Text}")
Log("[Launch] " & Text) Log("[Launch] " & Text)
End Sub End Sub
@@ -101,6 +101,8 @@ Public Module ModLaunch
If Not ex.Message.StartsWithF("$$") Then Hint(ex.Message, HintType.Critical) If Not ex.Message.StartsWithF("$$") Then Hint(ex.Message, HintType.Critical)
Throw Throw
End Try End Try
Dim IsSavingBatch As Boolean = CurrentLaunchOptions?.SaveBatch IsNot Nothing
'正式加载 '正式加载
Try Try
'构造主加载器 '构造主加载器
@@ -145,9 +147,15 @@ Public Module ModLaunch
Select Case LaunchLoader.State Select Case LaunchLoader.State
Case LoadState.Finished Case LoadState.Finished
Hint(McVersionCurrent.Name & " 启动成功!", HintType.Finish) 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 Case LoadState.Aborted
If AbortHint Is Nothing Then If AbortHint Is Nothing Then
Hint(If(CurrentLaunchOptions?.SaveBatch Is Nothing, "已取消启动!", "已取消导出启动脚本!"), HintType.Info) Hint(If(IsSavingBatch, "已取消导出启动脚本!", "已取消启动!"), HintType.Info)
Else Else
Hint(AbortHint, HintType.Finish) Hint(AbortHint, HintType.Finish)
End If End If
@@ -162,7 +170,7 @@ NextInner:
If CurrentEx.Message.StartsWithF("$") Then 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 Throw
ElseIf CurrentEx.InnerException IsNot Nothing Then ElseIf CurrentEx.InnerException IsNot Nothing Then
'检查下一级错误 '检查下一级错误
@@ -172,8 +180,15 @@ NextInner:
'没有特殊处理过的错误信息 '没有特殊处理过的错误信息
McLaunchLog("错误:" & GetExceptionDetail(ex)) McLaunchLog("错误:" & GetExceptionDetail(ex))
Log(ex, Log(ex,
If(CurrentLaunchOptions?.SaveBatch Is Nothing, "Minecraft 启动失败", "导出启动脚本失败"), LogLevel.Msgbox, If(IsSavingBatch, "导出启动脚本失败", "Minecraft 启动失败"), LogLevel.Msgbox,
If(CurrentLaunchOptions?.SaveBatch Is Nothing, "启动失败", "导出启动脚本失败")) 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 Throw
End If End If
End Try End Try
@@ -891,9 +906,9 @@ Retry:
ContentType:="application/x-www-form-urlencoded", ContentType:="application/x-www-form-urlencoded",
Headers:={{"Accept-Language", "en-US,en;q=0.5"}, {"X-Requested-With", "XMLHttpRequest"}}, Headers:={{"Accept-Language", "en-US,en;q=0.5"}, {"X-Requested-With", "XMLHttpRequest"}},
ThreadCount:=2) ThreadCount:=2)
Catch ex As Exception Catch ex As ResponsedWebException
If ex.Message.ContainsF("must sign in again", True) OrElse ex.Message.ContainsF("password expired", True) OrElse If ex.Response.ContainsF("must sign in again", True) OrElse ex.Response.ContainsF("password expired", True) OrElse
(ex.Message.Contains("refresh_token") AndAlso ex.Message.Contains("is not valid")) Then '#269 (ex.Response.Contains("refresh_token") AndAlso ex.Response.Contains("is not valid")) Then '#269
Return {"Relogin", ""} Return {"Relogin", ""}
Else Else
Throw Throw
@@ -942,20 +957,20 @@ Retry:
Try Try
Result = NetRequestByClientMultiple("https://xsts.auth.xboxlive.com/xsts/authorize", HttpMethod.Post, Result = NetRequestByClientMultiple("https://xsts.auth.xboxlive.com/xsts/authorize", HttpMethod.Post,
Content:=Request, ContentType:="application/json") 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 '参考 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) MyMsgBox("该账号似乎已被微软封禁,无法登录。", "登录失败", "我知道了", IsWarn:=True)
Throw New Exception("$$") Throw New Exception("$$")
ElseIf ex.Message.Contains("2148916233") Then ElseIf ex.Response.Contains("2148916233") Then
If MyMsgBox("你尚未注册 Xbox 账户,请在注册后再登录。", "登录提示", "注册", "取消") = 1 Then If MyMsgBox("你尚未注册 Xbox 账户,请在注册后再登录。", "登录提示", "注册", "取消") = 1 Then
OpenWebsite("https://signup.live.com/signup") OpenWebsite("https://signup.live.com/signup")
End If End If
Throw New Exception("$$") Throw New Exception("$$")
ElseIf ex.Message.Contains("2148916235") Then ElseIf ex.Response.Contains("2148916235") Then
MyMsgBox($"你的网络所在的国家或地区无法登录微软账号。{vbCrLf}请使用加速器或 VPN。", "登录失败", "我知道了") MyMsgBox($"你的网络所在的国家或地区无法登录微软账号。{vbCrLf}请使用加速器或 VPN。", "登录失败", "我知道了")
Throw New Exception("$$") Throw New Exception("$$")
ElseIf ex.Message.Contains("2148916238") Then ElseIf ex.Response.Contains("2148916238") Then
If MyMsgBox("该账号年龄不足,你需要先修改出生日期,然后才能登录。" & vbCrLf & If MyMsgBox("该账号年龄不足,你需要先修改出生日期,然后才能登录。" & vbCrLf &
"该账号目前填写的年龄是否在 13 岁以上?", "登录提示", "13 岁以上", "12 岁以下", "我不知道") = 1 Then "该账号目前填写的年龄是否在 13 岁以上?", "登录提示", "13 岁以上", "12 岁以下", "我不知道") = 1 Then
OpenWebsite("https://account.live.com/editprof.aspx") OpenWebsite("https://account.live.com/editprof.aspx")
@@ -1364,13 +1379,13 @@ Retry:
McLaunchLog("新版 Game 参数获取成功") McLaunchLog("新版 Game 参数获取成功")
End If End If
'编码参数(#4700、#5892、#5909) '编码参数(#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 McLaunchJavaSelected.VersionCode > 8 Then
If Not Arguments.Contains("-Dstdout.encoding=") Then Arguments = "-Dstdout.encoding=UTF-8 " & Arguments 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 If Not Arguments.Contains("-Dstderr.encoding=") Then Arguments = "-Dstderr.encoding=UTF-8 " & Arguments
End If End If
If McLaunchJavaSelected.VersionCode >= 18 Then
If Not Arguments.Contains("-Dfile.encoding=") Then Arguments = "-Dfile.encoding=COMPAT " & Arguments
End If
'MJSB 'MJSB
Arguments = Arguments.Replace(" -Dos.name=Windows 10", " -Dos.name=""Windows 10""") 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("${access_token}", McLoginLoader.Output.AccessToken)
GameArguments.Add("${auth_session}", McLoginLoader.Output.AccessToken) GameArguments.Add("${auth_session}", McLoginLoader.Output.AccessToken)
GameArguments.Add("${user_type}", "msa") '#1221 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 Dim GameSize As Size
@@ -989,7 +989,7 @@ ExitDataLoad:
If ToString = "" Then If ToString = "" Then
Return "原版 " & McName Return "原版 " & McName
Else Else
Return McName & ToString & If(ModeDebug, " (" & SortCode & "#)", "") Return McName & ToString
End If End If
End Function End Function
@@ -2415,7 +2415,7 @@ NextEntry:
Public Function FilterUserName(Raw As String, FilterChar As Char) As String Public Function FilterUserName(Raw As String, FilterChar As Char) As String
If Raw.Contains(":\Users\") Then If Raw.Contains(":\Users\") Then
For Each Token In RegexSearch(Raw, "(?<=:\\Users\\)[^\\]+") 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 Next
End If End If
Return Raw Return Raw
@@ -349,14 +349,14 @@
State = MinecraftState.Crashed State = MinecraftState.Crashed
'崩溃分析 '崩溃分析
WatcherLog("Minecraft 已崩溃,将在 2 秒后开始崩溃分析") WatcherLog("Minecraft 已崩溃,将在 2 秒后开始崩溃分析")
Hint("检测到 Minecraft 出现错误,错误分析已开始……") Hint("检测到 Minecraft 出现错误,错误分析已开始……", HintType.Critical)
FeedbackInfo() FeedbackInfo()
RunInNewThread( RunInNewThread(
Sub() Sub()
Try Try
Thread.Sleep(2000) Thread.Sleep(2000)
WatcherLog("崩溃分析开始") WatcherLog("崩溃分析开始")
Dim Analyzer As New CrashAnalyzer(PID) Dim Analyzer As New CrashAnalyzer(Version)
Analyzer.Collect(Version.PathIndie, LatestLog.ToList) Analyzer.Collect(Version.PathIndie, LatestLog.ToList)
Analyzer.Prepare() Analyzer.Prepare()
Analyzer.Analyze(Version) Analyzer.Analyze(Version)
+1 -4
View File
@@ -116,11 +116,8 @@
End Try End Try
Case "修改设置" Case "修改设置"
If Setup.IsEncoded(Data(0)) Then
Throw New Exception($"无法修改受加密保护的设置:{Data(0)}")
End If
Setup.Set(Data(0), Data(1)) Setup.Set(Data(0), Data(1))
Hint("已修改设置!", HintType.Finish) Hint($"已写入设置:{Data(0)} → {Data(1)}", HintType.Finish)
Case Else Case Else
MyMsgBox("未知的事件类型:" & Type & vbCrLf & "请检查事件类型填写是否正确,或者 PCL 是否为最新版本。", "事件执行失败") MyMsgBox("未知的事件类型:" & Type & vbCrLf & "请检查事件类型填写是否正确,或者 PCL 是否为最新版本。", "事件执行失败")
@@ -12,6 +12,8 @@ Friend Module ModSecret
Public OAuthClientId As String = If(Environment.GetEnvironmentVariable("PCL_MS_CLIENT_ID"), "") Public OAuthClientId As String = If(Environment.GetEnvironmentVariable("PCL_MS_CLIENT_ID"), "")
'CurseForge API Key 'CurseForge API Key
Public CurseForgeAPIKey As String = If(Environment.GetEnvironmentVariable("PCL_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() Friend Sub SecretOnApplicationStart()
'提升 UI 线程优先级 '提升 UI 线程优先级
+1 -1
View File
@@ -137,7 +137,7 @@ Public Class DragHelper
Dim fileCount As UInteger = DragQueryFile(wParam, UInteger.MaxValue, Nothing, 0) Dim fileCount As UInteger = DragQueryFile(wParam, UInteger.MaxValue, Nothing, 0)
ReDim dropFilePaths(CInt(fileCount) - 1) 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 sb As New StringBuilder(MAX_PATH)
Dim result As UInteger = DragQueryFile(wParam, i, sb, sb.Capacity) Dim result As UInteger = DragQueryFile(wParam, i, sb, sb.Capacity)
If result > 0 Then dropFilePaths(i) = sb.ToString() If result > 0 Then dropFilePaths(i) = sb.ToString()
@@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices
' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
' 方法是按如下所示使用“*” ' 方法是按如下所示使用“*”
<Assembly: AssemblyVersion("2.10.5.0")> <Assembly: AssemblyVersion("2.10.6.0")>
<Assembly: AssemblyFileVersion("2.10.5.0")> <Assembly: AssemblyFileVersion("2.10.6.0")>
<Assembly: NeutralResourcesLanguage("")> <Assembly: NeutralResourcesLanguage("")>
@@ -243,19 +243,21 @@
If Not IsNothing(PageNew) AndAlso Not IsNothing(PageNew.Parent) Then PageNew.SetValue(ContentPresenter.ContentProperty, Nothing) If Not IsNothing(PageNew) AndAlso Not IsNothing(PageNew.Parent) Then PageNew.SetValue(ContentPresenter.ContentProperty, Nothing)
If Anim Then If Anim Then
'动画 '动画
Dispatcher.Invoke(Sub() Dispatcher.Invoke(
'执行动画 Sub()
AniStart({ '执行动画
AaOpacity(PanLogin, -PanLogin.Opacity, 100,, New AniEaseOutFluent), AniStart({
AaCode(Sub() AaOpacity(PanLogin, -PanLogin.Opacity, 100,, New AniEaseOutFluent),
AniControlEnabled += 1 AaCode(
PanLogin.Children.Clear() Sub()
PanLogin.Children.Add(PageNew) AniControlEnabled += 1
AniControlEnabled -= 1 PanLogin.Children.Clear()
End Sub, 100), PanLogin.Children.Add(PageNew)
AaOpacity(PanLogin, 1, 100, 120, New AniEaseInFluent) AniControlEnabled -= 1
}, "FrmLogin PageChange") End Sub, 100),
End Sub, Threading.DispatcherPriority.Render) AaOpacity(PanLogin, 1, 100, 120, New AniEaseInFluent)
}, "FrmLogin PageChange")
End Sub, Threading.DispatcherPriority.Render)
Else Else
'无动画 '无动画
AniControlEnabled += 1 AniControlEnabled += 1
@@ -93,7 +93,7 @@ Download:
GoTo Download GoTo Download
Case 3 Case 3
Log("[Page] 主页预设:简单主页") 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 GoTo Download
Case 4 Case 4
Log("[Page] 主页预设:每日整合包推荐") Log("[Page] 主页预设:每日整合包推荐")
@@ -129,7 +129,7 @@ Download:
GoTo Download GoTo Download
Case 12 Case 12
Log("[Page] 主页预设:PCL GitHub 仪表盘") 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 GoTo Download
End Select End Select
End Select End Select
@@ -17,7 +17,7 @@
<ColumnDefinition /> <ColumnDefinition />
<ColumnDefinition Width="150" /> <ColumnDefinition Width="150" />
</Grid.ColumnDefinitions> </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" /> <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 Source="/Plain Craft Launcher 2;component/Images/Heads/Logo.png" Grid.Row="1" Margin="3">
<Image.Clip> <Image.Clip>
@@ -29,7 +29,7 @@
<EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" /> <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
</Image.Clip> </Image.Clip>
</Image> </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" /> <local:MyButton Text="查看源代码" Grid.Column="2" Grid.Row="1" Height="35" EventType="打开网页" EventData="https://github.com/Hex-Dragon/PCL2" />
</Grid> </Grid>
</local:MyCard> </local:MyCard>
@@ -51,11 +51,12 @@
<ColumnDefinition Width="150" /> <ColumnDefinition Width="150" />
</Grid.ColumnDefinitions> </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: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: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:MyButton Text="打开百科" Grid.Row="1" Grid.Column="2" Height="35" EventType="打开网页" EventData="https://www.mcmod.cn" />
<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 社区资源镜像源和帮助库图床!" 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="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="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="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" /> <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" /> <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
</Image.Clip> </Image.Clip>
</Image> </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> <Image.Clip>
<EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" /> <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
</Image.Clip> </Image.Clip>
</Image> </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> <Image.Clip>
<EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" /> <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
</Image.Clip> </Image.Clip>
@@ -104,289 +105,245 @@
</local:MyCard> </local:MyCard>
<local:MyCard Margin="0,0,0,15" Title="赞助者"> <local:MyCard Margin="0,0,0,15" Title="赞助者">
<StackPanel Margin="25,40,10,20"> <StackPanel Margin="25,40,10,20">
<TextBlock HorizontalAlignment="Left" Text="以下是 2025 年 6 月的高级赞助者们!感谢各位对 PCL 和伟大的咕咕咕事业的支持!" Margin="0,0,25,5.5" TextTrimming="None" TextWrapping="WrapWithOverflow" /> <TextBlock HorizontalAlignment="Left" Text="以下是 2025 年 7 月的高级赞助者们!感谢各位对 PCL 和伟大的咕咕咕事业的支持!" Margin="0,0,25,5.5" TextTrimming="None" TextWrapping="WrapWithOverflow" />
<WrapPanel Margin="0,0,0,10"> <WrapPanel Margin="0,0,0,10"> <TextBlock Width="120" Margin="0,1.5" Text="ZSF" />
<TextBlock Width="120" Margin="0,1.5" Text="星月" /> <TextBlock Width="120" Margin="0,1.5" Text="TizhleF" />
<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="长歌当天" /> <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="贾明志" />
<TextBlock Width="120" Margin="0,1.5" Text="hy" /> <TextBlock Width="120" Margin="0,1.5" Text="百瑞" />
<TextBlock Width="120" Margin="0,1.5" Text="SaDhhJe" /> <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="绝世" />
<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="W丶北辰" /> <TextBlock Width="120" Margin="0,1.5" Text="万玖" />
<TextBlock Width="120" Margin="0,1.5" Text="才KRE" /> <TextBlock Width="120" Margin="0,1.5" Text="墨忆" />
<TextBlock Width="120" Margin="0,1.5" Text="Yang_mistakeof" /> <TextBlock Width="120" Margin="0,1.5" Text="天刹" />
<TextBlock Width="120" Margin="0,1.5" Text="close eyes" /> <TextBlock Width="120" Margin="0,1.5" Text="Cess" />
<TextBlock Width="120" Margin="0,1.5" Text="顾顾" /> <TextBlock Width="120" Margin="0,1.5" Text="ender_glass" />
<TextBlock Width="120" Margin="0,1.5" Text="LTuuxj" /> <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="白玄.雪狼" />
<TextBlock Width="120" Margin="0,1.5" Text="FICazk" /> <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="绪" />
<TextBlock Width="120" Margin="0,1.5" Text="WDSJ" /> <TextBlock Width="120" Margin="0,1.5" Text="吾皇万岁" />
<TextBlock Width="120" Margin="0,1.5" Text="Tohka" /> <TextBlock Width="120" Margin="0,1.5" Text="Ander·Les" />
<TextBlock Width="120" Margin="0,1.5" Text="lz" /> <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="时光飞逝一下午" />
<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="MC小满" /> <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="玖玖璃" /> <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="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="云念" />
<TextBlock Width="120" Margin="0,1.5" Text="zhang1232" /> <TextBlock Width="120" Margin="0,1.5" Text="钱尹鹏" />
<TextBlock Width="120" Margin="0,1.5" Text="Never" /> <TextBlock Width="120" Margin="0,1.5" Text="TBONC" />
<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="ShuangDaoRen" />
<TextBlock Width="120" Margin="0,1.5" Text="小七" /> <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="天魕" />
<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="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="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="你与空白皆无名" /> <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="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="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="华佗" /> <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="赤冰雨" /> <TextBlock Width="120" Margin="0,1.5" Text="liuxuan" />
<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=":)" /> <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="橘子皮丶" /> <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="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="念城南" /> <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="书童呀" /> <TextBlock Width="120" Margin="0,1.5" Text="Mibo_MkIX" />
<TextBlock Width="120" Margin="0,1.5" Text="sxy192425" /> <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="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="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="良田满穗" /> <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="DHLH" /> <TextBlock Width="120" Margin="0,1.5" Text="沫神鹤" />
<TextBlock Width="120" Margin="0,1.5" Text="Xayj" /> <TextBlock Width="120" Margin="0,1.5" Text="风已消逝" />
<TextBlock Width="120" Margin="0,1.5" Text="绳网用户#37" /> <TextBlock Width="120" Margin="0,1.5" Text="光意留闪" />
<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="芸芷" />
<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="冰川泥" />
<TextBlock Width="120" Margin="0,1.5" Text="Shink_guns" /> <TextBlock Width="120" Margin="0,1.5" Text="XunWei" />
<TextBlock Width="120" Margin="0,1.5" Text="Aqua 极&amp;坏." /> <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="路过某打酱油的" />
<TextBlock Width="120" Margin="0,1.5" Text="Nakiya233" /> <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="结构德古拉" />
<TextBlock Width="120" Margin="0,1.5" Text="septebr" /> <TextBlock Width="120" Margin="0,1.5" Text="myyukee" />
<TextBlock Width="120" Margin="0,1.5" Text="一只马喽" /> <TextBlock Width="240" Margin="0,1.5" Text="云之彼端约定的地方" />
<TextBlock Width="120" Margin="0,1.5" Text="下暴雨BWB" /> <TextBlock Width="120" Margin="0,1.5" Text="苏玖" />
<TextBlock Width="120" Margin="0,1.5" Text="QAQ" /> <TextBlock Width="120" Margin="0,1.5" Text="赤沃净" />
<TextBlock Width="240" Margin="0,1.5" Text="sl土豆社区服主B友" /> <TextBlock Width="120" Margin="0,1.5" Text="YYC" />
<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="......" /> <TextBlock Width="120" Margin="0,1.5" Text="herald112" />
<TextBlock Width="120" Margin="0,1.5" Text="ResTmoW" /> <TextBlock Width="120" Margin="0,1.5" Text="Foxman" />
<TextBlock Width="120" Margin="0,1.5" Text="bochibochibo" /> <TextBlock Width="120" Margin="0,1.5" Text="KoreQAQ" />
<TextBlock Width="120" Margin="0,1.5" Text="铸魂之灵" /> <TextBlock Width="120" Margin="0,1.5" Text="TechOfRevo" />
<TextBlock Width="120" Margin="0,1.5" Text="柏柏柏" /> <TextBlock Width="120" Margin="0,1.5" Text="lqs" />
<TextBlock Width="120" Margin="0,1.5" Text="Mart1s" /> <TextBlock Width="120" Margin="0,1.5" Text="简某" />
<TextBlock Width="120" Margin="0,1.5" Text="KuruM148" /> <TextBlock Width="120" Margin="0,1.5" Text="源起于此" />
<TextBlock Width="120" Margin="0,1.5" Text="KaiTouCrow" /> <TextBlock Width="120" Margin="0,1.5" Text="爱莉希雅" />
<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="240" Margin="0,1.5" Text="全明星小面包批发商DIO" />
<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="U" />
<TextBlock Width="120" Margin="0,1.5" Text="摇椅上的猫" /> <TextBlock Width="120" Margin="0,1.5" Text="Dumlet" />
<TextBlock Width="120" Margin="0,1.5" Text="五个麦卷" /> <TextBlock Width="120" Margin="0,1.5" Text="johnqian" />
<TextBlock Width="120" Margin="0,1.5" Text="Miraclepoi" /> <TextBlock Width="120" Margin="0,1.5" Text="KANG" />
<TextBlock Width="120" Margin="0,1.5" Text="XiaoLI" /> <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="苑煜" />
<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="博麗靈夢" /> <TextBlock Width="120" Margin="0,1.5" Text="UA-Ming" />
<TextBlock Width="120" Margin="0,1.5" Text="莹 of yours" /> <TextBlock Width="120" Margin="0,1.5" Text="可爱小探姬" />
<TextBlock Width="120" Margin="0,1.5" Text="ChinaFZXPVP" /> <TextBlock Width="120" Margin="0,1.5" Text="霜月" />
<TextBlock Width="120" Margin="0,1.5" Text="城之内sama" /> <TextBlock Width="120" Margin="0,1.5" Text="bud" />
<TextBlock Width="120" Margin="0,1.5" Text="ENXI" /> <TextBlock Width="120" Margin="0,1.5" Text="小虐SAIKYO" />
<TextBlock Width="120" Margin="0,1.5" Text="steve_c418" /> <TextBlock Width="120" Margin="0,1.5" Text="zealotand" />
<TextBlock Width="120" Margin="0,1.5" Text="洛长安" /> <TextBlock Width="120" Margin="0,1.5" Text="comico" />
<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="小猫游六喵" /> <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="雪豹起司可颂" /> <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="LOG175" />
<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="scp00813" />
<TextBlock Width="120" Margin="0,1.5" Text="xioyiao" /> <TextBlock Width="120" Margin="0,1.5" Text="宝宝" />
<TextBlock Width="120" Margin="0,1.5" Text="BunnyMiku" /> <TextBlock Width="120" Margin="0,1.5" Text="9527" />
<TextBlock Width="120" Margin="0,1.5" Text="dadagga" /> <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="羽笙喵喵" />
<TextBlock Width="120" Margin="0,1.5" Text="xiaoyu" /> <TextBlock Width="120" Margin="0,1.5" Text="ssvgg(☉ x ☉)" />
<TextBlock Width="120" Margin="0,1.5" Text="王梓杰" /> <TextBlock Width="120" Margin="0,1.5" Text="Happymeals" />
<TextBlock Width="120" Margin="0,1.5" Text="wjbjjd" /> <TextBlock Width="120" Margin="0,1.5" Text="shen12244" />
<TextBlock Width="120" Margin="0,1.5" Text="Candy_Mo" /> <TextBlock Width="120" Margin="0,1.5" Text="一般路过AAA" />
<TextBlock Width="120" Margin="0,1.5" Text="lettmin_" /> <TextBlock Width="120" Margin="0,1.5" Text="Niko" />
<TextBlock Width="120" Margin="0,1.5" Text="七九·Alnasl" /> <TextBlock Width="120" Margin="0,1.5" Text="qroiwopqri" />
<TextBlock Width="120" Margin="0,1.5" Text="辉" /> <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="有屳則名" />
<TextBlock Width="120" Margin="0,1.5" Text="crazy丶天人" /> <TextBlock Width="120" Margin="0,1.5" Text="TX2006" />
<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="冬将軍" /> <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="鬼泣々离殇" />
<TextBlock Width="120" Margin="0,1.5" Text="Liu2Shi2Pu2" /> <TextBlock Width="120" Margin="0,1.5" Text="蒼崎青子" />
<TextBlock Width="120" Margin="0,1.5" Text="Yu_s" /> <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="枝皙" /> <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="XIAOSHUAI" />
<TextBlock Width="120" Margin="0,1.5" Text="Slana23" /> <TextBlock Width="120" Margin="0,1.5" Text="saxioh" />
<TextBlock Width="120" Margin="0,1.5" Text="MMMy" /> <TextBlock Width="120" Margin="0,1.5" Text="baibaibai" />
<TextBlock Width="120" Margin="0,1.5" Text="Venuse" /> <TextBlock Width="120" Margin="0,1.5" Text="事屑Jerry" />
<TextBlock Width="120" Margin="0,1.5" Text="microjie" /> <TextBlock Width="120" Margin="0,1.5" Text="Rs32" />
<TextBlock Width="240" Margin="0,1.5" Text="Miner#Cetyleno~^" /> <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="风早九夜" />
<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="AL1Su-爱丽丝" /> <TextBlock Width="120" Margin="0,1.5" Text="hellord" />
<TextBlock Width="120" Margin="0,1.5" Text="我木有呆毛" /> <TextBlock Width="120" Margin="0,1.5" Text="时本ki" />
<TextBlock Width="120" Margin="0,1.5" Text="乌羽" /> <TextBlock Width="120" Margin="0,1.5" Text="mamana" />
<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="星の殇" /> <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="wddjww" />
<TextBlock Width="120" Margin="0,1.5" Text="格罗夫斯基" /> <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="银狼碎片" />
<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="曦" />
<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="薛小欣" /> <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="天恒" />
<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="qwqewe" />
<TextBlock Width="120" Margin="0,1.5" Text="枫" /> <TextBlock Width="120" Margin="0,1.5" Text="114514" />
<TextBlock Width="120" Margin="0,1.5" Text="jjj" /> <TextBlock Width="120" Margin="0,1.5" Text="YJ_42" />
<TextBlock Width="120" Margin="0,1.5" Text="clilick" /> <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="抛弃大脑" />
<TextBlock Width="120" Margin="0,1.5" Text="Phoenix tamer" /> <TextBlock Width="120" Margin="0,1.5" Text="10455885" />
<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="太阳神" /> <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="sukous" />
<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="在下粉毛控" /> <TextBlock Width="120" Margin="0,1.5" Text="KMYLS" />
<TextBlock Width="120" Margin="0,1.5" Text="SuperCrazyK" /> <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="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="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="20018" /> <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="Xiao_JIA" /> <TextBlock Width="120" Margin="0,1.5" Text="黑夜幽灵" />
<TextBlock Width="240" Margin="0,1.5" Text="龙腾我是你的头号粉丝" /> <TextBlock Width="120" Margin="0,1.5" Text="H1saNe" />
<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="百鬼まル" />
<TextBlock Width="120" Margin="0,1.5" Text="DPSYnt" />
<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="Landsilde" />
<TextBlock Width="120" Margin="0,1.5" Text="ktyxlan_lan" /> <TextBlock Width="120" Margin="0,1.5" Text="zzz" />
<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="黑色额度" /> <TextBlock Width="120" Margin="0,1.5" Text="Ashburn" />
<TextBlock Width="120" Margin="0,1.5" Text="sahaua" /> <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="古神" />
<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="120" Margin="0,1.5" Text="NQ" /> <TextBlock Width="240" Margin="0,1.5" Text="每天吃吃吃吃吃不饱" />
<TextBlock Width="120" Margin="0,1.5" Text="我志永纯" /> <TextBlock Width="120" Margin="0,1.5" Text="Freezhao" />
<TextBlock Width="120" Margin="0,1.5" Text="漫城" /> <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="泽涛" /> <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="祭°" /> <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="汐沄的随记" />
<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="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="七度ユキノ" />
<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="twokness" /> <TextBlock Width="120" Margin="0,1.5" Text="RainbowDashRD" />
<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="猫羽" /> <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="dddr" /> <TextBlock Width="120" Margin="0,1.5" Text="UUZ" />
<TextBlock Width="120" Margin="0,1.5" Text="天气热" /> <TextBlock Width="120" Margin="0,1.5" Text="Ankairis" />
<TextBlock Width="120" Margin="0,1.5" Text="Emmanuel" /> <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="云山如昨好" />
<TextBlock Width="120" Margin="0,1.5" Text="Bob_Marcus" /> <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="空?" />
<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="461863352" /> <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="Xing_K" /> <TextBlock Width="120" Margin="0,1.5" Text="xkw" />
<TextBlock Width="120" Margin="0,1.5" Text="yzt" /> <TextBlock Width="120" Margin="0,1.5" Text="KINO" />
<TextBlock Width="120" Margin="0,1.5" Text="nuycn" /> <TextBlock Width="120" Margin="0,1.5" Text="POTATO" />
<TextBlock Width="120" Margin="0,1.5" Text="鸡人" /> <TextBlock Width="120" Margin="0,1.5" Text="少昊氏" />
<TextBlock Width="120" Margin="0,1.5" Text="爱无界i" /> <TextBlock Width="240" Margin="0,1.5" Text="狂踹瘸子那條好腿丶" />
<TextBlock Width="120" Margin="0,1.5" Text="Zik yeung" /> <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="陌雨泠涯" />
<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="cai1" /> <TextBlock Width="120" Margin="0,1.5" Text="紘垰" />
<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" />
</WrapPanel> </WrapPanel>
<Grid Height="35"> <Grid Height="35">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
@@ -403,9 +360,11 @@
</local:MyCard> </local:MyCard>
<local:MyCard Margin="0,0,0,15" Title="法律信息" IsSwapped="True" CanSwap="True"> <local:MyCard Margin="0,0,0,15" Title="法律信息" IsSwapped="True" CanSwap="True">
<StackPanel Margin="25,39,23,20"> <StackPanel Margin="25,39,23,20">
<TextBlock Text="隐私说明" TextWrapping="Wrap" Margin="0,6,0,4" FontWeight="Bold" /> <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 Margin="0,0,0,2" LineHeight="17" Text="当下载失败、PCL 出错、游戏崩溃等事件时,PCL 会匿名上报信息,以通知龙猫 “哦吼,出错了”,让龙猫能更好地修 Bug……(PCL 不会上传或收集任何个人信息,包括上报的东西里面也没有!)&#xa;你可以在 设置 → 其他 → 启动器 中关闭上报,不过龙猫就不知道你遇到了什么 Bug 了……" TextWrapping="Wrap" />
<TextBlock Text="其他信息" TextWrapping="Wrap" Margin="0,12,0,4" FontWeight="Bold" /> <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" /> <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"> <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" /> <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 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 Public Shared Sub CopyUniqueAddress() Handles BtnDonateCopy.Click
ClipboardSet(UniqueAddress) ClipboardSet(UniqueAddress)
End Sub End Sub
@@ -41,6 +41,7 @@
{"SystemSystemCache", New SetupEntry("", Source:=SetupSource.Registry)}, {"SystemSystemCache", New SetupEntry("", Source:=SetupSource.Registry)},
{"SystemSystemUpdate", New SetupEntry(0)}, {"SystemSystemUpdate", New SetupEntry(0)},
{"SystemSystemActivity", New SetupEntry(0)}, {"SystemSystemActivity", New SetupEntry(0)},
{"SystemSystemTelemetry", New SetupEntry(True, Source:=SetupSource.Registry)},
{"CacheExportConfig", New SetupEntry("", Source:=SetupSource.Registry)}, {"CacheExportConfig", New SetupEntry("", Source:=SetupSource.Registry)},
{"CacheSavedPageUrl", New SetupEntry("", Source:=SetupSource.Registry)}, {"CacheSavedPageUrl", New SetupEntry("", Source:=SetupSource.Registry)},
{"CacheSavedPageVersion", New SetupEntry("", Source:=SetupSource.Registry)}, {"CacheSavedPageVersion", New SetupEntry("", Source:=SetupSource.Registry)},
@@ -123,7 +124,7 @@
{"ToolDownloadTranslateV2", New SetupEntry(1, Source:=SetupSource.Registry)}, {"ToolDownloadTranslateV2", New SetupEntry(1, Source:=SetupSource.Registry)},
{"ToolDownloadIgnoreQuilt", New SetupEntry(True, Source:=SetupSource.Registry)}, {"ToolDownloadIgnoreQuilt", New SetupEntry(True, Source:=SetupSource.Registry)},
{"ToolDownloadCert", New SetupEntry(False, 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)}, {"ToolModLocalNameStyle", New SetupEntry(0, Source:=SetupSource.Registry)},
{"ToolUpdateAlpha", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)}, {"ToolUpdateAlpha", New SetupEntry(0, Source:=SetupSource.Registry, Encoded:=True)},
{"ToolUpdateRelease", New SetupEntry(False, Source:=SetupSource.Registry)}, {"ToolUpdateRelease", New SetupEntry(False, Source:=SetupSource.Registry)},
@@ -356,13 +357,6 @@
Return Not HasIniKey(Version.Path & "PCL\Setup.ini", Key) Return Not HasIniKey(Version.Path & "PCL\Setup.ini", Key)
End Select End Select
End Function 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> ''' <summary>
''' 读取设置。 ''' 读取设置。
@@ -242,7 +242,7 @@
</StackPanel> </StackPanel>
<local:MyTextBox x:Name="TextAdvanceJvm" Grid.ColumnSpan="2" Tag="LaunchAdvanceJvm" Grid.Column="1" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,除非有确定把握,否则请不要修改。&#xa;支持 Minecraft 版本 JSON 中的字符串替换标记,例如 ${library_directory}。" MaxLength="4000" <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" /> 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}。" /> <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" /> <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="" <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="7" />
<RowDefinition Height="28" /> <RowDefinition Height="28" />
<RowDefinition Height="7" /> <RowDefinition Height="7" />
<RowDefinition Height="28" />
<RowDefinition Height="7" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
</Grid.RowDefinitions> </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: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="仅在官方源加载缓慢时改用镜像源" />
<local:MyComboBoxItem Content="尽量使用官方源" IsSelected="True" /> <local:MyComboBoxItem Content="尽量使用官方源" IsSelected="True" />
</local:MyComboBox>--> </local:MyComboBox>
<TextBlock Grid.Row="0" 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:MyComboBox Grid.Row="0" x:Name="ComboDownloadTranslateV2" Grid.ColumnSpan="2" Tag="ToolDownloadTranslateV2" Grid.Column="1" <local:MyComboBox Grid.Row="2" x:Name="ComboDownloadTranslateV2" Grid.ColumnSpan="2" Tag="ToolDownloadTranslateV2" Grid.Column="1"
ToolTip="下载社区资源时,其默认文件名的格式"> ToolTip="下载社区资源时,其默认文件名的格式">
<local:MyComboBoxItem Content="【机械动力】create-1.21.1-6.0.4" /> <local:MyComboBoxItem Content="【机械动力】create-1.21.1-6.0.4" />
<local:MyComboBoxItem Content="[机械动力] create-1.21.1-6.0.4" IsSelected="True" /> <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:MyComboBoxItem Content="create-1.21.1-6.0.4" /> <local:MyComboBoxItem Content="create-1.21.1-6.0.4" />
</local:MyComboBox> </local:MyComboBox>
<TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="Mod 管理样式" Margin="0,0,25,0" /> <TextBlock Grid.Row="4" 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" <local:MyComboBox Grid.Row="4" x:Name="ComboModLocalNameStyle" Grid.ColumnSpan="2" Tag="ToolModLocalNameStyle" Grid.Column="1"
ToolTip="在 Mod 管理页面中,Mod 项的显示方式"> ToolTip="在 Mod 管理页面中,Mod 项的显示方式">
<local:MyComboBoxItem Content="标题显示译名,详情显示文件名" IsSelected="True" /> <local:MyComboBoxItem Content="标题显示译名,详情显示文件名" IsSelected="True" />
<local:MyComboBoxItem Content="标题显示文件名,详情显示译名" /> <local:MyComboBoxItem Content="标题显示文件名,详情显示译名" />
</local:MyComboBox> </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" /> x:Name="CheckDownloadIgnoreQuilt" Tag="ToolDownloadIgnoreQuilt" />
</Grid> </Grid>
</StackPanel> </StackPanel>
@@ -109,7 +111,7 @@
<local:MyCheckBox Text="自动设置为中文" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="5" x:Name="CheckHelpChinese" Tag="ToolHelpChinese" /> <local:MyCheckBox Text="自动设置为中文" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="5" x:Name="CheckHelpChinese" Tag="ToolHelpChinese" />
</Grid> </Grid>
</local:MyCard> </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 Margin="25,40,25,20">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Name" /> <ColumnDefinition Width="Auto" SharedSizeGroup="Name" />
@@ -124,6 +126,7 @@
<RowDefinition Height="5" /> <RowDefinition Height="5" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" /> <RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text="启动器更新" Margin="0,0,25,0" /> <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text="启动器更新" Margin="0,0,25,0" />
<local:MyComboBox x:Name="ComboSystemUpdate" Tag="SystemSystemUpdate" Grid.Column="1"> <local:MyComboBox x:Name="ComboSystemUpdate" Tag="SystemSystemUpdate" Grid.Column="1">
@@ -145,7 +148,10 @@
<local:ValidateFolderPath UseMinecraftCharCheck="False" /> <local:ValidateFolderPath UseMinecraftCharCheck="False" />
</local:MyTextBox.ValidateRules> </local:MyTextBox.ValidateRules>
</local:MyTextBox> </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> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Button" /> <ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
<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="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" /> <local:MyButton Grid.Column="2" x:Name="BtnSystemSettingImp" MinWidth="140" Text="导入设置" Padding="13,0" Margin="0,0,20,0" />
</Grid> </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> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Button" /> <ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Button" /> <ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
@@ -35,7 +35,7 @@
'Mod 与整合包 'Mod 与整合包
ComboDownloadTranslateV2.SelectedIndex = Setup.Get("ToolDownloadTranslateV2") ComboDownloadTranslateV2.SelectedIndex = Setup.Get("ToolDownloadTranslateV2")
'ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod") ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod")
ComboModLocalNameStyle.SelectedIndex = Setup.Get("ToolModLocalNameStyle") ComboModLocalNameStyle.SelectedIndex = Setup.Get("ToolModLocalNameStyle")
CheckDownloadIgnoreQuilt.Checked = Setup.Get("ToolDownloadIgnoreQuilt") CheckDownloadIgnoreQuilt.Checked = Setup.Get("ToolDownloadIgnoreQuilt")
@@ -50,6 +50,7 @@
ComboSystemUpdate.SelectedIndex = Setup.Get("SystemSystemUpdate") ComboSystemUpdate.SelectedIndex = Setup.Get("SystemSystemUpdate")
ComboSystemActivity.SelectedIndex = Setup.Get("SystemSystemActivity") ComboSystemActivity.SelectedIndex = Setup.Get("SystemSystemActivity")
TextSystemCache.Text = Setup.Get("SystemSystemCache") TextSystemCache.Text = Setup.Get("SystemSystemCache")
CheckSystemTelemetry.Checked = Setup.Get("SystemSystemTelemetry")
'调试选项 '调试选项
CheckDebugMode.Checked = Setup.Get("SystemDebugMode") CheckDebugMode.Checked = Setup.Get("SystemDebugMode")
@@ -81,6 +82,7 @@
Setup.Reset("SystemSystemCache") Setup.Reset("SystemSystemCache")
Setup.Reset("SystemSystemUpdate") Setup.Reset("SystemSystemUpdate")
Setup.Reset("SystemSystemActivity") Setup.Reset("SystemSystemActivity")
Setup.Reset("SystemSystemTelemetry")
Log("[Setup] 已初始化启动器页设置") Log("[Setup] 已初始化启动器页设置")
Hint("已初始化启动器页设置!", HintType.Finish, False) Hint("已初始化启动器页设置!", HintType.Finish, False)
@@ -92,13 +94,13 @@
End Sub 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) If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked)
End Sub End Sub
Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderDebugAnim.Change, SliderDownloadThread.Change, SliderDownloadSpeed.Change 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) If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value)
End Sub 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) If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex)
End Sub End Sub
Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextSystemCache.ValidatedTextChanged 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" /> <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="跟随全局设置" <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" /> 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="跟随全局设置" /> <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" /> <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" <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 "服务器" #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 ComboServerLoginLast As Integer
Private Sub ComboServerLogin_Changed() Handles ComboServerLogin.SelectionChanged, TextServerNide.ValidatedTextChanged, TextServerAuthServer.ValidatedTextChanged, TextServerAuthRegister.ValidatedTextChanged Private Sub ComboServerLogin_Changed() Handles ComboServerLogin.SelectionChanged, TextServerNide.ValidatedTextChanged, TextServerAuthServer.ValidatedTextChanged, TextServerAuthRegister.ValidatedTextChanged
@@ -399,9 +408,6 @@ PreFin:
TextServerAuthName.Text = "LittleSkin 登录" TextServerAuthName.Text = "LittleSkin 登录"
End Sub 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 #End Region
#Region "Java 选择" #Region "Java 选择"
@@ -138,6 +138,10 @@
Text="· 下载版本:切换到 EventData 对应的 Minecraft 下载页面"/> Text="· 下载版本:切换到 EventData 对应的 Minecraft 下载页面"/>
<local:MyButton Margin="0,5,0,6" Width="250" Height="35" <local:MyButton Margin="0,5,0,6" Width="250" Height="35"
Text="下载 Minecraft 1.12.2" EventType="下载版本" EventData="1.12.2"/> 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> </StackPanel>
</local:MyCard> </local:MyCard>
Binary file not shown.