龙腾猫跃 1 an în urmă
părinte
comite
adf52d56b7
27 a modificat fișierele cu 705 adăugiri și 682 ștergeri
  1. 2 1
      Plain Craft Launcher 2/Application.xaml
  2. 1 0
      Plain Craft Launcher 2/Application.xaml.vb
  3. 1 2
      Plain Craft Launcher 2/Controls/MyCard.vb
  4. 22 6
      Plain Craft Launcher 2/FormMain.xaml.vb
  5. 68 65
      Plain Craft Launcher 2/Modules/Base/ModBase.vb
  6. 16 10
      Plain Craft Launcher 2/Modules/Base/ModNet.vb
  7. 15 7
      Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb
  8. 30 22
      Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
  9. 32 17
      Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
  10. 2 2
      Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
  11. 2 2
      Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb
  12. 1 4
      Plain Craft Launcher 2/Modules/ModEvent.vb
  13. 2 0
      Plain Craft Launcher 2/Modules/ModSecret.vb
  14. 1 1
      Plain Craft Launcher 2/Modules/ThirdParty/DragHelper.vb
  15. 2 2
      Plain Craft Launcher 2/My Project/AssemblyInfo.vb
  16. 15 13
      Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb
  17. 2 2
      Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb
  18. 451 492
      Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml
  19. 0 6
      Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb
  20. 2 8
      Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb
  21. 1 1
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml
  22. 17 11
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml
  23. 5 3
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb
  24. 2 2
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml
  25. 9 3
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb
  26. 4 0
      Plain Craft Launcher 2/Resources/Custom.xaml
  27. BIN
      Plain Craft Launcher 2/Resources/Help.zip

+ 2 - 1
Plain Craft Launcher 2/Application.xaml

@@ -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 -->

+ 1 - 0
Plain Craft Launcher 2/Application.xaml.vb

@@ -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
Plain Craft Launcher 2/Controls/MyCard.vb

@@ -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
Plain Craft Launcher 2/FormMain.xaml.vb

@@ -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
Plain Craft Launcher 2/Modules/Base/ModBase.vb

@@ -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 VersionStandardCode As String = "2.10.5." & VersionBranchCode '标准格式的四段式版本号
+    Public Const VersionBaseName As String = "2.10.6" '不含分支前缀的显示用版本名
+    Public Const VersionStandardCode As String = "2.10.6." & VersionBranchCode '标准格式的四段式版本号
     Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换
     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
-            If Not ToPath.Contains(":\") Then ToPath = Path & ToPath
+            FromPath = ShortenPath(If(FromPath.Contains(":\"), FromPath, Path & FromPath))
+            ToPath = ShortenPath(If(ToPath.Contains(":\"), ToPath, Path & ToPath))
             '如果复制同一个文件则跳过
             '如果复制同一个文件则跳过
             If FromPath = ToPath Then Return
             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)
-                    Dim DestinationPath As String = IO.Path.Combine(DestDirectory, Entry.FullName)
+                    If ProgressIncrementHandler IsNot Nothing AndAlso TotalCount > 0 Then ProgressIncrementHandler(1 / TotalCount)
+                    Dim DestinationPath As String = ShortenPath(IO.Path.Combine(DestDirectory, Entry.FullName))
                     If DestinationPath.EndsWithF("\") OrElse DestinationPath.EndsWithF("/") Then
                     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)
-        If Not Exp Then Throw New Exception("断言命中")
+    '遥测
+    Public Sub Telemetry([Event] As String, ParamArray Datas As String())
+        If Not Setup.Get("SystemSystemTelemetry") Then Return '用户关闭了遥测
+        If Not ClsBaseUrl.StartsWithF("http") Then Return '开源版没有设置遥测地址
+        RunInNewThread(
+        Sub()
+            Try
+                Log($"[System] 匿名数据上报:{[Event]}")
+                Dim Url As String = $"{ClsBaseUrl}&Event={WebUtility.UrlEncode([Event])}"
+                For i = 0 To Datas.Length - 1 Step 2
+                    Url &= "&" & WebUtility.UrlEncode(Datas(i)) & "=" & WebUtility.UrlEncode(Datas(i + 1).Replace(vbCrLf, vbLf))
+                Next
+                NetRequestByClient(Url, MakeLog:=False)
+            Catch
+                Log("[System] 匿名数据上报失败", LogLevel.Debug)
+            End Try
+        End Sub, "Telemetry", ThreadPriority.Lowest)
     End Sub
     End Sub
 
 
     '获取当前的堆栈信息
     '获取当前的堆栈信息

+ 16 - 10
Plain Craft Launcher 2/Modules/Base/ModNet.vb

@@ -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 &
-                                            Join(File.Sources.Select(Function(s) $"{If(s.Ex?.Message, "无错误信息。")}({s.Url})"), vbCrLf),
+                                            "各下载源的错误如下:" & vbCrLf & Detail,
                                             [Error])
                                             [Error])
+                    '上报
+                    Telemetry("文件下载失败",
+                              "FileName", File.LocalName,
+                              "Exception", Detail)
                     Exit For
                     Exit For
                 Next
                 Next
                 '在设置 Error 对象后再更改为失败,避免 WaitForExit 无法捕获错误
                 '在设置 Error 对象后再更改为失败,避免 WaitForExit 无法捕获错误

+ 15 - 7
Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb

@@ -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 出现错误"),
-            "确定", If(IsHandAnalyze OrElse DirectFile Is Nothing, "", "查看日志"), If(IsHandAnalyze, "", "导出错误报告"),
-            Button2Action:=If(IsHandAnalyze OrElse DirectFile Is Nothing, Nothing,
+        Dim Detail As String = GetAnalyzeResult(IsManualAnalyze)
+        Select Case MyMsgBox(Detail, If(IsManualAnalyze, "错误报告分析结果", "Minecraft 出现错误"),
+            "确定", If(IsManualAnalyze OrElse DirectFile Is Nothing, "", "查看日志"), If(IsManualAnalyze, "", "导出错误报告"),
+            Button2Action:=If(IsManualAnalyze OrElse DirectFile Is Nothing, Nothing,
             Sub()
             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

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

@@ -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,要不然有时候远端服务器来不及完成
-        Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
-        'Dim McimUrl As String = DlSourceModGet(Url)
-        'If McimUrl <> Url Then
-        '   Select Case Setup.Get("ToolDownloadMod")
-        '       Case 0
-        '           Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
-        '           Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
-        '           Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
-        '       Case 1
-        '           Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10))
-        '           Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
-        '           Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
-        '           Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
-        '       Case Else
-        '           Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10))
-        '           Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
-        '           Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
-        '   End Select
-        'End If
+        Dim McimUrl As String = DlSourceModGet(Url)
+        If McimUrl <> Url Then
+            Select Case Setup.Get("ToolDownloadMod")
+                Case 0
+                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
+                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
+                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
+                Case 1
+                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10)) '至少 10s,要不然有时候远端服务器来不及完成
+                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10))
+                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
+                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
+                Case Else
+                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10))
+                    Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
+                    Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30))
+            End Select
+        Else
+            Urls.Add(New KeyValuePair(Of String, Integer)(Url, 10))
+            Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30))
+        End If
         Dim Exs As String = ""
         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 自动切换

+ 32 - 17
Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb

@@ -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(CurrentLaunchOptions?.SaveBatch Is Nothing, "启动失败", "导出启动脚本失败"))
+                    If(IsSavingBatch, "导出启动脚本失败", "Minecraft 启动失败"), LogLevel.Msgbox,
+                    If(IsSavingBatch, "导出启动脚本失败", "启动失败"))
+                '上报
+                If Not IsSavingBatch Then
+                    Telemetry("Minecraft 启动失败",
+                              "Version", McVersionCurrent.Version.ToString,
+                              "LoginType", GetStringFromEnum(CType(Setup.Get("LoginType"), McLoginType)),
+                              "Exception", FilterUserName(FilterAccessToken(GetExceptionDetail(ex), "*"), "*"))
+                End If
                 Throw
                 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
-            If ex.Message.ContainsF("must sign in again", True) OrElse ex.Message.ContainsF("password expired", True) OrElse
-               (ex.Message.Contains("refresh_token") AndAlso ex.Message.Contains("is not valid")) Then '#269
+        Catch ex As ResponsedWebException
+            If ex.Response.ContainsF("must sign in again", True) OrElse ex.Response.ContainsF("password expired", True) OrElse
+               (ex.Response.Contains("refresh_token") AndAlso ex.Response.Contains("is not valid")) Then '#269
                 Return {"Relogin", ""}
                 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

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

@@ -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

+ 2 - 2
Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb

@@ -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
Plain Craft Launcher 2/Modules/ModEvent.vb

@@ -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 是否为最新版本。", "事件执行失败")

+ 2 - 0
Plain Craft Launcher 2/Modules/ModSecret.vb

@@ -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
Plain Craft Launcher 2/Modules/ThirdParty/DragHelper.vb

@@ -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()

+ 2 - 2
Plain Craft Launcher 2/My Project/AssemblyInfo.vb

@@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices
 ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 ' 方法是按如下所示使用“*”
 ' 方法是按如下所示使用“*”
 
 
-<Assembly: AssemblyVersion("2.10.5.0")>
-<Assembly: AssemblyFileVersion("2.10.5.0")>
+<Assembly: AssemblyVersion("2.10.6.0")>
+<Assembly: AssemblyFileVersion("2.10.6.0")>
 <Assembly: NeutralResourcesLanguage("")>
 <Assembly: NeutralResourcesLanguage("")>

+ 15 - 13
Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb

@@ -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()
-                                      '执行动画
-                                      AniStart({
-                                                     AaOpacity(PanLogin, -PanLogin.Opacity, 100,, New AniEaseOutFluent),
-                                                     AaCode(Sub()
-                                                                AniControlEnabled += 1
-                                                                PanLogin.Children.Clear()
-                                                                PanLogin.Children.Add(PageNew)
-                                                                AniControlEnabled -= 1
-                                                            End Sub, 100),
-                                                     AaOpacity(PanLogin, 1, 100, 120, New AniEaseInFluent)
-                                                 }, "FrmLogin PageChange")
-                                  End Sub, Threading.DispatcherPriority.Render)
+                Dispatcher.Invoke(
+                Sub()
+                    '执行动画
+                    AniStart({
+                        AaOpacity(PanLogin, -PanLogin.Opacity, 100,, New AniEaseOutFluent),
+                        AaCode(
+                        Sub()
+                            AniControlEnabled += 1
+                            PanLogin.Children.Clear()
+                            PanLogin.Children.Add(PageNew)
+                            AniControlEnabled -= 1
+                        End Sub, 100),
+                        AaOpacity(PanLogin, 1, 100, 120, New AniEaseInFluent)
+                    }, "FrmLogin PageChange")
+                End Sub, Threading.DispatcherPriority.Render)
             Else
             Else
                 '无动画
                 '无动画
                 AniControlEnabled += 1
                 AniControlEnabled += 1

+ 2 - 2
Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb

@@ -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

+ 451 - 492
Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml

@@ -1,492 +1,451 @@
-<local:MyPageRight
-    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-    xmlns:local="clr-namespace:PCL" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
-    mc:Ignorable="d" x:Class="PageOtherAbout"
-    PanScroll="{Binding ElementName=PanBack}" RenderOptions.BitmapScalingMode="LowQuality">
-    <local:MyScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" x:Name="PanBack">
-        <StackPanel x:Name="PanMain" Margin="25,10" Grid.IsSharedSizeScope="True">
-            <local:MyCard Margin="0,15" Title="关于">
-                <Grid Margin="21,40,21,16">
-                    <Grid.RowDefinitions>
-                        <RowDefinition Height="45" />
-                        <RowDefinition Height="45" />
-                    </Grid.RowDefinitions>
-                    <Grid.ColumnDefinitions>
-                        <ColumnDefinition Width="40" />
-                        <ColumnDefinition />
-                        <ColumnDefinition Width="150" />
-                    </Grid.ColumnDefinitions>
-                    <local:MyListItem IsHitTestVisible="False" Title="龙腾猫跃" Margin="-5,0,15,0" Info="Plain Craft Launcher 的作者!" Grid.Row="0" Grid.Column="1" />
-                    <local:MyListItem IsHitTestVisible="False" Title="Plain Craft Launcher 2" Margin="-5,0,15,0" Info="当前版本:%VERSION%(%VERSIONCODE%.%BRANCH%)" Grid.Row="1" Grid.Column="1" x:Name="ItemAboutPcl" />
-                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/Logo.png" Grid.Row="1" Margin="3">
-                        <Image.Clip>
-                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
-                        </Image.Clip>
-                    </Image>
-                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/LTCat.jpg" Grid.Row="0" Margin="3">
-                        <Image.Clip>
-                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
-                        </Image.Clip>
-                    </Image>
-                    <local:MyButton Text="赞助作者" Grid.Column="2" Grid.Row="0" Height="35" EventType="打开网页" EventData="https://afdian.com/a/LTCat" />
-                    <local:MyButton Text="查看源代码" Grid.Column="2" Grid.Row="1" Height="35" EventType="打开网页" EventData="https://github.com/Hex-Dragon/PCL2" />
-                </Grid>
-            </local:MyCard>
-            <local:MyCard Margin="0,0,0,15" Title="特别鸣谢">
-                <Grid Margin="21,40,21,16">
-                    <Grid.RowDefinitions>
-                        <RowDefinition Height="45" />
-                        <RowDefinition Height="45" />
-                        <RowDefinition Height="45" />
-                        <RowDefinition Height="45" />
-                        <RowDefinition Height="45" />
-                        <RowDefinition Height="45" />
-                        <RowDefinition Height="45" />
-                        <RowDefinition Height="45" />
-                    </Grid.RowDefinitions>
-                    <Grid.ColumnDefinitions>
-                        <ColumnDefinition Width="40" />
-                        <ColumnDefinition />
-                        <ColumnDefinition Width="150" />
-                    </Grid.ColumnDefinitions>
-                    <local:MyListItem Title="bangbang93" Margin="-5,0,15,0" IsHitTestVisible="False" Info="提供 BMCLAPI 镜像源和 Forge 安装工具,详见 https://bmclapi.bangbang93.com" Grid.Row="0" Grid.Column="1" />
-                    <local:MyButton x:Name="BtnAboutBmclapi" Text="赞助镜像源" Grid.Row="0" Grid.Column="2" Height="35" />
-                    <local:MyListItem Title="MC 百科" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 Mod 名称的中文翻译和更多相关信息!" Grid.Row="1" Grid.Column="1" />
-                    <local:MyButton x:Name="BtnAboutWiki" Text="打开百科" Grid.Row="1" Grid.Column="2" Height="35" />
-                    <local:MyListItem Title="00ll00" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 Java Launch Wrapper 和一些重要服务支持!" Grid.Row="2" Grid.Column="1" />
-                    <local:MyListItem Title="z0z0r4" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 MCIM 中国 Mod 下载镜像源和帮助库图床!" Grid.Row="3" Grid.Column="1" />
-                    <local:MyListItem Title="Patrick" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="设计并制作了 PCL 图标,让我从做图标的水深火热中得到了解脱……" Grid.Row="4" Grid.Column="1" />
-                    <local:MyListItem Title="Hao_Tian" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="在内测中找出了一大堆没人想得到的诡异 Bug,有非同寻常的 Bug 体质" Grid.Row="5" Grid.Column="1" />
-                    <local:MyListItem Title="Minecraft 中文论坛" Margin="-5,0,15,0" IsHitTestVisible="False" Info="虽然已经关站了,但感谢此前提供了 MCBBS 镜像源……" Grid.Row="6" Grid.Column="1" />
-                    <local:MyListItem Title="PCL 内群的各位" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="感谢内群的沙雕网友们这么久以来对我和 PCL 的支持与鼓励!" Grid.Row="7" Grid.Column="1" />
-                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/bangbang93.png" Grid.Row="0" Margin="3">
-                        <Image.Clip>
-                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
-                        </Image.Clip>
-                    </Image>
-                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/wiki.png" Grid.Row="1" Margin="3">
-                        <Image.Clip>
-                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
-                        </Image.Clip>
-                    </Image>
-                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/00ll00.png" Grid.Row="2" Margin="3">
-                        <Image.Clip>
-                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
-                        </Image.Clip>
-                    </Image>
-                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/z0z0r4.png" Grid.Row="3" Margin="3">
-                        <Image.Clip>
-                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
-                        </Image.Clip>
-                    </Image>
-                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/Patrick.png" Grid.Row="4" Margin="3">
-                        <Image.Clip>
-                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
-                        </Image.Clip>
-                    </Image>
-                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/Hao_Tian.jpg" Grid.Row="5" Margin="3">
-                        <Image.Clip>
-                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
-                        </Image.Clip>
-                    </Image>
-                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/MCBBS.png" Grid.Row="6" Margin="3">
-                        <Image.Clip>
-                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
-                        </Image.Clip>
-                    </Image>
-                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/PCL2.png" Grid.Row="7" Margin="3">
-                        <Image.Clip>
-                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
-                        </Image.Clip>
-                    </Image>
-                </Grid>
-            </local:MyCard>
-            <local:MyCard Margin="0,0,0,15" Title="赞助者">
-                <StackPanel Margin="25,40,10,20">
-                    <TextBlock HorizontalAlignment="Left" Text="以下是 2025 年 6 月的高级赞助者们!感谢各位对 PCL 和伟大的咕咕咕事业的支持!" Margin="0,0,25,5.5" TextTrimming="None" TextWrapping="WrapWithOverflow" />
-                    <WrapPanel Margin="0,0,0,10">
-                        <TextBlock Width="120" Margin="0,1.5" Text="星月" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Nemo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="长歌当天" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="飒黎lIlIlI" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="hy" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="SaDhhJe" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="风铃子啊" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="柠娜" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="W丶北辰" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="才KRE" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Yang_mistakeof" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="close eyes" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="顾顾" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="LTuuxj" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="花吃" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="FICazk" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="屑屑你" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="凉凉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="WDSJ" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Tohka" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="lz" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="哦嚯嚯嚯皮筋头" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="陈肖杰" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MC小满" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="残光" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="玖玖璃" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="水晶OTZ" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="伯克礼" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="白猫海贼船" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="zhang1232" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Never" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Fish_pomelo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="生风" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="富士山下" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小七" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="发呆的呆毛君" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="天黑时看月亮" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="夜枫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="_章333_" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="孙杰" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="wby" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="封尾==" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="你与空白皆无名" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="鱼" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="zzxniubi" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="炎燚火淼淼" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="三巿" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="奈落" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="华佗" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="oran9e" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="赤冰雨" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Urizen" />
-                        <TextBlock Width="120" Margin="0,1.5" Text=":)" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="skyqyzm" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="橘子皮丶" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="额外awa" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="安上月" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="念城南" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="多低山丘陵" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="书童呀" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="sxy192425" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="李好啊" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MH_Nine" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="周先生" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="原" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="良田满穗" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="柴" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="庭师" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="。,。" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="DHLH" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Xayj" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="绳网用户#37" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="LLLL" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="深绯红" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="奇伢七星" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Akapigo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Shink_guns" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Aqua 极&amp;坏." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="大事化小蛋糕" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Nakiya233" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="花小妖" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="septebr" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="一只马喽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="下暴雨BWB" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="QAQ" />
-                        <TextBlock Width="240" Margin="0,1.5" Text="sl土豆社区服主B友" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Wang" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="......" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ResTmoW" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="bochibochibo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="铸魂之灵" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="柏柏柏" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Mart1s" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="KuruM148" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="KaiTouCrow" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="LIE-SHAN" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="慈悲方舟" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="于析" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="陌道" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="摇椅上的猫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="五个麦卷" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Miraclepoi" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="XiaoLI" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="啊吧啊吧的肥宅" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="不娶雨婷不改名" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="oppo19" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="博麗靈夢" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="莹 of yours" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ChinaFZXPVP" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="城之内sama" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ENXI" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="steve_c418" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="洛长安" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="magic_muggle" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小猫游六喵" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="JY" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="雪豹起司可颂" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="wlsy" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="齐先生爱溜达" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="是小泠啊" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="xioyiao" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="BunnyMiku" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="dadagga" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="无极之笔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="xiaoyu" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="王梓杰" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="wjbjjd" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Candy_Mo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="lettmin_" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="七九·Alnasl" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="辉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="何为最优解" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="crazy丶天人" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="XsBlueSky" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="冬将軍" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="tiechui" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Liu2Shi2Pu2" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Yu_s" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="刘四妹" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="枝皙" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="CC" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Slana23" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MMMy" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Venuse" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="microjie" />
-                        <TextBlock Width="240" Margin="0,1.5" Text="Miner#Cetyleno~^" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="春江花月夜" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="落南子" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="AL1Su-爱丽丝" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="我木有呆毛" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="乌羽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="知性de含羞草" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="星の殇" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="IED LTAM" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="格罗夫斯基" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="梦启泉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="岁月无痕" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="????" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="超级脑壳" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="空梦" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="薛小欣" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="蛋黄豆角" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="芒果茶州" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="癫风院院长" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="三十一" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="美醉了" />
-                        <TextBlock Width="240" Margin="0,1.5" Text="中科院在逃量子计算机" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="枫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="jjj" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="clilick" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="我很快乐" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Phoenix tamer" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Lsp77" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="太阳神" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ikun0014" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="IncredibleYu" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="在下粉毛控" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="SuperCrazyK" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阿柔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="HaKNa" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="胡十一" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="菲利絲" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="迷梦的羽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="20018" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="波比科普员" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Xiao_JIA" />
-                        <TextBlock Width="240" Margin="0,1.5" Text="龙腾我是你的头号粉丝" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="keer1563" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="百鬼まル" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="DPSYnt" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="七色彩羽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="臭氧化碳" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="情来风" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="柒月" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="汪汪队队长" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="迷路的猫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ktyxlan_lan" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="琳琅039" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="黑色额度" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="sahaua" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="宦昭" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="镜刹" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="房石诶多" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="熊" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="NQ" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="我志永纯" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="漫城" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="憨憨的小草" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="泽涛" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="星海鹿樱" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="祭°" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="赛冷特呀" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="无妄之灾" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ZGW2008" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="没事多喝感冒灵" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="一梦筱筱" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="twokness" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="hhy7171" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="子虚" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="猫羽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="有氧丁真" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="dddr" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="天气热" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Emmanuel" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="夕尽暮染" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Bob_Marcus" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="初心无尘" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="朱利安" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="461863352" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="庭" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Xing_K" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="yzt" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="nuycn" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="鸡人" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="爱无界i" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Zik yeung" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="墨子吉安" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="柠果籽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="cai1" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小比登T^T" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="hb" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="caizzz" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="yyin" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="無言" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="修" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="改头换面" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="无敌百搭的款式" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="御坂1354号" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="木子" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="萤火焱攸" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="盼盼不是Panda" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="烤肉真香" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ZhuTan12" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="tom" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="洛竹" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="foob" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Garylu" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阮绍轩" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="xin822" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="BAIgivele" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ljc" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="暖笑" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="焦糖流酥" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="绚丽的星河" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="魔导兔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="吾乃斗笔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="君殇" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="沙轻" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="邓布利多" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="红薯散养专业户" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="十言" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="vvvghjvvv" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="法斯" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="DASENSUN" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="HTS" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="握不住信新心" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="sycuuj133" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="天杉大将军" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="风见翎" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="江心Rain" />
-                    </WrapPanel>
-                    <Grid Height="35">
-                        <Grid.ColumnDefinitions>
-                            <ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
-                            <ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
-                            <ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
-                        </Grid.ColumnDefinitions>
-                        <local:MyButton x:Name="BtnDonateOutput" Grid.Column="0" MinWidth="140" Text="生成解锁码" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" ColorType="Highlight" Visibility="Collapsed" />
-                        <local:MyButton x:Name="BtnDonateDonate" Grid.Column="0" MinWidth="140" Text="赞助作者" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" ColorType="Highlight" EventType="打开网页" EventData="https://afdian.com/a/LTCat" />
-                        <local:MyButton x:Name="BtnDonateCopy" Grid.Column="1" MinWidth="140" Text="复制识别码" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" />
-                        <local:MyButton x:Name="BtnDonateInput" Grid.Column="2" MinWidth="140" Text="输入解锁码" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" />
-                    </Grid>
-                </StackPanel>
-            </local:MyCard>
-            <local:MyCard Margin="0,0,0,15" Title="法律信息" IsSwapped="True" CanSwap="True">
-                <StackPanel Margin="25,39,23,20">
-                    <TextBlock Text="隐私说明" TextWrapping="Wrap" Margin="0,6,0,4" FontWeight="Bold" />
-                    <TextBlock Margin="0,0,0,2" LineHeight="17" Text="本软件的 User Agent 中包含启动器的版本号,以统计各版本的用户数量。&#13;除此之外,本软件不会向开发者上传任何其他信息。" TextWrapping="Wrap" />
-                    <TextBlock Text="其他信息" TextWrapping="Wrap" Margin="0,12,0,4" FontWeight="Bold" />
-                    <TextBlock Margin="0,0,0,2" LineHeight="17" Text="Copyright © 龙腾猫跃 2016. All Rights Reserved.&#13;计算机软件著作权登记号:2020SR0875133&#13;违法违规行为举报投诉邮箱:[email protected]&#13;非 MINECRAFT 官方产品。未经 MOJANG 或 MICROSOFT 批准,也不与 MOJANG 或 MICROSOFT 关联。" TextWrapping="Wrap" />
-                    <StackPanel Orientation="Horizontal" Height="35" HorizontalAlignment="Left" Margin="0,12,0,0">
-                        <local:MyButton Text="用户协议与免责声明" Width="170" Padding="13,0" Margin="0,0,20,0" ColorType="Highlight" EventType="打开网页" EventData="https://shimo.im/docs/rGrd8pY8xWkt6ryW" />
-                        <local:MyButton Text="开源代码" Width="140" Padding="13,0" EventType="打开网页" EventData="https://github.com/Hex-Dragon/PCL2" />
-                    </StackPanel>
-                </StackPanel>
-            </local:MyCard>
-            <local:MyCard Margin="0,0,0,15" Title="许可与版权声明" IsSwapped="True" CanSwap="True">
-                <Grid Margin="25,42,23,4">
-                    <Grid.ColumnDefinitions>
-                        <ColumnDefinition Width="Auto" />
-                        <ColumnDefinition Width="20" />
-                        <ColumnDefinition Width="Auto" />
-                        <ColumnDefinition />
-                    </Grid.ColumnDefinitions>
-                    <Grid.RowDefinitions>
-                        <RowDefinition Height="Auto" />
-                        <RowDefinition Height="60" />
-                        <RowDefinition Height="Auto" />
-                        <RowDefinition Height="60" />
-                        <RowDefinition Height="Auto" />
-                        <RowDefinition Height="60" />
-                        <RowDefinition Height="Auto" />
-                        <RowDefinition Height="60" />
-                        <RowDefinition Height="Auto" />
-                        <RowDefinition Height="60" />
-                        <RowDefinition Height="Auto" />
-                        <RowDefinition Height="60" />
-                        <RowDefinition Height="Auto" />
-                        <RowDefinition Height="60" />
-                        <RowDefinition Height="Auto" />
-                    </Grid.RowDefinitions>
-                    <TextBlock Grid.Row="0" Grid.Column="0" Text="Java Launch Wrapper" TextWrapping="Wrap" FontWeight="Bold" />
-                    <TextBlock Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2022 00ll00&#xa;Licensed under the MIT License." TextWrapping="Wrap" />
-                    <local:MyButton Grid.Row="1" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://github.com/00ll00/java_launch_wrapper" />
-                    <local:MyButton Grid.Row="1" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://github.com/00ll00/java_launch_wrapper?tab=MIT-1-ov-file#readme" />
-
-                    <TextBlock Grid.Row="2" Grid.Column="0" Text="Newtonsoft.Json" TextWrapping="Wrap" FontWeight="Bold" />
-                    <TextBlock Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2007 James Newton-King&#xa;Licensed under the MIT License." TextWrapping="Wrap" />
-                    <local:MyButton Grid.Row="3" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://www.newtonsoft.com/json" />
-                    <local:MyButton Grid.Row="3" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://opensource.org/licenses/MIT" />
-                    
-                    <TextBlock Grid.Row="4" Grid.Column="0" Text="NAudio" TextWrapping="Wrap" FontWeight="Bold" />
-                    <TextBlock Grid.Row="4" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2015 Mark Heath ([email protected])&#xa;Licensed under the MIT License." TextWrapping="Wrap" />
-                    <local:MyButton Grid.Row="5" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://github.com/naudio/NAudio" />
-                    <local:MyButton Grid.Row="5" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left" 
-                                    EventType="打开网页" EventData="https://github.com/naudio/NAudio/blob/master/license.txt" />
-                    
-                    <TextBlock Grid.Row="6" Grid.Column="0" Text="Ookii.Dialogs" TextWrapping="Wrap" FontWeight="Bold" />
-                    <TextBlock Grid.Row="6" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2009 Sven Groot (Ookii.org)" TextWrapping="Wrap" />
-                    <local:MyButton Grid.Row="7" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://www.ookii.org/Software/Dialogs/" />
-                    <local:MyButton Grid.Row="7" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://github.com/caioproiete/ookii-dialogs-wpf/blob/master/LICENSE" />
-                    
-                    <TextBlock Grid.Row="8" Grid.Column="0" Text="Iconmonstr" TextWrapping="Wrap" FontWeight="Bold" />
-                    <TextBlock Grid.Row="8" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2019 iconmonstr (Alexander Kahlkopf)" TextWrapping="Wrap" />
-                    <local:MyButton Grid.Row="9" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://iconmonstr.com/" />
-                    <local:MyButton Grid.Row="9" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://iconmonstr.com/license/" />
-                    
-                    <TextBlock Grid.Row="10" Grid.Column="0" Text="libwebp wrapper for .NET" TextWrapping="Wrap" FontWeight="Bold" />
-                    <TextBlock Grid.Row="10" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2012 Imazen&#xa;Licensed under the MIT License." TextWrapping="Wrap" />
-                    <local:MyButton Grid.Row="11" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://github.com/imazen/libwebp-net" />
-                    <local:MyButton Grid.Row="11" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://github.com/imazen/libwebp-net/blob/master/LICENSE.txt" />
-
-                    <TextBlock Grid.Row="12" Grid.Column="0" Text="Iconfont" TextWrapping="Wrap" FontWeight="Bold" />
-                    <TextBlock Grid.Row="12" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © ALIMAMA MUX, powered by alimama THX." TextWrapping="Wrap" />
-                    <local:MyButton Grid.Row="13" Grid.Column="2" MinWidth="140" Text="查看原网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
-                                    EventType="打开网页" EventData="https://www.iconfont.cn/" />
-
-                </Grid>
-            </local:MyCard>
-        </StackPanel>
-    </local:MyScrollViewer>
-</local:MyPageRight>
+<local:MyPageRight
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:local="clr-namespace:PCL" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+    mc:Ignorable="d" x:Class="PageOtherAbout"
+    PanScroll="{Binding ElementName=PanBack}" RenderOptions.BitmapScalingMode="LowQuality">
+    <local:MyScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" x:Name="PanBack">
+        <StackPanel x:Name="PanMain" Margin="25,10" Grid.IsSharedSizeScope="True">
+            <local:MyCard Margin="0,15" Title="关于">
+                <Grid Margin="21,40,21,16">
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="45" />
+                        <RowDefinition Height="45" />
+                    </Grid.RowDefinitions>
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="40" />
+                        <ColumnDefinition />
+                        <ColumnDefinition Width="150" />
+                    </Grid.ColumnDefinitions>
+                    <local:MyListItem IsHitTestVisible="False" Title="龙腾猫跃" Margin="-5,0,15,0" Info="Plain Craft Launcher 的开发者!" Grid.Row="0" Grid.Column="1" />
+                    <local:MyListItem IsHitTestVisible="False" Title="Plain Craft Launcher 2" Margin="-5,0,15,0" Info="当前版本:%VERSION%(%VERSIONCODE%.%BRANCH%)" Grid.Row="1" Grid.Column="1" x:Name="ItemAboutPcl" />
+                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/Logo.png" Grid.Row="1" Margin="3">
+                        <Image.Clip>
+                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
+                        </Image.Clip>
+                    </Image>
+                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/LTCat.jpg" Grid.Row="0" Margin="3">
+                        <Image.Clip>
+                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
+                        </Image.Clip>
+                    </Image>
+                    <local:MyButton Text="赞助 PCL !" Grid.Column="2" Grid.Row="0" Height="35" EventType="打开网页" EventData="https://afdian.com/a/LTCat" ColorType="Highlight" />
+                    <local:MyButton Text="查看源代码" Grid.Column="2" Grid.Row="1" Height="35" EventType="打开网页" EventData="https://github.com/Hex-Dragon/PCL2" />
+                </Grid>
+            </local:MyCard>
+            <local:MyCard Margin="0,0,0,15" Title="特别鸣谢">
+                <Grid Margin="21,40,21,16">
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="45" />
+                        <RowDefinition Height="45" />
+                        <RowDefinition Height="45" />
+                        <RowDefinition Height="45" />
+                        <RowDefinition Height="45" />
+                        <RowDefinition Height="45" />
+                        <RowDefinition Height="45" />
+                        <RowDefinition Height="45" />
+                    </Grid.RowDefinitions>
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="40" />
+                        <ColumnDefinition />
+                        <ColumnDefinition Width="150" />
+                    </Grid.ColumnDefinitions>
+                    <local:MyListItem Title="bangbang93" Margin="-5,0,15,0" IsHitTestVisible="False" Info="提供 BMCLAPI 镜像源和 Forge 安装工具,详见 https://bmclapi.bangbang93.com" Grid.Row="0" Grid.Column="1" />
+                    <local:MyButton Text="赞助镜像源" Grid.Row="0" Grid.Column="2" Height="35" EventType="打开网页" EventData="https://afdian.com/a/bangbang93" />
+                    <local:MyListItem Title="MC 百科" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 Mod 名称的中文翻译和更多相关信息!" Grid.Row="1" Grid.Column="1" />
+                    <local:MyButton Text="打开百科" Grid.Row="1" Grid.Column="2" Height="35" EventType="打开网页" EventData="https://www.mcmod.cn" />
+                    <local:MyListItem Title="z0z0r4" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 MCIM 社区资源镜像源和帮助库图床!" Grid.Row="2" Grid.Column="1" />
+                    <local:MyButton Text="MCIM 主页" Grid.Row="2" Grid.Column="2" Height="35" EventType="打开网页" EventData="https://github.com/mcmod-info-mirror" />
+                    <local:MyListItem Title="00ll00" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="提供了 Java Launch Wrapper 和一些重要服务支持!" Grid.Row="3" Grid.Column="1" />
+                    <local:MyListItem Title="Patrick" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="设计并制作了 PCL 图标,让我从做图标的水深火热中得到了解脱……" Grid.Row="4" Grid.Column="1" />
+                    <local:MyListItem Title="Hao_Tian" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="在内测中找出了一大堆没人想得到的诡异 Bug,有非同寻常的 Bug 体质" Grid.Row="5" Grid.Column="1" />
+                    <local:MyListItem Title="Minecraft 中文论坛" Margin="-5,0,15,0" IsHitTestVisible="False" Info="虽然已经关站了,但感谢此前提供了 MCBBS 镜像源……" Grid.Row="6" Grid.Column="1" />
+                    <local:MyListItem Title="PCL 内群的各位" Margin="-5,0,0,0" IsHitTestVisible="False" Grid.ColumnSpan="2" Info="感谢内群的沙雕网友们这么久以来对我和 PCL 的支持与鼓励!" Grid.Row="7" Grid.Column="1" />
+                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/bangbang93.png" Grid.Row="0" Margin="3">
+                        <Image.Clip>
+                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
+                        </Image.Clip>
+                    </Image>
+                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/wiki.png" Grid.Row="1" Margin="3">
+                        <Image.Clip>
+                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
+                        </Image.Clip>
+                    </Image>
+                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/z0z0r4.png" Grid.Row="2" Margin="3">
+                        <Image.Clip>
+                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
+                        </Image.Clip>
+                    </Image>
+                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/00ll00.png" Grid.Row="3" Margin="3">
+                        <Image.Clip>
+                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
+                        </Image.Clip>
+                    </Image>
+                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/Patrick.png" Grid.Row="4" Margin="3">
+                        <Image.Clip>
+                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
+                        </Image.Clip>
+                    </Image>
+                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/Hao_Tian.jpg" Grid.Row="5" Margin="3">
+                        <Image.Clip>
+                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
+                        </Image.Clip>
+                    </Image>
+                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/MCBBS.png" Grid.Row="6" Margin="3">
+                        <Image.Clip>
+                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
+                        </Image.Clip>
+                    </Image>
+                    <Image Source="/Plain Craft Launcher 2;component/Images/Heads/PCL2.png" Grid.Row="7" Margin="3">
+                        <Image.Clip>
+                            <EllipseGeometry Center="17 17" RadiusX="17" RadiusY="17" />
+                        </Image.Clip>
+                    </Image>
+                </Grid>
+            </local:MyCard>
+            <local:MyCard Margin="0,0,0,15" Title="赞助者">
+                <StackPanel Margin="25,40,10,20">
+                    <TextBlock HorizontalAlignment="Left" Text="以下是 2025 年 7 月的高级赞助者们!感谢各位对 PCL 和伟大的咕咕咕事业的支持!" Margin="0,0,25,5.5" TextTrimming="None" TextWrapping="WrapWithOverflow" />
+                    <WrapPanel Margin="0,0,0,10">
                        <TextBlock Width="120" Margin="0,1.5" Text="ZSF" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="TizhleF" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="方源" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="日月空呵" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="贾明志" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="百瑞" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Flying___pig" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="绝世" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Jwac" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="万玖" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="墨忆" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="天刹" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Cess" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="ender_glass" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="TT" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="白玄.雪狼" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="MUCT" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="崇昀" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="绪" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="吾皇万岁" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Ander·Les" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Eoctopus" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="时光飞逝一下午" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Carl7412" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="ShinyChariot" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="骨故谷" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="?" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Jinji希子" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="自然选择" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="云念" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="钱尹鹏" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="TBONC" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="祈农" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="凤凰院凶真" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="ShuangDaoRen" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="PXZ233" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="二十二今天有没有" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="天魕" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="南华清" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="66112447" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="夏行子" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="周俊成" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="乌漆嘛黑" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="肘击恶魔佐巴扬" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Pari~" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="红云" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Link-an" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="想要钱用不完" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="花宝" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="生于春天的雷电" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="被偷去的睡眠" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="liuxuan" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="寒枫凌" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="雀色时" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="架" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="终成究竟觉" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="S0D1UM" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="吞仔送命" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="白浪宇宙" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Crimson" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Mibo_MkIX" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="G.snine18^7" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="两把雨伞" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="古明地苑" />
+                        <TextBlock Width="240" Margin="0,1.5" Text="MarbleMionshevic" />
+                        <TextBlock Width="120" Margin="0,1.5" Text=":〈" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="紫罗兰" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="asai" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="隔壁小明" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="就爱唱歌" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="沫神鹤" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="风已消逝" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="光意留闪" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="我们长征的路上" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="芸芷" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="函数极限" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="冰川泥" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="XunWei" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="sirous" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="路过某打酱油的" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Gnight07" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="结构德古拉" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="myyukee" />
+                        <TextBlock Width="240" Margin="0,1.5" Text="云之彼端约定的地方" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="苏玖" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="赤沃净" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="YYC" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="晨曦酒庄高冷男" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="herald112" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Foxman" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="KoreQAQ" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="TechOfRevo" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="lqs" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="简某" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="源起于此" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="爱莉希雅" />
+                        <TextBlock Width="120" Margin="0,1.5" Text=" 和忧" />
+                        <TextBlock Width="240" Margin="0,1.5" Text="全明星小面包批发商DIO" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="碎序" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="U" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Dumlet" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="johnqian" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="KANG" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="owod" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="九" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="苑煜" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="壹" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="UA-Ming" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="可爱小探姬" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="霜月" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="bud" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="小虐SAIKYO" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="zealotand" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="comico" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="万山松" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="依梦明天" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="化形彧九尾" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="知崎" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="LOG175" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="绵" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="scp00813" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="宝宝" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="9527" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="ICE_xwx" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="羽笙喵喵" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="ssvgg(☉ x ☉)" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Happymeals" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="shen12244" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="一般路过AAA" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Niko" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="qroiwopqri" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="TringDron" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="有屳則名" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="TX2006" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="滑天下之大稽" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="中东悍匪" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="鬼泣々离殇" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="蒼崎青子" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="wyh114514" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="飞飞在睡觉。" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="柚西" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="XIAOSHUAI" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="saxioh" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="baibaibai" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="事屑Jerry" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Rs32" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="SPDish" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="风早九夜" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Reg" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="hellord" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="时本ki" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="mamana" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="放肆的微笑" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="人没逝" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="wddjww" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="xiao澄" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="银狼碎片" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="OniKata_Kayoko" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="曦" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Echo" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="画卿颜" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="夏 " />
+                        <TextBlock Width="120" Margin="0,1.5" Text="jiege45" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="甜食先生" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="虚莫妄玄" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="天恒" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="我有馄饨" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="布布曼" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="qwqewe" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="114514" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="YJ_42" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Xricron" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="抛弃大脑" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="10455885" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="羽渡白砂" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="沙" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="sukous" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="册那" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="KMYLS" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="kakadeso" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="懒猫" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="清岚" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Atopos" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="苦尽柑来" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="脑洞大开的血魔" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="ももかわるこ" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="空中的风" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="黑夜幽灵" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="H1saNe" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="故风" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="臭氧化碳" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="云阿云" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="小命" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="南宫若兮" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Landsilde" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="zzz" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="星期三" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Ashburn" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="123" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="九日" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="古神" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="月宫星耀" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="郁子恒是FW" />
+                        <TextBlock Width="240" Margin="0,1.5" Text="每天吃吃吃吃吃不饱" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Freezhao" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="ZHypocrite" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="十下小雨" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="九 十" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="RuthlessXdream" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="zv-vz" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="汐沄的随记" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="REMOTE" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="昔阳" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="七度ユキノ" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="KNISX" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="RainbowDashRD" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="夢曦" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="跳雨风" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="望言苏" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="四分白Fortenz" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="UUZ" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Ankairis" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Jn1E" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="云山如昨好" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="LYJ0415" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="空?" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="Awfrlu+" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="懒帝" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="北安丶七叔" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="xkw" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="KINO" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="POTATO" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="少昊氏" />
+                        <TextBlock Width="240" Margin="0,1.5" Text="狂踹瘸子那條好腿丶" />
+                        <TextBlock Width="240" Margin="0,1.5" Text="Thallium_Ash【铊尘】(坨坨)" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="陌雨泠涯" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="bajie79" />
+                        <TextBlock Width="120" Margin="0,1.5" Text="紘垰" />
+                    </WrapPanel>
+                    <Grid Height="35">
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
+                            <ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
+                            <ColumnDefinition Width="Auto" SharedSizeGroup="Button" />
+                        </Grid.ColumnDefinitions>
+                        <local:MyButton x:Name="BtnDonateOutput" Grid.Column="0" MinWidth="140" Text="生成解锁码" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" ColorType="Highlight" Visibility="Collapsed" />
+                        <local:MyButton x:Name="BtnDonateDonate" Grid.Column="0" MinWidth="140" Text="赞助作者" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" ColorType="Highlight" EventType="打开网页" EventData="https://afdian.com/a/LTCat" />
+                        <local:MyButton x:Name="BtnDonateCopy" Grid.Column="1" MinWidth="140" Text="复制识别码" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" />
+                        <local:MyButton x:Name="BtnDonateInput" Grid.Column="2" MinWidth="140" Text="输入解锁码" Padding="13,0" Margin="0,0,20,0" HorizontalAlignment="Left" />
+                    </Grid>
+                </StackPanel>
+            </local:MyCard>
+            <local:MyCard Margin="0,0,0,15" Title="法律信息" IsSwapped="True" CanSwap="True">
+                <StackPanel Margin="25,39,23,20">
+                    <TextBlock Text="匿名数据收集" TextWrapping="Wrap" Margin="0,6,0,4" FontWeight="Bold" />
+                    <TextBlock Margin="0,0,0,2" LineHeight="17" Text="当下载失败、PCL 出错、游戏崩溃等事件时,PCL 会匿名上报信息,以通知龙猫 “哦吼,出错了”,让龙猫能更好地修 Bug……(PCL 不会上传或收集任何个人信息,包括上报的东西里面也没有!)&#xa;你可以在 设置 → 其他 → 启动器 中关闭上报,不过龙猫就不知道你遇到了什么 Bug 了……" TextWrapping="Wrap" />
+                    <TextBlock Text="隐私声明与个人信息保护政策" TextWrapping="Wrap" Margin="0,10,0,4" FontWeight="Bold" />
+                    <TextBlock Margin="0,0,0,2" LineHeight="17" Text="PCL 没有收集个人信息,所以这里其实啥都不用写……&#xa;留个这个其实只是为了让你知道 PCL 没有收集个人信息,诶嘿。" TextWrapping="Wrap" />
+                    <TextBlock Text="其他信息" TextWrapping="Wrap" Margin="0,10,0,4" FontWeight="Bold" />
+                    <TextBlock Margin="0,0,0,2" LineHeight="17" Text="Copyright © 龙腾猫跃 2016. All Rights Reserved.&#13;计算机软件著作权登记号:2020SR0875133&#13;违法违规行为举报投诉邮箱:[email protected]&#13;非 MINECRAFT 官方产品。未经 MOJANG 或 MICROSOFT 批准,也不与 MOJANG 或 MICROSOFT 关联。" TextWrapping="Wrap" />
+                    <StackPanel Orientation="Horizontal" Height="35" HorizontalAlignment="Left" Margin="0,12,0,0">
+                        <local:MyButton Text="用户协议与免责声明" Width="170" Padding="13,0" Margin="0,0,20,0" ColorType="Highlight" EventType="打开网页" EventData="https://shimo.im/docs/rGrd8pY8xWkt6ryW" />
+                        <local:MyButton Text="开源代码" Width="140" Padding="13,0" EventType="打开网页" EventData="https://github.com/Hex-Dragon/PCL2" />
+                    </StackPanel>
+                </StackPanel>
+            </local:MyCard>
+            <local:MyCard Margin="0,0,0,15" Title="许可与版权声明" IsSwapped="True" CanSwap="True">
+                <Grid Margin="25,42,23,4">
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="Auto" />
+                        <ColumnDefinition Width="20" />
+                        <ColumnDefinition Width="Auto" />
+                        <ColumnDefinition />
+                    </Grid.ColumnDefinitions>
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="60" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="60" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="60" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="60" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="60" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="60" />
+                        <RowDefinition Height="Auto" />
+                        <RowDefinition Height="60" />
+                        <RowDefinition Height="Auto" />
+                    </Grid.RowDefinitions>
+                    <TextBlock Grid.Row="0" Grid.Column="0" Text="Java Launch Wrapper" TextWrapping="Wrap" FontWeight="Bold" />
+                    <TextBlock Grid.Row="0" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2022 00ll00&#xa;Licensed under the MIT License." TextWrapping="Wrap" />
+                    <local:MyButton Grid.Row="1" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://github.com/00ll00/java_launch_wrapper" />
+                    <local:MyButton Grid.Row="1" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://github.com/00ll00/java_launch_wrapper?tab=MIT-1-ov-file#readme" />
+
+                    <TextBlock Grid.Row="2" Grid.Column="0" Text="Newtonsoft.Json" TextWrapping="Wrap" FontWeight="Bold" />
+                    <TextBlock Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2007 James Newton-King&#xa;Licensed under the MIT License." TextWrapping="Wrap" />
+                    <local:MyButton Grid.Row="3" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://www.newtonsoft.com/json" />
+                    <local:MyButton Grid.Row="3" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://opensource.org/licenses/MIT" />
+                    
+                    <TextBlock Grid.Row="4" Grid.Column="0" Text="NAudio" TextWrapping="Wrap" FontWeight="Bold" />
+                    <TextBlock Grid.Row="4" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2015 Mark Heath ([email protected])&#xa;Licensed under the MIT License." TextWrapping="Wrap" />
+                    <local:MyButton Grid.Row="5" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://github.com/naudio/NAudio" />
+                    <local:MyButton Grid.Row="5" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left" 
+                                    EventType="打开网页" EventData="https://github.com/naudio/NAudio/blob/master/license.txt" />
+                    
+                    <TextBlock Grid.Row="6" Grid.Column="0" Text="Ookii.Dialogs" TextWrapping="Wrap" FontWeight="Bold" />
+                    <TextBlock Grid.Row="6" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2009 Sven Groot (Ookii.org)" TextWrapping="Wrap" />
+                    <local:MyButton Grid.Row="7" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://www.ookii.org/Software/Dialogs/" />
+                    <local:MyButton Grid.Row="7" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://github.com/caioproiete/ookii-dialogs-wpf/blob/master/LICENSE" />
+                    
+                    <TextBlock Grid.Row="8" Grid.Column="0" Text="Iconmonstr" TextWrapping="Wrap" FontWeight="Bold" />
+                    <TextBlock Grid.Row="8" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2019 iconmonstr (Alexander Kahlkopf)" TextWrapping="Wrap" />
+                    <local:MyButton Grid.Row="9" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://iconmonstr.com/" />
+                    <local:MyButton Grid.Row="9" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://iconmonstr.com/license/" />
+                    
+                    <TextBlock Grid.Row="10" Grid.Column="0" Text="libwebp wrapper for .NET" TextWrapping="Wrap" FontWeight="Bold" />
+                    <TextBlock Grid.Row="10" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © 2012 Imazen&#xa;Licensed under the MIT License." TextWrapping="Wrap" />
+                    <local:MyButton Grid.Row="11" Grid.Column="2" MinWidth="140" Text="查看来源网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://github.com/imazen/libwebp-net" />
+                    <local:MyButton Grid.Row="11" Grid.Column="3" MinWidth="140" Text="查看许可文档" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://github.com/imazen/libwebp-net/blob/master/LICENSE.txt" />
+
+                    <TextBlock Grid.Row="12" Grid.Column="0" Text="Iconfont" TextWrapping="Wrap" FontWeight="Bold" />
+                    <TextBlock Grid.Row="12" Grid.Column="2" Grid.ColumnSpan="2" Text="Copyright © ALIMAMA MUX, powered by alimama THX." TextWrapping="Wrap" />
+                    <local:MyButton Grid.Row="13" Grid.Column="2" MinWidth="140" Text="查看原网站" Padding="13,0" Margin="0,7,20,18" HorizontalAlignment="Left"
+                                    EventType="打开网页" EventData="https://www.iconfont.cn/" />
+
+                </Grid>
+            </local:MyCard>
+        </StackPanel>
+    </local:MyScrollViewer>
+</local:MyPageRight>

+ 0 - 6
Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml.vb

@@ -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

+ 2 - 8
Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb

@@ -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>
     ''' 读取设置。
     ''' 读取设置。

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

@@ -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=""

+ 17 - 11
Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml

@@ -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>-->
-                        <TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="文件名格式" Margin="0,0,25,0" />
-                        <local:MyComboBox Grid.Row="0" x:Name="ComboDownloadTranslateV2" Grid.ColumnSpan="2" Tag="ToolDownloadTranslateV2" Grid.Column="1" 
+                        </local:MyComboBox>
+                        <TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="文件名格式" Margin="0,0,25,0" />
+                        <local:MyComboBox Grid.Row="2" x:Name="ComboDownloadTranslateV2" Grid.ColumnSpan="2" Tag="ToolDownloadTranslateV2" Grid.Column="1" 
                                           ToolTip="下载社区资源时,其默认文件名的格式">
                                           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" />
-                        <local:MyComboBox Grid.Row="2" x:Name="ComboModLocalNameStyle" Grid.ColumnSpan="2" Tag="ToolModLocalNameStyle" Grid.Column="1" 
+                        <TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="Mod 管理样式" Margin="0,0,25,0" />
+                        <local:MyComboBox Grid.Row="4" x:Name="ComboModLocalNameStyle" Grid.ColumnSpan="2" Tag="ToolModLocalNameStyle" Grid.Column="1" 
                                           ToolTip="在 Mod 管理页面中,Mod 项的显示方式">
                                           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" />

+ 5 - 3
Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb

@@ -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

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

@@ -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"
@@ -236,4 +236,4 @@
                 LogoScale="0.9" Logo="M73 584L920 584 608 896C579 925 579 972 608 1001 637 1030 683 1030 712 1001L1149 565C1164 550 1170 531 1170 511 1170 492 1164 472 1149 457L712 21C683-7 637-7 608 21 579 50 579 97 608 126L920 438 73 438C33 438 0 471 0 511 0 551 33 584 73 584Z" />
                 LogoScale="0.9" Logo="M73 584L920 584 608 896C579 925 579 972 608 1001 637 1030 683 1030 712 1001L1149 565C1164 550 1170 531 1170 511 1170 492 1164 472 1149 457L712 21C683-7 637-7 608 21 579 50 579 97 608 126L920 438 73 438C33 438 0 471 0 511 0 551 33 584 73 584Z" />
         </StackPanel>
         </StackPanel>
     </local:MyScrollViewer>
     </local:MyScrollViewer>
-</local:MyPageRight>
+</local:MyPageRight>

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

@@ -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 选择"

+ 4 - 0
Plain Craft Launcher 2/Resources/Custom.xaml

@@ -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>
 
 

BIN
Plain Craft Launcher 2/Resources/Help.zip