龙腾猫跃 10 ay önce
ebeveyn
işleme
085af160a1
78 değiştirilmiş dosya ile 5692 ekleme ve 3983 silme
  1. 1 1
      Plain Craft Launcher 2/Application.xaml.vb
  2. 11 6
      Plain Craft Launcher 2/Controls/Behaviors/ClipboardInterceptor.vb
  3. 47 0
      Plain Craft Launcher 2/Controls/Behaviors/LazyLoadBehavior.vb
  4. 19 26
      Plain Craft Launcher 2/Controls/MyCard.vb
  5. 1 1
      Plain Craft Launcher 2/Controls/MyHint.xaml.vb
  6. 10 18
      Plain Craft Launcher 2/Controls/MyImage.vb
  7. 2 1
      Plain Craft Launcher 2/Controls/MyListItem.xaml.vb
  8. 3 1
      Plain Craft Launcher 2/Controls/MyMsg/MyMsgSelect.xaml.vb
  9. 1 0
      Plain Craft Launcher 2/Controls/MyPageLeft.vb
  10. 3 3
      Plain Craft Launcher 2/Controls/MyPageRight.vb
  11. 70 0
      Plain Craft Launcher 2/Controls/MyVirtualizingElement.vb
  12. 67 52
      Plain Craft Launcher 2/FormMain.xaml.vb
  13. 1 1
      Plain Craft Launcher 2/Modules/Base/ModAnimation.vb
  14. 83 23
      Plain Craft Launcher 2/Modules/Base/ModBase.vb
  15. 244 190
      Plain Craft Launcher 2/Modules/Base/ModNet.vb
  16. 18 15
      Plain Craft Launcher 2/Modules/Base/MyBitmap.vb
  17. 166 148
      Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb
  18. 7 7
      Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb
  19. 159 120
      Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb
  20. 50 59
      Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb
  21. 205 217
      Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
  22. 374 335
      Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb
  23. 92 489
      Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb
  24. 74 75
      Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb
  25. 9 9
      Plain Craft Launcher 2/Modules/Minecraft/ModWatcher.vb
  26. 31 6
      Plain Craft Launcher 2/Modules/ModEvent.vb
  27. 17 17
      Plain Craft Launcher 2/Modules/ModMain.vb
  28. 3 3
      Plain Craft Launcher 2/Modules/ModSecret.vb
  29. 2 2
      Plain Craft Launcher 2/My Project/AssemblyInfo.vb
  30. 10 0
      Plain Craft Launcher 2/My Project/Resources.Designer.vb
  31. 3 0
      Plain Craft Launcher 2/My Project/Resources.resx
  32. 18 28
      Plain Craft Launcher 2/Pages/PageDownload/Comp/MyCompItem.xaml.vb
  33. 1 3
      Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml
  34. 25 18
      Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml.vb
  35. 80 67
      Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml.vb
  36. 2 1
      Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadMod.xaml
  37. 267 260
      Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb
  38. 200 331
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb
  39. 1 1
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb
  40. 0 0
      Plain Craft Launcher 2/Pages/PageInstance/MyLocalModItem.xaml
  41. 108 110
      Plain Craft Launcher 2/Pages/PageInstance/MyLocalModItem.xaml.vb
  42. 3 3
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml
  43. 26 32
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.vb
  44. 1 1
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceLeft.xaml
  45. 25 25
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceLeft.xaml.vb
  46. 1 3
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceMod.xaml
  47. 39 100
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceMod.xaml.vb
  48. 1 1
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceModDisabled.xaml
  49. 2 2
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceModDisabled.xaml.vb
  50. 2 2
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceOverall.xaml
  51. 76 78
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceOverall.xaml.vb
  52. 1 1
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml
  53. 73 73
      Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml.vb
  54. 3 3
      Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb
  55. 68 69
      Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb
  56. 6 0
      Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb
  57. 4 4
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuth.xaml.vb
  58. 2 2
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginAuthSkin.xaml.vb
  59. 2 2
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb
  60. 2 2
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNide.xaml.vb
  61. 2 2
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginNideSkin.xaml.vb
  62. 1 0
      Plain Craft Launcher 2/Pages/PageLink/PageLinkMain.xaml
  63. 2 3
      Plain Craft Launcher 2/Pages/PageLink/PageLinkMain.xaml.vb
  64. 2515 561
      Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml
  65. 1 1
      Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb
  66. 43 43
      Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb
  67. 56 58
      Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb
  68. 71 72
      Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb
  69. 2 2
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml
  70. 13 13
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb
  71. 0 2
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml
  72. 0 5
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml.vb
  73. 5 3
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml
  74. 5 5
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb
  75. 30 42
      Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj
  76. BIN
      Plain Craft Launcher 2/Resources/Help.zip
  77. 124 124
      Plain Craft Launcher 2/Resources/ModData.txt
  78. BIN
      Plain Craft Launcher 2/Resources/System.ValueTuple.dll

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

@@ -198,7 +198,7 @@ WaitRetry:
     Private Declare Function SetDllDirectory Lib "kernel32" Alias "SetDllDirectoryA" (lpPathName As String) As Boolean
     Public Shared Function AssemblyResolve(sender As Object, Args As ResolveEventArgs) As Assembly
         '缓存
-        Static Prefixes As String() = {"NAudio", "Newtonsoft.Json", "Ookii.Dialogs.Wpf", "Imazen.WebP", "CacheCow.Common", "CacheCow.Client.FileStore", "CacheCow.Client", "System.Net.Http.Formatting"}
+        Static Prefixes As String() = {"NAudio", "Newtonsoft.Json", "Ookii.Dialogs.Wpf", "Imazen.WebP", "CacheCow.Common", "CacheCow.Client.FileStore", "CacheCow.Client", "System.Net.Http.Formatting", "System.ValueTuple"}
         Static Locks As New Dictionary(Of String, Object)(StringComparer.Ordinal)
         Static LoadedAssembly As New Dictionary(Of String, Assembly)(StringComparer.Ordinal)
         '查找对应的 DLL

+ 11 - 6
Plain Craft Launcher 2/Controls/Behaviors/ClipboardInterceptor.vb

@@ -35,7 +35,7 @@ Namespace Controls.Behaviors
         End Sub
 
         Public Shared Function GetEnableSafeClipboard(element As DependencyObject) As Boolean
-            Return CBool(element.GetValue(EnableSafeClipboardProperty))
+            Return element.GetValue(EnableSafeClipboardProperty)
         End Function
 
         Private Shared Sub OnEnableSafeClipboardChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
@@ -97,6 +97,10 @@ Namespace Controls.Behaviors
 
             If Forms.Clipboard.ContainsText() Then
                 Dim pasteText = Forms.Clipboard.GetText()
+
+                '将换行符替换为空格(#7825)
+                If Not tb.AcceptsReturn Then pasteText = pasteText.Replace(vbCrLf, " ").Replace(vbCr, " ").Replace(vbLf, " ")
+
                 Dim start = tb.SelectionStart
 
                 tb.SelectedText = pasteText
@@ -162,14 +166,15 @@ Namespace Controls.Behaviors
             Dim dg = TryCast(sender, DataGrid)
             If dg Is Nothing OrElse dg.SelectedCells Is Nothing OrElse dg.SelectedCells.Count = 0 Then Return
 
-            Dim sb = New System.Text.StringBuilder()
+            Dim sb = New StringBuilder
             Dim rowGroups = dg.SelectedCells.GroupBy(Function(c) c.Item)
 
             For Each row In rowGroups
-                Dim rowText = String.Join(vbTab, row.Select(Function(cell)
-                                                                Dim tb = TryCast(cell.Column.GetCellContent(cell.Item), TextBlock)
-                                                                Return If(tb IsNot Nothing, tb.Text, "")
-                                                            End Function))
+                Dim rowText = String.Join(vbTab, row.Select(
+                Function(cell)
+                    Dim tb = TryCast(cell.Column.GetCellContent(cell.Item), TextBlock)
+                    Return If(tb IsNot Nothing, tb.Text, "")
+                End Function))
                 sb.AppendLine(rowText)
             Next
 

+ 47 - 0
Plain Craft Launcher 2/Controls/Behaviors/LazyLoadBehavior.vb

@@ -0,0 +1,47 @@
+Public Module LazyLoadBehavior
+
+    ''' <summary>
+    ''' 指定首次进入 ScrollViewer 的可视范围时执行的操作。
+    ''' </summary>
+    <Runtime.CompilerServices.Extension()>
+    Public Sub OnFirstEnterScrollViewerViewport(obj As DependencyObject, value As Action)
+        obj.SetValue(IsInViewportProperty, value)
+    End Sub
+
+    Private ReadOnly IsInViewportProperty As DependencyProperty =
+        DependencyProperty.RegisterAttached("IsInViewport", GetType(Action), GetType(LazyLoadBehavior),
+        New PropertyMetadata(Nothing, AddressOf OnIsInViewportChanged))
+
+    Private Sub OnIsInViewportChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
+        Dim Element = TryCast(d, FrameworkElement)
+        If Element Is Nothing OrElse e.NewValue Is Nothing Then Return
+
+        Dim Handled As Boolean = False
+        Dim Handler As EventHandler =
+        Sub()
+            If Handled Then Return
+            '判断元素是否可见
+            If Element.RenderSize.Width < Double.Epsilon Then Return
+            If Not Element.IsVisible Then Return
+            '判断是否在 ScrollViewer 的可视区域内
+            Dim Scroll = FindParentScrollViewer(Element)
+            If Scroll Is Nothing Then Return
+            If Not New Rect(0, 0, Scroll.ViewportWidth, Scroll.ViewportHeight).IntersectsWith(
+               Element.TransformToAncestor(Scroll).TransformBounds(New Rect(New Point(0, 0), Element.RenderSize))) Then Return
+            '执行
+            Handled = True
+            CType(e.NewValue, Action).Invoke()
+            RemoveHandler Element.LayoutUpdated, Handler
+        End Sub
+        AddHandler Element.LayoutUpdated, Handler
+    End Sub
+
+    Private Function FindParentScrollViewer(d As DependencyObject) As ScrollViewer
+        While d IsNot Nothing
+            If TypeOf d Is ScrollViewer Then Return CType(d, ScrollViewer)
+            d = VisualTreeHelper.GetParent(d)
+        End While
+        Return Nothing
+    End Function
+
+End Module

+ 19 - 26
Plain Craft Launcher 2/Controls/MyCard.vb

@@ -92,6 +92,7 @@
         '改变默认的折叠
         If IsSwapped AndAlso SwapControl IsNot Nothing Then
             MainSwap.RenderTransform = New RotateTransform(If(SwapLogoRight, 270, 0))
+            SwapControl.Visibility = Visibility.Collapsed
             '取消由于高度变化被迫触发的高度动画
             Dim RawUseAnimation As Boolean = UseAnimation
             UseAnimation = False
@@ -109,17 +110,21 @@
         '这一部分的代码是好几年前留下的究极屎坑,当时还不知道该咋正确调用这种方法,就写了这么一坨屎
         '但是现在……反正勉强能用……懒得改了就这样吧.jpg
         '别骂了别骂了.jpg
-        If IsNothing(Stack.Tag) Then Return
+        If Stack.Tag Is Nothing Then Return
         '排序
+        Dim HasDuplicates As Boolean = False
         Select Case Type
             Case 3
-                Stack.Tag = CType(Stack.Tag, List(Of DlOptiFineListEntry)).Sort(Function(a, b) VersionSortBoolean(a.NameDisplay, b.NameDisplay))
+                Stack.Tag = CType(Stack.Tag, List(Of DlOptiFineListEntry)).SortByComparison(Function(a, b) CompareVersionGE(a.DisplayName, b.DisplayName))
             Case 4, 10
-                Stack.Tag = CType(Stack.Tag, List(Of DlLiteLoaderListEntry)).Sort(Function(a, b) VersionSortBoolean(a.Inherit, b.Inherit))
+                Stack.Tag = CType(Stack.Tag, List(Of DlLiteLoaderListEntry)).SortByComparison(Function(a, b) CompareVersionGE(a.Inherit, b.Inherit))
             Case 6
-                Stack.Tag = CType(Stack.Tag, List(Of DlForgeVersionEntry)).Sort(Function(a, b) a.Version > b.Version)
+                Stack.Tag = CType(Stack.Tag, List(Of DlForgeVersionEntry)).OrderByDescending(Function(a) a).ToList
             Case 8, 9
-                Stack.Tag = CType(Stack.Tag, List(Of CompFile)).Sort(Function(a, b) a.ReleaseDate > b.ReleaseDate)
+                Stack.Tag = CType(Stack.Tag, List(Of CompFile)).SortByComparison(Function(a, b) a.ReleaseDate > b.ReleaseDate)
+                HasDuplicates =
+                    CType(Stack.Tag, List(Of CompFile)).Distinct(Function(a, b) a.DisplayName = b.DisplayName).Count <>
+                    CType(Stack.Tag, List(Of CompFile)).Count
         End Select
         '控件转换
         Select Case Type
@@ -132,9 +137,7 @@
         For Each Data As Object In Stack.Tag
             Select Case Type
                 Case 0
-                    Dim VersionItem As MyListItem = CType(Data, McVersion).ToListItem
-                    VersionItem.ContentHandler = AddressOf PageSelectRight.McVersionListContent
-                    Stack.Children.Add(VersionItem)
+                    Stack.Children.Add(CType(Data, McInstance).ToListItem(AddressOf PageSelectRight.McInstanceListContent))
                 Case 2
                     Stack.Children.Add(McDownloadListItem(Data, AddressOf McDownloadMenuSave, True))
                 Case 3
@@ -145,23 +148,13 @@
                     '不能使用 AddressOf,这导致了 #535,原因完全不明,疑似是编译器 Bug
                     Stack.Children.Add(McDownloadListItem(Data, Sub(sender, e) FrmDownloadInstall.MinecraftSelected(sender, e), False))
                 Case 8
-                    If CType(Stack.Tag, List(Of CompFile)).Distinct(Function(a, b) a.DisplayName = b.DisplayName).Count <>
-                       CType(Stack.Tag, List(Of CompFile)).Count Then
-                        '存在重复的名称(#1344)
-                        Stack.Children.Add(CType(Data, CompFile).ToListItem(AddressOf FrmDownloadCompDetail.Save_Click, BadDisplayName:=True))
-                    Else
-                        '不存在重复的名称,正常加载
-                        Stack.Children.Add(CType(Data, CompFile).ToListItem(AddressOf FrmDownloadCompDetail.Save_Click))
-                    End If
+                    '若存在重复的版本名,则显示文件名而非版本名(#1344)
+                    Stack.Children.Add(CType(Data, CompFile).ToListItem(
+                        AddressOf FrmDownloadCompDetail.Save_Click, BadDisplayName:=HasDuplicates))
                 Case 9
-                    If CType(Stack.Tag, List(Of CompFile)).Distinct(Function(a, b) a.DisplayName = b.DisplayName).Count <>
-                       CType(Stack.Tag, List(Of CompFile)).Count Then
-                        '存在重复的名称(#1344)
-                        Stack.Children.Add(CType(Data, CompFile).ToListItem(AddressOf FrmDownloadCompDetail.Install_Click, AddressOf FrmDownloadCompDetail.Save_Click, BadDisplayName:=True))
-                    Else
-                        '不存在重复的名称,正常加载
-                        Stack.Children.Add(CType(Data, CompFile).ToListItem(AddressOf FrmDownloadCompDetail.Install_Click, AddressOf FrmDownloadCompDetail.Save_Click))
-                    End If
+                    '若存在重复的版本名,则显示文件名而非版本名(#1344)
+                    Stack.Children.Add(CType(Data, CompFile).ToListItem(
+                        AddressOf FrmDownloadCompDetail.Install_Click, AddressOf FrmDownloadCompDetail.Save_Click, BadDisplayName:=HasDuplicates))
                 Case 10
                     Stack.Children.Add(LiteLoaderDownloadListItem(Data, AddressOf LiteLoaderSave_Click, True))
                 Case 11
@@ -268,7 +261,7 @@
         Height = PreviousHeight
     End Sub
     ''' <summary>
-    ''' 通知 MyCard,控件内容已改变,需要中断动画并更新高度。
+    ''' 通知 MyCard,控件内容已改变,需要中断动画并瞬间更新高度。
     ''' </summary>
     Public Sub TriggerForceResize()
         Height = If(IsSwapped, SwapedHeight, Double.NaN)
@@ -282,7 +275,7 @@
 
     '若设置了 CanSwap,或 SwapControl 不为空,则判定为会进行折叠
     '这是因为不能直接在 XAML 中设置 SwapControl
-    Public SwapControl As Object
+    Public SwapControl As FrameworkElement
     Public Property CanSwap As Boolean = False
     ''' <summary>
     ''' 被折叠的种类,用于控件虚拟化。

+ 1 - 1
Plain Craft Launcher 2/Controls/MyHint.xaml.vb

@@ -102,7 +102,7 @@ Public Class MyHint
         If CanClose AndAlso Setup.Get(RelativeSetup) Then Visibility = Visibility.Collapsed
     End Sub
     Private Sub BtnClose_Click(sender As Object, e As EventArgs) Handles BtnClose.Click
-        Setup.Set(RelativeSetup, True)
+        Setup.SetSafe(RelativeSetup, True)
         AniDispose(Me, False)
     End Sub
 

+ 10 - 18
Plain Craft Launcher 2/Controls/MyImage.vb

@@ -85,8 +85,8 @@
             If _ActualSource = value Then Return
             _ActualSource = value
             Try
-                Dim Bitmap As MyBitmap = If(value Is Nothing, Nothing, New MyBitmap(value)) '在这里先触发可能的文件读取,尽量避免在 UI 线程中读取文件
-                RunInUiWait(Sub() MyBase.Source = Bitmap)
+                Dim Bitmap As ImageSource = If(value Is Nothing, Nothing, New MyBitmap(value)) '在这里先触发可能的文件读取,尽量避免在 UI 线程中读取文件
+                RunInUi(Sub() MyBase.Source = Bitmap)
             Catch ex As Exception
                 Log(ex, $"加载图片失败({value})")
                 Try
@@ -112,29 +112,24 @@
         End If
         '从缓存加载网络图片
         Dim EnableCache As Boolean = Me.EnableCache
-        Dim TempPath As String = GetTempPath(Source) & If(EnableCache, "", GetUuid()) '不启用缓存时加上随机字符串,避免冲突
+        Dim TempPath As String = $"{PathTemp}MyImage\{GetHash(Source)}.png{If(EnableCache, "", GetUuid())}" '不启用缓存时在末尾加上随机字符串,避免冲突
         Dim TempFile As New FileInfo(TempPath)
         If EnableCache AndAlso TempFile.Exists Then
-            ActualSource = TempPath
+            ActualSource = TempPath '显示缓存的图片
             If (Date.Now - TempFile.LastWriteTime) < FileCacheExpiredTime Then Return '无需刷新缓存
+        Else
+            ActualSource = LoadingSource '显示加载中图片
         End If
         RunInNewThread(
         Sub()
             Dim IsLocalFallback As Boolean = Not String.IsNullOrEmpty(FallbackSource) AndAlso Not FallbackSource.StartsWithF("http")
             Try
                 '下载
-                ActualSource = LoadingSource '显示加载中的占位图片
                 NetDownloadByLoader(
-                    If(FallbackSource?.StartsWithF("http"), {Source, FallbackSource}, {Source}),
+                    If(FallbackSource?.StartsWithF("http") AndAlso Source <> FallbackSource, {Source, FallbackSource}, {Source}),
                     TempPath, SimulateBrowserHeaders:=True)
-                If EnableCache Then
-                    '保存缓存并显示
-                    RunInUi(Sub() ActualSource = TempPath)
-                Else
-                    '直接显示
-                    RunInUiWait(Sub() ActualSource = TempPath)
-                    File.Delete(TempPath)
-                End If
+                ActualSource = TempPath
+                If Not EnableCache Then File.Delete(TempPath)
             Catch ex As Exception
                 Try
                     If TempPath IsNot Nothing Then File.Delete(TempPath)
@@ -143,7 +138,7 @@
                 '加载本地备用图片
                 If IsLocalFallback Then
                     Try
-                        RunInUiWait(Sub() ActualSource = FallbackSource)
+                        ActualSource = FallbackSource
                         Log(ex, $"下载图片失败,使用本地备用图片({Source})")
                         Return
                     Catch exx As Exception
@@ -156,8 +151,5 @@
             End Try
         End Sub, "MyImage PicLoader " & GetUuid() & "#", ThreadPriority.BelowNormal)
     End Sub
-    Public Shared Function GetTempPath(Url As String) As String
-        Return $"{PathTemp}MyImage\{GetHash(Url)}.png"
-    End Function
 
 End Class

+ 2 - 1
Plain Craft Launcher 2/Controls/MyListItem.xaml.vb

@@ -396,6 +396,7 @@ Public Class MyListItem
                 Dim CheckedCount As Integer = 0
                 '收集控件列表与选中个数
                 For Each Control In CType(Parent, Object).Children
+                    Control = MyVirtualizingElement.TryInit(Control)
                     If TypeOf Control Is MyListItem AndAlso CType(Control, MyListItem).Type = CheckType.RadioBox Then
                         RadioboxList.Add(Control)
                         If Control.Checked Then CheckedCount += 1
@@ -544,7 +545,7 @@ Public Class MyListItem
     Public Sub RefreshColor(sender As Object, e As EventArgs) Handles Me.MouseEnter, Me.MouseLeave, Me.MouseLeftButtonDown, Me.MouseLeftButtonUp
         '菜单虚拟化检测
         If ContentHandler IsNot Nothing Then
-            ContentHandler(sender, e)
+            ContentHandler(Me, e)
             ContentHandler = Nothing
         End If
         '判断当前颜色

+ 3 - 1
Plain Craft Launcher 2/Controls/MyMsg/MyMsgSelect.xaml.vb

@@ -21,7 +21,9 @@
             ShapeLine.StrokeThickness = GetWPFSize(1)
             '添加选择控件
             Btn1.IsEnabled = False
-            For Each Selection As IMyRadio In Converter.Content
+            For Each Content In Converter.Content
+                Content = MyVirtualizingElement.TryInit(Content)
+                Dim Selection As IMyRadio = Content
                 PanSelection.Children.Add(Selection)
                 AddHandler Selection.Check, AddressOf OnChecked
                 If TypeOf Selection Is MyListItem Then

+ 1 - 0
Plain Craft Launcher 2/Controls/MyPageLeft.vb

@@ -30,6 +30,7 @@
             Dim AniList As New List(Of AniData)
             Dim Id As Integer = 0, Delay As Integer = 0
             For Each Element As FrameworkElement In GetAllAnimControls(True)
+                Element = MyVirtualizingElement.TryInit(Element)
                 If Element.Visibility = Visibility.Collapsed Then
                     '还原之前的隐藏动画可能导致的改变(#2436)
                     Element.Opacity = 1

+ 3 - 3
Plain Craft Launcher 2/Controls/MyPageRight.vb

@@ -135,7 +135,7 @@
                     TriggerEnterAnimation(PanAlways, If(PanContent, Child))
                 ElseIf PageLoader.State = LoadState.Loading Then
                     PageState = PageStates.LoaderWait
-                    AniStart(AaCode(AddressOf PageOnLoaderWaitFinished, 200), "PageRight PageChange " & PageUuid)
+                    AniStart(AaCode(AddressOf PageOnLoaderWaitFinished, 400), "PageRight PageChange " & PageUuid)
                 Else 'PageLoader.State = LoadState.Failed
                     PageState = PageStates.LoaderEnter
                     TriggerEnterAnimation(PanAlways, PanLoader)
@@ -147,7 +147,7 @@
                     TriggerEnterAnimation(If(PanContent, Child))
                 ElseIf PageLoader.State = LoadState.Loading Then
                     PageState = PageStates.LoaderWait
-                    AniStart(AaCode(AddressOf PageOnLoaderWaitFinished, 200), "PageRight PageChange " & PageUuid)
+                    AniStart(AaCode(AddressOf PageOnLoaderWaitFinished, 400), "PageRight PageChange " & PageUuid)
                 Else 'PageLoader.State = LoadState.Failed
                     PageState = PageStates.LoaderEnter
                     TriggerEnterAnimation(PanLoader)
@@ -378,7 +378,7 @@
         End If
         '结束
         AniList.Add(AaCode(Sub() PageOnEnterAnimationFinished(),, True))
-        AniStart(AniList, "PageRight PageChange " & PageUuid)
+        AniStart(AniList, "PageRight PageChange " & PageUuid, True)
     End Sub
 
     '逐个退出动画

+ 70 - 0
Plain Craft Launcher 2/Controls/MyVirtualizingElement.vb

@@ -0,0 +1,70 @@
+Public Class MyVirtualizingElement(Of T As FrameworkElement)
+    Inherits FrameworkElement
+
+    Private Initializer As Func(Of T)
+    Public Sub New(Initializer As Func(Of T))
+        Me.Initializer = Initializer
+        OnFirstEnterScrollViewerViewport(AddressOf Init)
+    End Sub
+
+    ''' <summary>
+    ''' 实例化此控件。
+    ''' </summary>
+    Public Function Init() As T
+        Dim Element As T = Initializer()
+        If Parent IsNot Nothing Then
+            If TypeOf Parent IsNot Panel Then Throw New Exception("MyVirtualizingElement 的父级必须是一个 Panel")
+            Dim ParentPanel As Panel = Parent
+            Dim CurrentIndex As Integer = ParentPanel.Children.IndexOf(Me)
+            ParentPanel.Children.RemoveAt(CurrentIndex)
+            ParentPanel.Children.Insert(CurrentIndex, Element)
+        End If
+        Return Element
+    End Function
+    Public Shared Widening Operator CType(Virtualized As MyVirtualizingElement(Of T)) As T
+        Return Virtualized.Init()
+    End Operator
+
+End Class
+
+'非泛型形式
+Public Class MyVirtualizingElement
+    Inherits FrameworkElement
+
+    Private Initializer As Func(Of FrameworkElement)
+    Public Sub New(Initializer As Func(Of FrameworkElement))
+        Me.Initializer = Initializer
+        OnFirstEnterScrollViewerViewport(AddressOf Init)
+    End Sub
+
+    ''' <summary>
+    ''' 实例化此控件。
+    ''' </summary>
+    Public Function Init() As FrameworkElement
+        Dim Element As FrameworkElement = Initializer()
+        If Parent IsNot Nothing Then
+            If TypeOf Parent IsNot Panel Then Throw New Exception("MyVirtualizingElement 的父级必须是一个 Panel")
+            Dim ParentPanel As Panel = Parent
+            Dim CurrentIndex As Integer = ParentPanel.Children.IndexOf(Me)
+            ParentPanel.Children.RemoveAt(CurrentIndex)
+            ParentPanel.Children.Insert(CurrentIndex, Element)
+        End If
+        Return Element
+    End Function
+
+    ''' <summary>
+    ''' 获取实例化后的控件。
+    ''' 如果该控件没有实例化,则会立即实例化。
+    ''' 如果类型错误,则返回原值。
+    ''' </summary>
+    Public Shared Function TryInit(Element As FrameworkElement) As FrameworkElement
+        If GetType(MyVirtualizingElement(Of )).IsInstanceOfGenericType(Element) Then
+            Return CType(Element, Object).Init()
+        ElseIf TypeOf Element Is MyVirtualizingElement Then
+            Return CType(Element, MyVirtualizingElement).Init()
+        Else
+            Return Element
+        End If
+    End Function
+
+End Class

+ 67 - 52
Plain Craft Launcher 2/FormMain.xaml.vb

@@ -11,6 +11,11 @@ Public Class FormMain
         Dim FeatureList As New List(Of KeyValuePair(Of Integer, String))
         '统计更新日志条目
 #If BETA Then
+        If LastVersion < 376 Then 'Release 2.11.2
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "新增:联机功能!"))
+            FeatureCount += 32
+            BugCount += 21
+        End If
         If LastVersion < 372 Then 'Release 2.10.9
             FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:如果版本设置了自定义描述,会在标题后面以淡灰色显示其版本号"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "新增:支持为一个控件设置多个自定义事件"))
@@ -113,27 +118,37 @@ Public Class FormMain
         '3:BUG+ IMP* FEAT-
         '2:BUG* IMP-
         '1:BUG-
-        If LastVersion < 375 Then 'Snapshot 2.11.2
+        If LastVersion < 377 Then 'Snapshot 2.12.0
             If LastVersion >= 373 Then
-                FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:对联机进行了各种各样的优化,以改善稳定性"))
-                FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:若有加入者的网络环境比房主更好,会提示可以让那位加入者担任房主"))
+                FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "删除:暂时隐藏联机入口……不过只是暂时关闭,它还会回来的!"))
             End If
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "新增:适配新的 Minecraft 版本号系统与 Unobfuscated 版本"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:巨幅优化各个下载页面和 Mod 管理页面的性能"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "优化:更换披风时会显示当前使用的披风"))
+            FeatureCount += 31
+            BugCount += 27
+        End If
+        If LastVersion < 375 Then 'Snapshot 2.11.2
+            'If LastVersion >= 373 Then
+            '    FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:对联机进行了各种各样的优化,以改善稳定性"))
+            '    FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:若有加入者的网络环境比房主更好,会提示可以让那位加入者担任房主"))
+            'End If
             FeatureCount += 16
             BugCount += 4
         End If
         If LastVersion < 374 Then 'Snapshot 2.11.1
-            If LastVersion >= 373 Then
-                FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:使用离线登录也可以直接加入联机房间了"))
-                FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:会从所有共享节点中自动选择负载最低的进行中继连接"))
-                FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:若复制了邀请码,则可以直接快速加入房间"))
-                FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:关闭 PCL 时总是会提示是否退出联机,防止在关闭 PCL 时无意地关闭或退出了房间"))
-                FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "新增:允许自定义要连接的节点"))
-            End If
+            'If LastVersion >= 373 Then
+            '    FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:使用离线登录也可以直接加入联机房间了"))
+            '    FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "优化:会从所有共享节点中自动选择负载最低的进行中继连接"))
+            '    FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:若复制了邀请码,则可以直接快速加入房间"))
+            '    FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化:关闭 PCL 时总是会提示是否退出联机,防止在关闭 PCL 时无意地关闭或退出了房间"))
+            '    FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "新增:允许自定义要连接的节点"))
+            'End If
             FeatureCount += 9
             BugCount += 7
         End If
         If LastVersion < 373 Then 'Snapshot 2.11.0
-            FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "新增:联机功能!"))
+            'FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "新增:联机功能!"))
             FeatureCount += 7
             BugCount += 10
         End If
@@ -725,9 +740,9 @@ Public Class FormMain
         '按 ESC 返回上一级
         If e.Key = Key.Escape Then TriggerPageBack()
         '更改隐藏版本可见性
-        If e.Key = Key.F11 AndAlso PageCurrent = FormMain.PageType.VersionSelect Then
+        If e.Key = Key.F11 AndAlso PageCurrent = FormMain.PageType.InstanceSelect Then
             FrmSelectRight.ShowHidden = Not FrmSelectRight.ShowHidden
-            LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+            LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
             Return
         End If
         '更改功能隐藏可见性
@@ -772,12 +787,12 @@ Public Class FormMain
     '切回窗口
     Private Sub FormMain_Activated() Handles Me.Activated
         Try
-            If PageCurrent = PageType.VersionSetup AndAlso PageCurrentSub = PageSubType.VersionMod Then
+            If PageCurrent = PageType.InstanceSetup AndAlso PageCurrentSub = PageSubType.InstanceMod Then
                 'Mod 管理自动刷新
-                FrmVersionMod.ReloadModList()
-            ElseIf PageCurrent = PageType.VersionSelect Then
+                FrmInstanceMod.ReloadModList()
+            ElseIf PageCurrent = PageType.InstanceSelect Then
                 '版本选择自动刷新
-                LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\")
+                LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\")
             End If
         Catch ex As Exception
             Log(ex, "切回窗口时出错", LogLevel.Feedback)
@@ -851,36 +866,36 @@ Public Class FormMain
                             Hint($"输入的 Authlib 验证服务器不符合网址格式({AuthlibServer})!", HintType.Red)
                             Return
                         End If
-                        Dim TargetVersion = If(PageCurrent = PageType.VersionSetup, PageVersionLeft.Version, McVersionCurrent)
-                        If TargetVersion Is Nothing Then
+                        Dim Target = If(PageCurrent = PageType.InstanceSetup, PageInstanceLeft.Instance, McInstanceSelected)
+                        If Target Is Nothing Then
                             Hint("请先下载游戏,再设置第三方登录!", HintType.Red)
                             Return
                         End If
                         If AuthlibServer = "https://littleskin.cn/api/yggdrasil" Then
                             'LittleSkin
-                            If MyMsgBox($"是否要在版本 {TargetVersion.Name} 中开启 LittleSkin 登录?" & vbCrLf &
+                            If MyMsgBox($"是否要在版本 {Target.Name} 中开启 LittleSkin 登录?" & vbCrLf &
                                         "你可以在 版本设置 → 设置 → 服务器选项 中修改登录方式。", "第三方登录开启确认", "确定", "取消") = 2 Then
                                 Return
                             End If
-                            Setup.Set("VersionServerLogin", 4, Version:=TargetVersion)
-                            Setup.Set("VersionServerAuthServer", "https://littleskin.cn/api/yggdrasil", Version:=TargetVersion)
-                            Setup.Set("VersionServerAuthRegister", "https://littleskin.cn/auth/register", Version:=TargetVersion)
-                            Setup.Set("VersionServerAuthName", "LittleSkin 登录", Version:=TargetVersion)
+                            Setup.Set("VersionServerLogin", 4, Instance:=Target)
+                            Setup.Set("VersionServerAuthServer", "https://littleskin.cn/api/yggdrasil", Instance:=Target)
+                            Setup.Set("VersionServerAuthRegister", "https://littleskin.cn/auth/register", Instance:=Target)
+                            Setup.Set("VersionServerAuthName", "LittleSkin 登录", Instance:=Target)
                         Else
                             '第三方 Authlib 服务器
-                            If MyMsgBox($"是否要在版本 {TargetVersion.Name} 中开启第三方登录?" & vbCrLf &
+                            If MyMsgBox($"是否要在版本 {Target.Name} 中开启第三方登录?" & vbCrLf &
                                         $"登录服务器:{AuthlibServer}" & vbCrLf & vbCrLf &
                                         "你可以在 版本设置 → 设置 → 服务器选项 中修改登录方式。", "第三方登录开启确认", "确定", "取消") = 2 Then
                                 Return
                             End If
-                            Setup.Set("VersionServerLogin", 4, Version:=TargetVersion)
-                            Setup.Set("VersionServerAuthServer", AuthlibServer, Version:=TargetVersion)
-                            Setup.Set("VersionServerAuthRegister", AuthlibServer.Replace("api/yggdrasil", "auth/register"), Version:=TargetVersion)
-                            Setup.Set("VersionServerAuthName", "", Version:=TargetVersion)
+                            Setup.Set("VersionServerLogin", 4, Instance:=Target)
+                            Setup.Set("VersionServerAuthServer", AuthlibServer, Instance:=Target)
+                            Setup.Set("VersionServerAuthRegister", AuthlibServer.Replace("api/yggdrasil", "auth/register"), Instance:=Target)
+                            Setup.Set("VersionServerAuthName", "", Instance:=Target)
                         End If
-                        If PageCurrent = PageType.VersionSetup AndAlso PageCurrentSub = PageSubType.VersionSetup Then
+                        If PageCurrent = PageType.InstanceSetup AndAlso PageCurrentSub = PageSubType.InstanceSetup Then
                             '正在服务器选项页,需要刷新设置项显示
-                            FrmVersionSetup.Reload()
+                            FrmInstanceSetup.Reload()
                         ElseIf PageCurrent = PageType.Launch Then
                             '正在主页,需要刷新左边栏
                             FrmLaunchLeft.RefreshPage(True, False)
@@ -953,7 +968,7 @@ Public Class FormMain
                 Return
             End If
             '安装 Mod
-            If PageVersionMod.InstallMods(FilePathList) Then Return
+            If PageInstanceMod.InstallMods(FilePathList) Then Return
             '安装整合包
             If {"zip", "rar", "mrpack"}.Any(Function(t) t = Extension) Then '部分压缩包是 zip 格式但后缀为 rar,总之试一试
                 Log("[System] 文件为压缩包,尝试作为整合包安装")
@@ -1086,7 +1101,7 @@ Public Class FormMain
         ''' <summary>
         ''' 版本选择。这是一个副页面。
         ''' </summary>
-        VersionSelect = 5
+        InstanceSelect = 5
         ''' <summary>
         ''' 下载管理。这是一个副页面。
         ''' </summary>
@@ -1094,7 +1109,7 @@ Public Class FormMain
         ''' <summary>
         ''' 版本设置。这是一个副页面。
         ''' </summary>
-        VersionSetup = 7
+        InstanceSetup = 7
         ''' <summary>
         ''' 资源工程详情。这是一个副页面。
         ''' </summary>
@@ -1124,23 +1139,23 @@ Public Class FormMain
         OtherHelp = 0
         OtherAbout = 1
         OtherTest = 2
-        VersionOverall = 0
-        VersionSetup = 1
-        VersionMod = 2
-        VersionModDisabled = 3
-        VersionExport = 4
+        InstanceOverall = 0
+        InstanceSetup = 1
+        InstanceMod = 2
+        InstanceModDisabled = 3
+        InstanceExport = 4
     End Enum
     ''' <summary>
     ''' 获取次级页面的名称。若并非次级页面则返回空字符串,故可以以此判断是否为次级页面。
     ''' </summary>
     Private Function PageNameGet(Stack As PageStackData) As String
         Select Case Stack.Page
-            Case PageType.VersionSelect
+            Case PageType.InstanceSelect
                 Return "版本选择"
             Case PageType.DownloadManager
                 Return "下载管理"
-            Case PageType.VersionSetup
-                Return "版本设置 - " & If(PageVersionLeft.Version Is Nothing, "未知版本", PageVersionLeft.Version.Name)
+            Case PageType.InstanceSetup
+                Return "版本设置 - " & If(PageInstanceLeft.Instance Is Nothing, "未知版本", PageInstanceLeft.Instance.Name)
             Case PageType.CompDetail
                 Return "资源下载 - " & CType(Stack.Additional(0), CompProject).TranslatedName
             Case PageType.HelpDetail
@@ -1186,9 +1201,9 @@ Public Class FormMain
                 Case PageType.Other
                     If FrmOtherLeft Is Nothing Then FrmOtherLeft = New PageOtherLeft
                     Return FrmOtherLeft.PageID
-                Case PageType.VersionSetup
-                    If FrmVersionLeft Is Nothing Then FrmVersionLeft = New PageVersionLeft
-                    Return FrmVersionLeft.PageID
+                Case PageType.InstanceSetup
+                    If FrmInstanceLeft Is Nothing Then FrmInstanceLeft = New PageInstanceLeft
+                    Return FrmInstanceLeft.PageID
                 Case Else
                     Return 0 '没有子页面
             End Select
@@ -1262,9 +1277,9 @@ Public Class FormMain
         Else
             '切换到次页面
             Select Case Stack.Page
-                Case PageType.VersionSetup
-                    If FrmVersionLeft Is Nothing Then FrmVersionLeft = New PageVersionLeft
-                    CType(FrmVersionLeft.PanItem.Children(SubType), MyListItem).SetChecked(True, True, Stack = PageCurrent)
+                Case PageType.InstanceSetup
+                    If FrmInstanceLeft Is Nothing Then FrmInstanceLeft = New PageInstanceLeft
+                    CType(FrmInstanceLeft.PanItem.Children(SubType), MyListItem).SetChecked(True, True, Stack = PageCurrent)
             End Select
             PageChangeActual(Stack, SubType)
         End If
@@ -1356,7 +1371,7 @@ Public Class FormMain
                 Case PageType.Other '更多
                     If FrmOtherLeft Is Nothing Then FrmOtherLeft = New PageOtherLeft
                     PageChangeAnim(FrmOtherLeft, FrmOtherLeft.PageGet(SubType))
-                Case PageType.VersionSelect '版本选择
+                Case PageType.InstanceSelect '版本选择
                     If FrmSelectLeft Is Nothing Then FrmSelectLeft = New PageSelectLeft
                     If FrmSelectRight Is Nothing Then FrmSelectRight = New PageSelectRight
                     PageChangeAnim(FrmSelectLeft, FrmSelectRight)
@@ -1364,9 +1379,9 @@ Public Class FormMain
                     If FrmSpeedLeft Is Nothing Then FrmSpeedLeft = New PageSpeedLeft
                     If FrmSpeedRight Is Nothing Then FrmSpeedRight = New PageSpeedRight
                     PageChangeAnim(FrmSpeedLeft, FrmSpeedRight)
-                Case PageType.VersionSetup '版本设置
-                    If FrmVersionLeft Is Nothing Then FrmVersionLeft = New PageVersionLeft
-                    PageChangeAnim(FrmVersionLeft, FrmVersionLeft.PageGet(SubType))
+                Case PageType.InstanceSetup '版本设置
+                    If FrmInstanceLeft Is Nothing Then FrmInstanceLeft = New PageInstanceLeft
+                    PageChangeAnim(FrmInstanceLeft, FrmInstanceLeft.PageGet(SubType))
                 Case PageType.CompDetail 'Mod 信息
                     If FrmDownloadCompDetail Is Nothing Then FrmDownloadCompDetail = New PageDownloadCompDetail
                     PageChangeAnim(New MyPageLeft, FrmDownloadCompDetail)

+ 1 - 1
Plain Craft Launcher 2/Modules/Base/ModAnimation.vb

@@ -840,7 +840,7 @@ Sleeper:
     Public Sub AniTimer(DeltaTick As Integer)
         Try
 
-            If DeltaTick / AniSpeed > 200 Then Log("[Animation] 两个动画帧间隔 " & DeltaTick & " ms", LogLevel.Developer)
+            If DeltaTick / AniSpeed > 100 Then Log("[Animation] 两个动画帧间隔 " & DeltaTick & " ms", LogLevel.Developer)
             Dim i As Integer = -1
             '循环每个动画组
             Do While i + 1 < AniGroups.Count

+ 83 - 23
Plain Craft Launcher 2/Modules/Base/ModBase.vb

@@ -14,13 +14,13 @@ Public Module ModBase
 #Region "声明"
 
     '下列版本信息由更新器自动修改
-    Public Const VersionBaseName As String = "2.11.2" '不含分支前缀的显示用版本名
-    Public Const VersionStandardCode As String = "2.11.2." & VersionBranchCode '标准格式的四段式版本号
+    Public Const VersionBaseName As String = "2.12.0" '不含分支前缀的显示用版本名
+    Public Const VersionStandardCode As String = "2.12.0." & VersionBranchCode '标准格式的四段式版本号
     Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换
 #If BETA Then
     Public Const VersionCode As Integer = 372 'Release
 #Else
-    Public Const VersionCode As Integer = 375 'Snapshot
+    Public Const VersionCode As Integer = 377 'Snapshot
 #End If
     '自动生成的版本信息
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
@@ -1211,14 +1211,17 @@ Re:
     Public Class FileChecker
         ''' <summary>
         ''' 文件的准确大小。
+        ''' 不检查则为 -1。
         ''' </summary>
         Public ActualSize As Long = -1
         ''' <summary>
         ''' 文件的最小大小。
+        ''' 不检查则为 -1。
         ''' </summary>
         Public MinSize As Long = -1
         ''' <summary>
         ''' 文件的 MD5、SHA1 或 SHA256。会根据输入字符串的长度自动判断种类。
+        ''' 不检查则为 Nothing。
         ''' </summary>
         Public Hash As String = Nothing
         ''' <summary>
@@ -1226,7 +1229,8 @@ Re:
         ''' </summary>
         Public CanUseExistsFile As Boolean = True
         ''' <summary>
-        ''' 是否为 Json 文件。
+        ''' 是否要求为 JSON 文件。
+        ''' 即,开头结尾必须为 {} 或 []。
         ''' </summary>
         Public IsJson As Boolean = False
         Public Sub New(Optional MinSize As Long = -1, Optional ActualSize As Long = -1, Optional Hash As String = Nothing, Optional CanUseExistsFile As Boolean = True, Optional IsJson As Boolean = False)
@@ -1429,6 +1433,7 @@ RetryDir:
         If Ex Is Nothing Then Return "无可用错误信息!"
 
         '获取最底层的异常
+        Dim OuterEx As Exception = Ex
         Dim InnerEx As Exception = Ex
         Do Until InnerEx.InnerException Is Nothing
             InnerEx = InnerEx.InnerException
@@ -1452,7 +1457,7 @@ RetryDir:
         Loop
 
         '构造输出信息
-        Dim UsualReason As String = AnalyzeUsualReason(InnerEx, Ex, DescList)
+        Dim UsualReason As String = AnalyzeUsualReason(InnerEx, OuterEx, DescList)
         If UsualReason Is Nothing Then
             Return DescList.Join(vbCrLf)
         Else
@@ -1466,6 +1471,7 @@ RetryDir:
         If Ex Is Nothing Then Return "无可用错误信息!"
 
         '获取最底层的异常
+        Dim OuterEx As Exception = Ex
         Dim InnerEx As Exception = Ex
         Do Until InnerEx.InnerException Is Nothing
             InnerEx = InnerEx.InnerException
@@ -1481,7 +1487,7 @@ RetryDir:
         Dim Desc As String = Join(DescList, vbCrLf & "→ ")
 
         '构造输出信息
-        Dim UsualReason As String = AnalyzeUsualReason(InnerEx, Ex, DescList)
+        Dim UsualReason As String = AnalyzeUsualReason(InnerEx, OuterEx, DescList)
         If UsualReason IsNot Nothing Then
             Return UsualReason & "详细错误:" & DescList.First
         Else
@@ -1580,16 +1586,6 @@ RetryDir:
         Return Mid(Str.PadRight(Length, Code), Str.Length + 1) & Str
     End Function
     ''' <summary>
-    ''' 将一个小数显示为固定的小数点后位数形式,将向零取整。
-    ''' 如 12 保留 2 位则输出 12.00,而 95.678 保留 2 位则输出 95.67。
-    ''' </summary>
-    Public Function StrFillNum(Num As Double, Length As Integer) As String
-        Num = Math.Round(Num, Length, MidpointRounding.AwayFromZero)
-        StrFillNum = Num
-        If Not StrFillNum.Contains(".") Then Return (StrFillNum & ".").PadRight(StrFillNum.Length + 1 + Length, "0")
-        Return StrFillNum.PadRight(StrFillNum.Split(".")(0).Length + 1 + Length, "0")
-    End Function
-    ''' <summary>
     ''' 移除字符串首尾的标点符号、回车,以及括号中、冒号后的补充说明内容。
     ''' </summary>
     Public Function StrTrim(Str As String, Optional RemoveQuote As Boolean = True)
@@ -1964,7 +1960,7 @@ RetryDir:
                 Function(Source) Source.Key.Replace(" ", "").ContainsF(QueryPart, True)))
         Next
         '按照相似度进行排序
-        Entries = Entries.Sort(
+        Entries = Entries.SortByComparison(
         Function(Left, Right) As Boolean
             If Left.AbsoluteRight Xor Right.AbsoluteRight Then
                 Return Left.AbsoluteRight
@@ -2031,7 +2027,7 @@ RetryDir:
         Implements IDictionary(Of TKey, TValue)
         Implements IEnumerable(Of KeyValuePair(Of TKey, TValue))
 
-        Private ReadOnly SyncRoot As New Object
+        Public ReadOnly SyncRoot As New Object
         Private ReadOnly _Dictionary As New Dictionary(Of TKey, TValue)
 
         '构造函数
@@ -2229,6 +2225,19 @@ RetryDir:
         Return CultureInfo.CurrentCulture.Name.StartsWithF("zh-") OrElse CultureInfo.CurrentUICulture.Name.StartsWithF("zh-")
     End Function
 
+    ''' <summary>
+    ''' 判断对象是否为某个泛型类型的实例。
+    ''' </summary>
+    <Extension> Public Function IsInstanceOfGenericType(genericType As Type, obj As Object) As Boolean
+        If obj Is Nothing Then Return False
+        Dim t = obj.GetType()
+        While t IsNot Nothing
+            If t.IsGenericType AndAlso t.GetGenericTypeDefinition() Is genericType Then Return True
+            t = t.BaseType
+        End While
+        Return False
+    End Function
+
     Private Uuid As Integer = 1
     Private UuidLock As Object
     ''' <summary>
@@ -2256,7 +2265,7 @@ RetryDir:
         Next i
     End Function
     ''' <summary>
-    ''' 数组去重。
+    ''' 去重。
     ''' </summary>
     <Extension> Public Function Distinct(Of T)(Arr As ICollection(Of T), IsEqual As ComparisonBoolean(Of T)) As List(Of T)
         Dim ResultArray As New List(Of T)
@@ -2272,6 +2281,15 @@ NextElement:
     <Extension> Public Function Any(Arr As UIElementCollection) As Boolean
         Return Arr?.Count > 0
     End Function
+    ''' <summary>
+    ''' 对集合的每个元素执行指定操作。
+    ''' </summary>
+    <Extension> Public Function ForEach(Of T)(Collection As IEnumerable(Of T), Action As Action(Of T)) As IEnumerable(Of T)
+        For Each Item As T In Collection
+            Action(Item)
+        Next
+        Return Collection
+    End Function
 
     ''' <summary>
     ''' 获取格式类似于“11:08:52.037”的当前时间的字符串。
@@ -2493,11 +2511,47 @@ NextElement:
         End If
     End Sub
 
+    ''' <summary>
+    ''' 选择最大值对应的对象。
+    ''' 若没有元素则返回 Nothing。
+    ''' </summary>
+    <Extension> Public Function MaxOf(Of T, C As IComparable(Of C))(Source As IEnumerable(Of T), Selector As Func(Of T, C)) As T
+        Using Enumerator = Source.GetEnumerator()
+            If Not Enumerator.MoveNext() Then Return Nothing
+            Dim MaxItem As T = Enumerator.Current
+            Dim MaxValue As C = Selector(MaxItem)
+            While Enumerator.MoveNext()
+                Dim Value = Selector(Enumerator.Current)
+                If Value.CompareTo(MaxValue) <= 0 Then Continue While
+                MaxItem = Enumerator.Current
+                MaxValue = Value
+            End While
+            Return MaxItem
+        End Using
+    End Function
+    ''' <summary>
+    ''' 选择最小值对应的对象。
+    ''' 若没有元素则返回 Nothing。
+    ''' </summary>
+    <Extension> Public Function MinOf(Of T, C As IComparable(Of C))(List As IEnumerable(Of T), Selector As Func(Of T, C)) As T
+        Using Enumerator = List.GetEnumerator()
+            If Not Enumerator.MoveNext() Then Return Nothing
+            Dim MinItem As T = Enumerator.Current
+            Dim MinValue As C = Selector(MinItem)
+            While Enumerator.MoveNext()
+                Dim Value = Selector(Enumerator.Current)
+                If Value.CompareTo(MinValue) >= 0 Then Continue While
+                MinItem = Enumerator.Current
+                MinValue = Value
+            End While
+            Return MinItem
+        End Using
+    End Function
     ''' <summary>
     ''' 按照既定的函数进行选择排序。
-    ''' 传入两个对象,若第一个对象应该排在前面,则返回 True。
+    ''' 返回第一个对象是否应该排在前面(a > b)。
     ''' </summary>
-    <Extension> Public Function Sort(Of T)(List As IList(Of T), SortRule As ComparisonBoolean(Of T)) As List(Of T)
+    <Extension> Public Function SortByComparison(Of T)(List As IList(Of T), SortRule As ComparisonBoolean(Of T)) As List(Of T)
         Dim NewList As New List(Of T)
         While List.Any
             Dim Highest = List(0)
@@ -2769,19 +2823,25 @@ Retry:
 
     ''' <summary>
     ''' 将 XML 转换为对应 UI 对象。
+    ''' 注意:性能较差,不应大量使用。
     ''' </summary>
     Public Function GetObjectFromXML(Str As XElement)
         Return GetObjectFromXML(Str.ToString)
     End Function
     ''' <summary>
     ''' 将 XML 转换为对应 UI 对象。
+    ''' 注意:性能较差,不应大量使用。
     ''' </summary>
     Public Function GetObjectFromXML(Str As String) As Object
         Str = Str. '兼容旧版自定义事件写法
             Replace("EventType=""", "local:CustomEventService.EventType=""").
             Replace("EventData=""", "local:CustomEventService.EventData=""").
+            Replace("EventType='", "local:CustomEventService.EventType='").
+            Replace("EventData='", "local:CustomEventService.EventData='").
             Replace("Property=""EventType""", "Property=""local:CustomEventService.EventType""").
-            Replace("Property=""EventData""", "Property=""local:CustomEventService.EventData""")
+            Replace("Property=""EventData""", "Property=""local:CustomEventService.EventData""").
+            Replace("Property='EventType'", "Property='local:CustomEventService.EventType'").
+            Replace("Property='EventData'", "Property='local:CustomEventService.EventData'")
         Using Stream As New MemoryStream(Encoding.UTF8.GetBytes(Str))
             '类型检查
             Using Reader As New XamlXmlReader(Stream)
@@ -3114,7 +3174,7 @@ Retry:
             "操作系统:" & My.Computer.Info.OSFullName & "(32 位:" & Is32BitSystem & ")" & vbCrLf &
             "剩余内存:" & Int(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024) & " M / " & Int(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024) & " M" & vbCrLf &
             "DPI:" & DPI & "(" & Math.Round(DPI / 96, 2) * 100 & "%)" & vbCrLf &
-            "MC 文件夹:" & If(PathMcFolder, "Nothing") & vbCrLf &
+            "MC 文件夹:" & If(McFolderSelected, "Nothing") & vbCrLf &
             "文件位置:" & Path)
     End Sub
 

+ 244 - 190
Plain Craft Launcher 2/Modules/Base/ModNet.vb

@@ -242,7 +242,7 @@ RequestFinished:
                 If Header.Key.ToLower = "content-type" Then
                     Request.Content?.Headers.TryAddWithoutValidation(Header.Key, Header.Value)
                 Else
-                    Request.Headers.Add(Header.Key, Header.Value)
+                    Request.Headers.TryAddWithoutValidation(Header.Key, Header.Value)
                 End If
             Next
             SecretHeadersSign(Url, Request, SimulateBrowserHeaders)
@@ -257,7 +257,7 @@ RequestFinished:
                 '延迟初始化,以避免在程序启动前加载 CacheCow 导致 DLL 加载失败
                 If RequestClient Is Nothing Then
                     RequestClient = CacheCow.Client.ClientExtensions.CreateClient(New CacheCow.Client.FileCacheStore.FileStore(PathTemp & "Cache/Http/"), New HttpClientHandler With {
-                        .AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip Or DecompressionMethods.None,
+                        .AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip,
                         .UseCookies = False '不设为 False 就不能从 Header 手动传入 Cookies
                     })
                 End If
@@ -308,15 +308,25 @@ RequestFinished:
     ''' 若解析失败,则返回 Nothing。
     ''' </summary>
     Private Function DNSLookup(Request As HttpRequestMessage, CancelToken As CancellationTokenSource) As String
-        Dim GetIPReliability = Function(Key) IPReliability.GetOrDefault(Key.ToString, 0)
-        '初步 DNS 解析
+        '若一分钟内已失败过,则不再重复尝试解析,以减少断网时的 Exception 数量
         Dim Host = Request.RequestUri.Host
+        SyncLock DNSFailureRecord.SyncRoot
+            If DNSFailureRecord.ContainsKey(Host) Then
+                If Date.Now - DNSFailureRecord(Host) < New TimeSpan(0, 1, 0) Then
+                    Return Nothing
+                Else
+                    DNSFailureRecord.Remove(Host)
+                End If
+            End If
+        End SyncLock
+        '初步 DNS 解析
         Dim DnsTask As Task(Of IPAddress()) = Nothing
         Try
             DnsTask = Dns.GetHostAddressesAsync(Host)
             DnsTask.Wait(CancelToken.Token)
         Catch ex As Exception
             Log(ex, $"DNS 解析失败({Host})")
+            DNSFailureRecord(Host) = Date.Now
             Return Nothing
         End Try
         Dim Candidates As IPAddress() = DnsTask.Result.ToArray
@@ -325,6 +335,7 @@ RequestFinished:
             Return Nothing
         End If
         '若同时存在 IPv4 和 IPv6 地址,仅选择其中一类(因为 GFW 可能只屏蔽了 IPv4 或 IPv6)
+        Dim GetIPReliability = Function(Key) IPReliability.GetOrDefault(Key.ToString, 0)
         Dim IPv4Targets = Candidates.Where(Function(i) i.AddressFamily = AddressFamily.InterNetwork).ToArray
         Dim IPv6Targets = Candidates.Where(Function(i) i.AddressFamily = AddressFamily.InterNetworkV6).ToArray
         If IPv4Targets.Any AndAlso IPv6Targets.Any Then
@@ -347,6 +358,7 @@ RequestFinished:
         End If
         Return TargetIp
     End Function
+    Private DNSFailureRecord As New SafeDictionary(Of String, Date)
     ''' <summary>
     ''' 记录每个 IP 地址的请求可靠度。
     ''' 通常取值 -1 ~ +0.5,越高越好。未尝试过的 IP 应视为 0。
@@ -387,7 +399,7 @@ RequestFinished:
 #Region "多线程下载引擎"
 
     Private ThreadClient As New HttpClient(New HttpClientHandler With {
-        .AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip Or DecompressionMethods.None
+        .AutomaticDecompression = DecompressionMethods.Deflate Or DecompressionMethods.GZip
     })
 
     ''' <summary>
@@ -407,7 +419,6 @@ RequestFinished:
     ''' </summary>
     Public NetTaskSpeedLimitLeft As Long = -1
     Private ReadOnly NetTaskSpeedLimitLeftLock As New Object
-    Private NetTaskSpeedLimitLeftLast As Long
     ''' <summary>
     ''' 正在运行中的线程数。
     ''' </summary>
@@ -438,39 +449,35 @@ RequestFinished:
         ''' <summary>
         ''' 尚未进行已存在检查。
         ''' </summary>
-        WaitForCheck = -1
+        WaitingToCheck = -1
         ''' <summary>
         ''' 尚未开始。
         ''' </summary>
-        WaitForDownload = 0
+        WaitingToDownload = 0
         ''' <summary>
         ''' 正在连接,尚未获取文件大小。
         ''' </summary>
-        Connect = 1
+        Connecting = 1
         ''' <summary>
-        ''' 已获取文件大小,尚未有有效下载。
+        ''' 已连接,正在尝试接收首个下载数据包。
         ''' </summary>
-        [Get] = 2
+        Reading = 2
         ''' <summary>
         ''' 正在下载。
         ''' </summary>
-        Download = 3
+        Downloading = 3
         ''' <summary>
         ''' 正在合并文件。
         ''' </summary>
-        Merge = 4
-        ''' <summary>
-        ''' 不进行下载,因为已发现现存的文件。
-        ''' </summary>
-        WaitForCopy = 5
+        Merging = 4
         ''' <summary>
         ''' 已完成。
         ''' </summary>
-        Finish = 6
+        Finished = 5
         ''' <summary>
         ''' 已失败或中断。
         ''' </summary>
-        [Error] = 7
+        Interrupted = 6
     End Enum
     ''' <summary>
     ''' 预下载检查行为。
@@ -612,13 +619,13 @@ RequestFinished:
         ''' <summary>
         ''' 当前线程的状态。
         ''' </summary>
-        Public State As NetState = NetState.WaitForDownload
+        Public State As NetState = NetState.WaitingToDownload
         ''' <summary>
         ''' 是否已经结束。
         ''' </summary>
         Public ReadOnly Property IsEnded As Boolean
             Get
-                Return State = NetState.Finish OrElse State = NetState.Error
+                Return State = NetState.Finished OrElse State = NetState.Interrupted
             End Get
         End Property
 
@@ -716,7 +723,7 @@ RequestFinished:
         ''' <summary>
         ''' 当前的下载状态。
         ''' </summary>
-        Public State As NetState = NetState.WaitForCheck
+        Public State As NetState = NetState.WaitingToCheck
         ''' <summary>
         ''' 导致下载失败的原因。
         ''' </summary>
@@ -741,7 +748,7 @@ RequestFinished:
         ''' </summary>
         Public ReadOnly Property IsNoSplit As Boolean
             Get
-                Return IsUnknownSize OrElse FileSize < FilePieceLimit
+                Return IsUnknownSize OrElse FileSize < 1024 * 1024 '小于 1MB 的文件不分割
             End Get
         End Property
         ''' <summary>
@@ -797,24 +804,22 @@ RequestFinished:
         Public ReadOnly Property Progress As Double
             Get
                 Select Case State
-                    Case NetState.WaitForCheck
+                    Case NetState.WaitingToCheck
                         Return 0
-                    Case NetState.WaitForCopy
-                        Return 0.2
-                    Case NetState.WaitForDownload
+                    Case NetState.WaitingToDownload
                         Return 0.01
-                    Case NetState.Connect
+                    Case NetState.Connecting
                         Return 0.02
-                    Case NetState.Get
+                    Case NetState.Reading
                         Return 0.04
-                    Case NetState.Download
+                    Case NetState.Downloading
                         '正在下载中,对应 5% ~ 98%
                         Dim OriginalProgress As Double = If(IsUnknownSize, 0.5, DownloadDone / Math.Max(FileSize, 1))
                         OriginalProgress = 1 - (1 - OriginalProgress) ^ 0.9
                         Return OriginalProgress * 0.93 + 0.05
-                    Case NetState.Merge
+                    Case NetState.Merging
                         Return 0.99
-                    Case NetState.Finish, NetState.Error
+                    Case NetState.Finished, NetState.Interrupted
                         Return 1
                     Case Else
                         Throw New ArgumentOutOfRangeException("文件状态未知:" & State)
@@ -859,7 +864,7 @@ RequestFinished:
         ''' 新建一个需要下载的文件。
         ''' </summary>
         ''' <param name="LocalPath">包含文件名的本地地址。</param>
-        Public Sub New(Urls As IEnumerable(Of String), LocalPath As String, Optional Check As FileChecker = Nothing, Optional SimulateBrowserHeaders As Boolean = False)
+        Public Sub New(Urls As IEnumerable(Of String), LocalPath As String, Optional Checker As FileChecker = Nothing, Optional SimulateBrowserHeaders As Boolean = False)
             Dim Sources As New List(Of NetSource)
             Dim Count As Integer = 0
             Urls = Urls.Distinct.ToArray
@@ -869,7 +874,7 @@ RequestFinished:
             Next
             Me.Sources = Sources
             Me.LocalPath = LocalPath
-            Me.Check = Check
+            Me.Check = Checker
             Me.SimulateBrowserHeaders = SimulateBrowserHeaders
             Me.LocalName = GetFileNameFromPath(LocalPath)
         End Sub
@@ -886,10 +891,10 @@ RequestFinished:
                 '条件检测
                 SyncLock LockSource
                     If NetTaskThreadCount >= NetTaskThreadLimit OrElse Not HasAvailableSource() OrElse
-                        (IsNoSplit AndAlso Threads IsNot Nothing AndAlso Threads.State <> NetState.Error) Then Return Nothing
-                    If State >= NetState.Merge OrElse State = NetState.WaitForCheck Then Return Nothing
+                        (IsNoSplit AndAlso Threads IsNot Nothing AndAlso Threads.State <> NetState.Interrupted) Then Return Nothing
+                    If State >= NetState.Merging OrElse State = NetState.WaitingToCheck Then Return Nothing
                     SyncLock LockState
-                        If State < NetState.Connect Then State = NetState.Connect
+                        If State < NetState.Connecting Then State = NetState.Connecting
                     End SyncLock
                     '初始化参数
                     '获取线程起点与下载源
@@ -897,10 +902,10 @@ RequestFinished:
                     If IsNoSplit Then GoTo StartSingleThreadDownload
                     '只剩下单线程可用点
                     If Not HasAvailableSource(False) Then
-                        If SourcesOnce.First.SingleThread IsNot Nothing AndAlso SourcesOnce.First.SingleThread.State <> NetState.Error Then Return Nothing
+                        If SourcesOnce.First.SingleThread IsNot Nothing AndAlso SourcesOnce.First.SingleThread.State <> NetState.Interrupted Then Return Nothing
 StartSingleThreadDownload:
                         Reset()
-                        State = NetState.Get
+                        State = NetState.Reading
                     End If
                 End SyncLock
                 SyncLock LockChain
@@ -913,7 +918,7 @@ StartSingleThreadDownload:
                     End If
                     '寻找失败点
                     For Each Thread As NetThread In Threads
-                        If Thread.State = NetState.Error AndAlso Thread.DownloadUndone > 0 Then
+                        If Thread.State = NetState.Interrupted AndAlso Thread.DownloadUndone > 0 Then
                             StartPosition = Thread.DownloadStart + Thread.DownloadDone
                             StartSource = GetSource(Thread.Source.Id + 1)
                             GoTo StartThread
@@ -942,7 +947,7 @@ StartThread:
                     Dim ThreadUuid As Integer = GetUuid()
                     If Not Tasks.Any() Then Return Nothing '由于中断,已没有可用任务
                     Th = New Thread(AddressOf Thread) With {.Name = $"下载 {Tasks(0).Uuid}/{Uuid}/{ThreadUuid}#", .Priority = ThreadPriority.BelowNormal}
-                    ThreadInfo = New NetThread With {.Uuid = ThreadUuid, .DownloadStart = StartPosition, .Thread = Th, .Source = StartSource, .Task = Me, .State = NetState.WaitForDownload}
+                    ThreadInfo = New NetThread With {.Uuid = ThreadUuid, .DownloadStart = StartPosition, .Thread = Th, .Source = StartSource, .Task = Me, .State = NetState.WaitingToDownload}
                     '链表处理
                     If ThreadInfo.IsFirstThread OrElse Threads Is Nothing Then
                         Threads = ThreadInfo
@@ -981,8 +986,8 @@ StartThread:
                 CancelToken As CancellationTokenSource = Nothing, HostIp As String = Nothing
             '部分下载源真的特别慢,并且只需要一个请求,例如 Ping 为 20s,如果增长太慢,就会造成类似 2.5s 5s 7.5s 10s 12.5s... 的极大延迟
             '延迟过长会导致某些特别慢的链接迟迟不被掐死
-            Dim Timeout As Integer = Math.Min(Math.Max(ConnectAverage, 6000) * (1 + Th.Source.FailCount), 30000)
-            Th.State = NetState.Connect
+            Dim Timeout As Integer = Math.Min(Math.Max(ConnectAverage, 10000) * (1 + Th.Source.FailCount), 30000)
+            Th.State = NetState.Connecting
             Try
                 Dim HttpDataCount As Integer = 0
                 If SourcesOnce.Contains(Th.Source) AndAlso Th <> Th.Source.SingleThread Then GoTo SourceBreak
@@ -994,7 +999,7 @@ StartThread:
                 Dim ContentLength As Long = 0
                 Response = ThreadClient.SendAsync(HttpRequest, HttpCompletionOption.ResponseHeadersRead, CancelToken.Token).GetResultWithTimeout(CancelToken, Timeout)
                 If Not Response.IsSuccessStatusCode Then Throw New Exception($"错误码 {Response.StatusCode} ({CInt(Response.StatusCode)}),{Th.Source.Url}") '状态码检查
-                If State = NetState.Error Then GoTo SourceBreak '快速中断
+                If State = NetState.Interrupted Then GoTo SourceBreak '快速中断
                 If ModeDebug AndAlso Response.RequestMessage.RequestUri.ToString <> Th.Source.Url Then Log($"[Download] {LocalName}:重定向至 {Response.RequestMessage.RequestUri}")
                 '文件大小校验
                 ContentLength = Response.Content.Headers.ContentLength.GetValueOrDefault(-1)
@@ -1045,9 +1050,9 @@ NotSupportRange:
                     Throw New RangeNotSupportedException($"获取到的分段大小不一致:Range 起始于 {Th.DownloadStart},预期 ContentLength 为 {FileSize - Th.DownloadStart},返回 ContentLength 为 {ContentLength},总文件大小 {FileSize}")
                 End If
                 'Log($"[Download] {LocalName} {Info.Uuid}#:通过大小检查,文件大小 {FileSize},起始点 {Info.DownloadStart},ContentLength {ContentLength}")
-                Th.State = NetState.Get
+                Th.State = NetState.Reading
                 SyncLock LockState
-                    If State < NetState.Get Then State = NetState.Get
+                    If State < NetState.Reading Then State = NetState.Reading
                 End SyncLock
                 '创建缓存文件
                 If IsNoSplit Then
@@ -1065,7 +1070,7 @@ NotSupportRange:
                 Dim ResponseBytes As Byte() = New Byte(16384) {}
                 HttpDataCount = ResponseStream.ReadAsync(ResponseBytes, 0, 16384, CancelToken.Token).GetResultWithTimeout(CancelToken, Timeout)
                 While (IsUnknownSize OrElse Th.DownloadUndone > 0) AndAlso '判断是否下载完成
-                            HttpDataCount > 0 AndAlso Not IsProgramEnded AndAlso State < NetState.Merge AndAlso (Not Th.Source.IsFailed OrElse Th.Source.SingleThread = Th)
+                            HttpDataCount > 0 AndAlso Not IsProgramEnded AndAlso State < NetState.Merging AndAlso (Not Th.Source.IsFailed OrElse Th.Source.SingleThread = Th)
                     '限速
                     While NetTaskSpeedLimitHigh > 0 AndAlso NetTaskSpeedLimitLeft <= 0
                         Threading.Thread.Sleep(16)
@@ -1080,9 +1085,9 @@ NotSupportRange:
                         '有数据
                         If Th.DownloadDone = 0 Then
                             '第一次接受到数据
-                            Th.State = NetState.Download
+                            Th.State = NetState.Downloading
                             SyncLock LockState
-                                If State < NetState.Download Then State = NetState.Download
+                                If State < NetState.Downloading Then State = NetState.Downloading
                             End SyncLock
                             SyncLock LockCount
                                 ConnectCount += 1
@@ -1116,16 +1121,16 @@ NotSupportRange:
                     HttpDataCount = ResponseStream.ReadAsync(ResponseBytes, 0, 16384, CancelToken.Token).GetResultWithTimeout(CancelToken, Timeout)
                 End While
 SourceBreak:
-                If State = NetState.Error OrElse (Th.Source.IsFailed AndAlso Th.Source.SingleThread <> Th) OrElse (Th.DownloadUndone > 0 AndAlso Not IsUnknownSize) Then
+                If State = NetState.Interrupted OrElse (Th.Source.IsFailed AndAlso Th.Source.SingleThread <> Th) OrElse (Th.DownloadUndone > 0 AndAlso Not IsUnknownSize) Then
                     '被外部中断
-                    Th.State = NetState.Error
+                    Th.State = NetState.Interrupted
                     Log($"[Download] {LocalName}:中断")
                 ElseIf HttpDataCount = 0 AndAlso Th.DownloadUndone > 0 AndAlso Not IsUnknownSize Then
                     '服务器无返回数据
                     Throw New Exception($"返回的 ContentLength 过多:ContentLength 为 {ContentLength},但获取到的总数据量仅为 {Th.DownloadDone}(全文件总数据量 {DownloadDone})")
                 Else
                     '本线程完成
-                    Th.State = NetState.Finish
+                    Th.State = NetState.Finished
                     If ModeDebug Then Log($"[Download] {LocalName}:完成,已下载 {Th.DownloadDone}({Th.DownloadStart}~{Th.DownloadEnd})")
                     RecordIPReliability(HostIp, 0.5)
                 End If
@@ -1147,7 +1152,7 @@ SourceBreak:
                 End SyncLock
                 '合并
                 If ((FileSize >= 0 AndAlso DownloadDone >= FileSize) OrElse (FileSize = -1 AndAlso DownloadDone > 0)) AndAlso
-                    State < NetState.Merge AndAlso Th.State <> NetState.Error Then Merge(Th)
+                    State < NetState.Merging AndAlso Th.State <> NetState.Interrupted Then Merge(Th)
             End Try
         End Sub
         Private Sub SourceFail(Th As NetThread, ex As Exception, IsMergeFailure As Boolean)
@@ -1158,7 +1163,7 @@ SourceBreak:
                     Task.FailCount += 1
                 Next
             End SyncLock
-            Th.State = NetState.Error
+            Th.State = NetState.Interrupted
             Th.Source.Ex = ex
             '根据情况判断,是否在多线程下禁用下载源(连续错误过多,或不支持断点续传)
             Dim IsRangeNotSupported As Boolean = TypeOf ex Is RangeNotSupportedException OrElse ex.Message.Contains("(416)")
@@ -1202,13 +1207,13 @@ SourceBreak:
                         End SyncLock
                         Reset()
                         SyncLock LockState
-                            State = NetState.WaitForDownload
+                            State = NetState.WaitingToDownload
                         End SyncLock
                     ElseIf HasAvailableSource() AndAlso IsMergeFailure Then
                         '合并失败且单个源失败:继续下一个源
                         Reset()
                         SyncLock LockState
-                            State = NetState.WaitForDownload
+                            State = NetState.WaitingToDownload
                         End SyncLock
                     Else
                         '失败
@@ -1251,8 +1256,8 @@ SourceBreak:
         Private Sub Merge(Th As NetThread)
             '状态判断
             SyncLock LockState
-                If State < NetState.Merge Then
-                    State = NetState.Merge
+                If State < NetState.Merging Then
+                    State = NetState.Merging
                 Else
                     Return
                 End If
@@ -1323,7 +1328,11 @@ Retry:
                     GoTo Retry
                 End If
                 '失败,禁用当前下载源并重启下载
-                If File.Exists(LocalPath) Then File.Delete(LocalPath)
+                Try
+                    If File.Exists(LocalPath) Then File.Delete(LocalPath)
+                Catch exx As Exception
+                    Log(ex, $"删除合并失败的文件出错({LocalPath})")
+                End Try
                 SourceFail(Th, ex, True)
             Finally
                 Cache?.Dispose()
@@ -1334,10 +1343,10 @@ Retry:
         ''' </summary>
         Private Sub Fail(Optional RaiseEx As Exception = Nothing)
             SyncLock LockState
-                If State >= NetState.Finish Then Return
+                If State >= NetState.Finished Then Return
                 If RaiseEx IsNot Nothing Then Ex.Add(RaiseEx)
                 '凉凉
-                State = NetState.Error
+                State = NetState.Interrupted
             End SyncLock
             AbortInternal()
             For Each Task In Tasks
@@ -1353,8 +1362,8 @@ Retry:
             If Tasks.Any Then Return
             '确认中断
             SyncLock LockState
-                If State >= NetState.Finish Then Return
-                State = NetState.Error
+                If State >= NetState.Finished Then Return
+                State = NetState.Interrupted
             End SyncLock
             AbortInternal()
         End Sub
@@ -1373,8 +1382,8 @@ Retry:
         ''' </summary>
         Public Sub Finish(Optional PrintLog As Boolean = True)
             SyncLock LockState
-                If State >= NetState.Finish Then Return
-                State = NetState.Finish
+                If State >= NetState.Finished Then Return
+                State = NetState.Finished
             End SyncLock
             SyncLock NetManager.LockRemain
                 NetManager.FileRemain -= 1
@@ -1483,20 +1492,10 @@ FinishExCatch:
         Public Overrides Sub Start(Optional Input As Object = Nothing, Optional IsForceRestart As Boolean = False)
             If Input IsNot Nothing Then Files = New SafeList(Of NetFile)(Input)
             '去重
-            Dim ResultArray As New SafeList(Of NetFile)
-            For i = 0 To Files.Count - 1
-                For ii = i + 1 To Files.Count - 1
-                    If Files(i).LocalPath = Files(ii).LocalPath Then GoTo NextElement
-                Next
-                ResultArray.Add(Files(i))
-NextElement:
-            Next
-            Files = ResultArray
+            Files = New SafeList(Of NetFile)(Files.Distinct(Function(a, b) a.LocalPath = b.LocalPath))
             '设置剩余文件数
             SyncLock FileRemainLock
-                For Each File In Files
-                    If File.State <> NetState.Finish Then FileRemain += 1
-                Next
+                FileRemain += Files.Where(Function(f) f.State <> NetState.Finished).Count
             End SyncLock
             State = LoadState.Loading
             '开始执行
@@ -1517,109 +1516,162 @@ NextElement:
                             End If
                         Next
                         If Not File.HasAvailableSource() Then Throw New ArgumentException("输入的下载链接不正确!")
+                        File.LocalPath = File.LocalPath.Replace("/", "\")
                         If Not File.LocalPath.ToLower.Contains(":\") Then Throw New ArgumentException("输入的本地文件地址不正确:" & File.LocalPath)
                         If File.LocalPath.EndsWithF("\") Then Throw New ArgumentException("请输入含文件名的完整文件路径:" & File.LocalPath)
-                        '文件夹检测
-                        Dim DirPath As String = New FileInfo(File.LocalPath).Directory.FullName
-                        If Not Directory.Exists(DirPath) Then Directory.CreateDirectory(DirPath)
+                        Directory.CreateDirectory(GetPathFromFullPath(File.LocalPath)) '创建目标文件夹
                     Next
                     '接入下载管理器
                     NetManager.Start(Me)
-                    '将文件分配给多个线程以进行已存在查找
-                    Dim Folders As New List(Of String) '可能会用于已存在查找的文件夹列表
-                    Dim FoldersFinal As New List(Of String) '最终用于查找的列表
-                    If Not Setup.Get("SystemDebugSkipCopy") Then '在设置中禁用复制
-                        Folders.Add(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\") '总是添加官启文件夹,因为 HMCL 会把所有文件存在这里
-                        For Each Folder In McFolderList
-                            Folders.Add(Folder.Path)
-                        Next
-                        Folders = Folders.Distinct.ToList
-                        For Each Folder In Folders
-                            If Folder <> PathMcFolder AndAlso Directory.Exists(Folder) Then FoldersFinal.Add(Folder)
-                        Next
-                    End If
-                    '最多 5 个线程,最少每个线程分配 10 个文件
-                    Dim FilesPerThread As Integer = Math.Max(5, Files.Count / 10 + 1)
-                    Dim FilesInThread As New List(Of NetFile)
+
+                    '====================================
+                    ' 已存在文件查找
+                    '====================================
+
+                    '整理允许进行查找的文件
+                    Dim FilesToCheck As New List(Of NetFile)
+                    Dim DisabledCopy As Boolean = Setup.Get("SystemDebugSkipCopy") '在设置中禁用了复制
                     For Each File In Files
-                        FilesInThread.Add(File)
-                        If FilesInThread.Count = FilesPerThread Then
-                            Dim FilesToRun As New List(Of NetFile)
-                            FilesToRun.AddRange(FilesInThread)
-                            RunInNewThread(Sub() StartCopy(FilesToRun, FoldersFinal), "下载 文件复制 " & Uuid)
-                            FilesInThread.Clear()
+                        If Not DisabledCopy AndAlso File.Check?.CanUseExistsFile Then
+                            FilesToCheck.Add(File)
+                        Else '不允许,直接开始下载
+                            SyncLock LockState
+                                File.State = NetState.WaitingToDownload
+                                File.IsCopy = False
+                            End SyncLock
                         End If
                     Next
-                    If FilesInThread.Any Then
-                        Dim FilesToRun As New List(Of NetFile)
-                        FilesToRun.AddRange(FilesInThread)
-                        RunInNewThread(Sub() StartCopy(FilesToRun, FoldersFinal), "下载 文件复制 " & Uuid)
-                        FilesInThread.Clear()
+                    If Not FilesToCheck.Any Then Return
+                    '获取 MC 文件夹列表
+                    Dim Folders As New List(Of String)
+                    Folders.Add(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\") '总是添加官启文件夹,因为 HMCL 会把所有文件存在这里
+                    Folders.AddRange(McFolderList.Select(Function(f) f.Location))
+                    Folders = Folders.Distinct.Where(Function(f) Directory.Exists(f)).ToList
+                    '平均分配到多个检查线程
+                    Dim ThreadCount As Integer = MathClamp(FilesToCheck.Count \ 40, 1, 8) '每个线程至少 40 个文件,最多 8 线程
+                    If ThreadCount = 1 Then '只有一个线程,直接执行
+                        CheckExistingFiles(FilesToCheck, Folders)
+                    Else
+                        Dim BaseSize = FilesToCheck.Count \ ThreadCount
+                        Dim Remainder = FilesToCheck.Count Mod ThreadCount
+                        Dim Index = 0
+                        For i = 0 To ThreadCount - 1
+                            Dim Size = BaseSize + If(i < Remainder, 1, 0)
+                            Dim ThreadFiles = FilesToCheck.GetRange(Index, Size)
+                            Index += Size
+                            RunInNewThread(Sub() CheckExistingFiles(ThreadFiles, Folders), $"下载 文件复制 {Uuid}/{GetUuid()}")
+                        Next
                     End If
                 Catch ex As Exception
-                    OnFail(New List(Of Exception) From {ex})
+                    OnFail(New List(Of Exception) From {New Exception("下载初始化失败", ex)})
                 End Try
             End Sub, "L/下载 " & Uuid)
         End Sub
-        Private Sub StartCopy(Files As List(Of NetFile), FolderList As List(Of String))
+        Private Sub CheckExistingFiles(Files As List(Of NetFile), FolderList As List(Of String))
             Try
-                If ModeDebug Then Log($"[Download] 检查线程分配文件数:{Files.Count},线程名:{Thread.CurrentThread.Name}")
-                '试图从已存在的 Minecraft 文件夹中寻找目标文件
-                Dim ExistFiles As New List(Of KeyValuePair(Of NetFile, String)) '{NetFile, Target As String}
-                For Each File As NetFile In Files
-                    Dim ExistFilePath As String = Nothing
-                    '判断是否有已存在的文件
-                    If File.Check IsNot Nothing AndAlso McFolderList IsNot Nothing AndAlso PathMcFolder IsNot Nothing AndAlso
-                        File.Check.CanUseExistsFile AndAlso File.LocalPath.StartsWithF(PathMcFolder) Then
-                        Dim Relative = File.LocalPath.Replace(PathMcFolder, "")
-                        For Each Folder In FolderList
-                            Dim Target = Folder & Relative
-                            If File.Check.Check(Target) Is Nothing Then
-                                ExistFilePath = Target
-                                Exit For
-                            End If
+                If ModeDebug Then Log($"[Download] 文件检查线程已启动,分配的文件数:{Files.Count}")
+                '列出 MC 文件夹中的各个版本文件夹
+                Dim VersionFolders As New List(Of String)
+                For Each McFolder In FolderList
+                    Dim VersionsFolder As New DirectoryInfo(McFolder & "versions\")
+                    If VersionsFolder.Exists() Then
+                        For Each VersionFolder In VersionsFolder.GetDirectories
+                            VersionFolders.Add(VersionFolder.FullName & "\")
                         Next
                     End If
-                    '若存在,则改变状态
-                    SyncLock LockState
-                        If ExistFilePath IsNot Nothing Then
-                            File.State = NetState.WaitForCopy
-                            File.IsCopy = True
-                            ExistFiles.Add(New KeyValuePair(Of NetFile, String)(File, ExistFilePath))
-                        Else
-                            File.State = NetState.WaitForDownload
-                            File.IsCopy = False
-                        End If
-                    End SyncLock
                 Next
-                '复制已存在的文件
-                For Each FileToken In ExistFiles
-                    Dim File As NetFile = FileToken.Key
-                    SyncLock LockState
-                        If File.State > NetState.WaitForCopy Then Return
-                    End SyncLock
-                    Dim LocalPath As String = FileToken.Value
-                    Dim RetryCount As Integer = 0
+                '处理每个文件
+                For Each File As NetFile In Files
+                    Dim Target As String = CheckExistingFile(FolderList, VersionFolders, File)
+                    If File.State >= NetState.WaitingToDownload Then Return '中断
+                    If Target Is Nothing Then
+                        '未找到相同文件
+                        SyncLock LockState
+                            File.State = NetState.WaitingToDownload
+                            File.IsCopy = False
+                        End SyncLock
+                    Else
+                        '已找到相同文件
+                        File.IsCopy = True
+                        Dim RetryCount As Integer = 0
 Retry:
-                    Try
-                        Log("[Download] 复制已存在的文件(" & LocalPath & ")")
-                        CopyFile(LocalPath, File.LocalPath)
-                        File.Finish(False)
-                    Catch ex As Exception
-                        RetryCount += 1
-                        Log(ex, $"复制已存在的文件失败,重试第 {RetryCount} 次({LocalPath} -> {File.LocalPath})")
-                        If RetryCount < 3 Then
-                            Thread.Sleep(200)
-                            GoTo Retry
-                        End If
-                        File.State = NetState.WaitForDownload
-                        File.IsCopy = False
-                    End Try
+                        Try
+                            If Target <> File.LocalPath Then
+                                Log($"[Download] 复制已存在的文件:{Target} → {File.LocalPath}")
+                                CopyFile(Target, File.LocalPath)
+                            End If
+                            File.Finish(False)
+                        Catch ex As Exception
+                            RetryCount += 1
+                            Log(ex, $"复制已存在的文件失败,第 {RetryCount} 次重试({Target} → {File.LocalPath})")
+                            If RetryCount < 3 Then
+                                Thread.Sleep(200)
+                                GoTo Retry
+                            End If
+                            '失败,回退到下载
+                            SyncLock LockState
+                                File.State = NetState.WaitingToDownload
+                                File.IsCopy = False
+                            End SyncLock
+                        End Try
+                    End If
                 Next
             Catch ex As Exception
-                Log(ex, "下载已存在文件查找失败", LogLevel.Feedback)
+                OnFail(New List(Of Exception) From {New Exception("下载已存在文件查找失败", ex)})
             End Try
         End Sub
+        Private Function CheckExistingFile(FolderList As List(Of String), VersionFolders As List(Of String), File As NetFile) As String
+            '目标文件已存在
+            If File.Check.Check(File.LocalPath) Is Nothing Then Return File.LocalPath
+            '没有可用的检查规则,只能开始下载
+            If File.Check.Hash Is Nothing AndAlso File.Check.ActualSize < 0 Then Return Nothing
+            '大致判断文件类别
+            Dim TypeIndexes =
+                {"\assets\", "\libraries\", "\versions\", "\mods\", "\coremods\", "\lib\", "\resourcepacks\", "\texturepacks\", "\shaderpacks\"}.
+                Select(Function(FolderName) (FolderName, File.LocalPath.IndexOfF(FolderName, True))).
+                Where(Function(kv) kv.Item2 >= 0).ToList
+            If Not TypeIndexes.Any Then
+                If File.LocalName.EndsWithF(".jar") Then
+                    TypeIndexes.Add(("\versions\", 1)) '总是对 jar 进行版本文件检查,以包括另存为 jar 的情况
+                Else
+                    Return Nothing
+                End If
+            End If
+            Dim Type = TypeIndexes.MaxOf(Function(kv) kv.Item2).FolderName.TrimStart("\"c)
+            '根据类别进行查找
+            Select Case Type
+                Case "assets\", "libraries\"
+                    'assets/libraries:查找 MC 文件夹下的相同路径
+                    For Each Folder In FolderList
+                        Dim Candidate = Folder & Type & File.LocalPath.AfterFirst(Type)
+                        If File.Check.Check(Candidate) Is Nothing Then Return Candidate
+                    Next
+                Case "versions\"
+                    '版本 jar 或 json:查找 MC 文件夹下的各个版本文件夹
+                    For Each VersionFolder In VersionFolders
+                        For Each Candidate In Directory.GetFiles(VersionFolder,
+                            "*." & GetFileNameFromPath(File.LocalPath).AfterLast(".").ToLower, SearchOption.TopDirectoryOnly)
+                            If File.Check.Check(Candidate) Is Nothing Then Return Candidate
+                        Next
+                    Next
+                Case Else
+                    '社区资源
+                    If File.Check.ActualSize < 0 OrElse File.Check.Hash Is Nothing Then Return Nothing '必须要求指定了文件大小和 Hash
+                    For Each Folder In FolderList.Concat(VersionFolders)
+                        Dim TargetFolder = Folder & Type
+                        If Not Directory.Exists(TargetFolder) Then Continue For
+                        For Each Candidate In Directory.GetFiles(TargetFolder)
+                            '快速进行大小校验
+                            Static Sizes As New SafeDictionary(Of String, Long)
+                            If Not Sizes.ContainsKey(Candidate) Then Sizes(Candidate) = New FileInfo(Candidate).Length
+                            If File.Check.ActualSize <> Sizes(Candidate) Then Continue For
+                            'Hash 校验
+                            If File.Check.Check(Candidate) Is Nothing Then Return Candidate
+                        Next
+                    Next
+            End Select
+            Return Nothing
+        End Function
 
         Public Sub OnFileFinish(File As NetFile)
             '要求全部文件完成
@@ -1655,7 +1707,7 @@ Retry:
                 [Error] = If(UsefulExs.FirstOrDefault, ExList.FirstOrDefault)
                 '获取实际失败的文件
                 For Each File In Files
-                    If File.State <> NetState.Error Then Continue For
+                    If File.State <> NetState.Interrupted Then Continue For
                     If File.Sources.All(Function(s) TypeOf s.Ex Is OperationCanceledException OrElse TypeOf s.Ex Is TimeoutException OrElse TypeOf s.Ex Is ThreadInterruptedException) Then Continue For
                     Dim Detail As String = Join(File.Sources.Select(Function(s) $"{If(s.Ex Is Nothing, "无错误信息。", s.Ex.GetBrief())}({s.Url})"), vbCrLf)
                     [Error] = New Exception("文件下载失败:" & File.LocalPath & vbCrLf &
@@ -1736,14 +1788,6 @@ Retry:
         Public FileRemain As Integer = 0
         Public ReadOnly LockRemain As New Object
 
-        ''' <summary>
-        ''' 上次记速时的已下载大小。
-        ''' </summary>
-        Private SpeedLastDone As Long = 0
-        ''' <summary>
-        ''' 至多最近 30 次下载速度的记录,较新的在前面。
-        ''' </summary>
-        Private SpeedLast As New List(Of Long)
         '这些属性由 RefreshStat 刷新
         ''' <summary>
         ''' 当前的全局下载速度,单位为 Byte / 秒。
@@ -1764,6 +1808,8 @@ Retry:
                 RefreshStatLast += DeltaTime
 #Region "刷新整体速度"
                 '计算瞬时速度
+                Static SpeedLast As New List(Of Long) '记录至多最近 30 次下载速度的记录,较新的在前面
+                Static SpeedLastDone As Long = 0 '上次记速时的已下载大小
                 Dim ActualSpeed As Double = Math.Max(0, (DownloadDone - SpeedLastDone) / (DeltaTime / 1000))
                 SpeedLast.Insert(0, ActualSpeed)
                 If SpeedLast.Count >= 31 Then SpeedLast.RemoveAt(30)
@@ -1799,8 +1845,9 @@ Retry:
         ''' 启动监控线程,用于新增下载线程。
         ''' </summary>
         Private Sub StartManager()
-            If IsManagerStarted Then Return
-            IsManagerStarted = True
+            Static IsStarted As Boolean = False
+            If IsStarted Then Return
+            IsStarted = True
             Dim ThreadStarter =
             Sub(Id As Integer) '0 或 1
                 Try
@@ -1816,9 +1863,9 @@ Retry:
                         Dim OngoingFiles As New List(Of NetFile)
                         For Each File As NetFile In AllFiles
                             If File.Uuid Mod 2 = Id Then Continue For
-                            If File.State = NetState.WaitForDownload Then
+                            If File.State = NetState.WaitingToDownload Then
                                 WaitingFiles.Add(File)
-                            ElseIf File.State < NetState.Merge Then
+                            ElseIf File.State < NetState.Merging Then
                                 OngoingFiles.Add(File)
                             End If
                         Next
@@ -1826,7 +1873,7 @@ Retry:
                         For Each File As NetFile In WaitingFiles
                             If NetTaskThreadCount >= NetTaskThreadLimit Then Continue While '最大线程数检查
                             Dim NewThread = File.TryBeginThread()
-                            If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(40) '减少 BMCLAPI 请求频率(目前每分钟限制 4000 次)
+                            If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(100) '减少 BMCLAPI 请求频率
                         Next
                         '为进行中的文件追加线程
                         If Speed >= NetTaskSpeedLimitLow Then Continue While '下载速度足够,无需新增
@@ -1836,9 +1883,9 @@ Retry:
                             Dim PreparingCount = 0, DownloadingCount = 0
                             If File.Threads IsNot Nothing Then
                                 For Each Thread As NetThread In File.Threads.ToList
-                                    If Thread.State < NetState.Download Then
+                                    If Thread.State < NetState.Downloading Then
                                         PreparingCount += 1
-                                    ElseIf Thread.State = NetState.Download Then
+                                    ElseIf Thread.State = NetState.Downloading Then
                                         DownloadingCount += 1
                                     End If
                                 Next
@@ -1846,7 +1893,7 @@ Retry:
                             '新增线程
                             If PreparingCount > DownloadingCount Then Continue For '准备中的线程已多于下载中的线程,不再新增
                             Dim NewThread = File.TryBeginThread()
-                            If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(40) '减少 BMCLAPI 请求频率(目前每分钟限制 4000 次)
+                            If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(100) '减少 BMCLAPI 请求频率
                         Next
                     End While
                 Catch ex As Exception
@@ -1858,27 +1905,26 @@ Retry:
             RunInNewThread(
             Sub()
                 Try
-                    Dim LastLoopTime As Long
-                    NetTaskSpeedLimitLeftLast = GetTimeTick()
+                    Dim NextTick As Long = GetTimeTick()
                     While True
-                        Dim TimeNow = GetTimeTick()
-                        LastLoopTime = TimeNow
                         '增加限速余量
-                        If NetTaskSpeedLimitHigh > 0 Then NetTaskSpeedLimitLeft = NetTaskSpeedLimitHigh / 1000 * (TimeNow - NetTaskSpeedLimitLeftLast)
-                        NetTaskSpeedLimitLeftLast = TimeNow
+                        If NetTaskSpeedLimitHigh > 0 Then NetTaskSpeedLimitLeft = NetTaskSpeedLimitHigh / 10
                         '刷新公开属性
                         RefreshStat()
-                        '等待直至 80 ms
-                        Do While GetTimeTick() - LastLoopTime < 80
-                            Thread.Sleep(10)
-                        Loop
+                        '等待 100 ms
+                        NextTick += 100
+                        Dim SleepTime = NextTick - GetTimeTick()
+                        If SleepTime > 0 Then
+                            Thread.Sleep(SleepTime)
+                        Else
+                            NextTick = GetTimeTick() '超时,直接追帧,不等待
+                        End If
                     End While
                 Catch ex As Exception
                     Log(ex, "下载管理刷新线程出错", LogLevel.Critical)
                 End Try
             End Sub, "NetManager StatRefresher")
         End Sub
-        Private IsManagerStarted As Boolean = False
 
         Private DownloadCacheLock As New Object
         Private IsDownloadCacheCleared As Boolean = False
@@ -1907,7 +1953,7 @@ Retry:
                     Dim File = Task.Files(i)
                     If Files.ContainsKey(File.LocalPath) Then
                         '已有该文件
-                        If Files(File.LocalPath).State >= NetState.Finish Then
+                        If Files(File.LocalPath).State >= NetState.Finished Then
                             '该文件已经下载过一次,且下载完成
                             '将已下载的文件替换成当前文件,重新下载
                             File.Tasks.Add(Task)
@@ -1915,7 +1961,7 @@ Retry:
                             SyncLock LockRemain
                                 FileRemain += 1
                             End SyncLock
-                            If ModeDebug Then Log($"[Download] {File.LocalName}:重新加入下载列表")
+                            If ModeDebug Then Log($"[Download] {File.LocalName}:重新加入下载列表,目标 {File.LocalPath}")
                         Else
                             '该文件正在下载中
                             '将当前文件替换成下载中的文件,即两个任务指向同一个文件
@@ -1929,7 +1975,7 @@ Retry:
                         SyncLock LockRemain
                             FileRemain += 1
                         End SyncLock
-                        If ModeDebug Then Log($"[Download] {File.LocalName}:已加入下载列表")
+                        If ModeDebug Then Log($"[Download] {File.LocalName}:已加入下载列表,目标 {File.LocalPath}")
                     End If
                     Task.Files(i) = File '回设
                 Next
@@ -2017,7 +2063,15 @@ Retry:
     ''' 判断某个 Exception 是否为网络问题所导致。
     ''' </summary>
     <Extension> Public Function IsNetworkRelated(Ex As Exception) As Boolean
-        Dim Detail = Ex.GetDetail()
+        '提取 Message(不能用 GetDetail,因为堆栈的方法参数中就有 timeout 字样)
+        Dim Detail As String = ""
+        Dim InnerEx As Exception = Ex
+        Detail += InnerEx.Message
+        Do Until InnerEx.InnerException Is Nothing
+            InnerEx = InnerEx.InnerException
+            Detail += InnerEx.Message
+        Loop
+        '判断
         If Detail.Contains("(403)") Then Return False
         Return {
             "(408)", "超时", "timeout", "网络请求失败", "连接尝试失败", "远程主机强迫关闭了", "远程方已关闭传输流", "未能解析此远程名称",

+ 18 - 15
Plain Craft Launcher 2/Modules/Base/MyBitmap.vb

@@ -4,11 +4,6 @@ Imports System.Drawing.Imaging
 
 Public Class MyBitmap
 
-    ''' <summary>
-    ''' 位图缓存。
-    ''' </summary>
-    Public Shared BitmapCache As New Concurrent.ConcurrentDictionary(Of String, MyBitmap)
-
     ''' <summary>
     ''' 存储的图片
     ''' </summary>
@@ -30,14 +25,17 @@ Public Class MyBitmap
     End Operator
     Public Shared Widening Operator CType(Image As MyBitmap) As ImageSource
         If Image Is Nothing Then Return Nothing
-        Dim Bitmap = Image.Pic
-        Dim rect = New System.Drawing.Rectangle(0, 0, Bitmap.Width, Bitmap.Height)
-        Dim bitmapData = Bitmap.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb)
+        Dim BitmapPic As System.Drawing.Bitmap = Image.Pic
+        Dim rect = New System.Drawing.Rectangle(0, 0, BitmapPic.Width, BitmapPic.Height)
+        Dim bitmapData = BitmapPic.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb)
         Try
-            Dim size = rect.Width * rect.Height * 4
-            Return BitmapSource.Create(Bitmap.Width, Bitmap.Height, Bitmap.HorizontalResolution, Bitmap.VerticalResolution, PixelFormats.Bgra32, Nothing, bitmapData.Scan0, size, bitmapData.Stride)
+            Dim Result = BitmapSource.Create(BitmapPic.Width, BitmapPic.Height, BitmapPic.HorizontalResolution, BitmapPic.VerticalResolution,
+                                       PixelFormats.Bgra32, Nothing, bitmapData.Scan0,
+                                       rect.Width * rect.Height * 4, bitmapData.Stride)
+            Result.Freeze()
+            Return Result
         Finally
-            Bitmap.UnlockBits(bitmapData)
+            BitmapPic.UnlockBits(bitmapData)
         End Try
     End Operator
     Public Shared Widening Operator CType(Image As System.Drawing.Bitmap) As MyBitmap
@@ -65,11 +63,12 @@ Public Class MyBitmap
             FilePathOrResourceName = FilePathOrResourceName.Replace("pack://application:,,,/images/", PathImage)
             If FilePathOrResourceName.StartsWithF(PathImage) Then
                 '使用缓存
-                If BitmapCache.ContainsKey(FilePathOrResourceName) Then
-                    Pic = BitmapCache(FilePathOrResourceName).Pic
+                Static Cache As New Concurrent.ConcurrentDictionary(Of String, MyBitmap)
+                If Cache.ContainsKey(FilePathOrResourceName) Then
+                    Pic = Cache(FilePathOrResourceName).Pic
                 Else
                     Pic = New MyBitmap(CType((New ImageSourceConverter).ConvertFromString(FilePathOrResourceName), ImageSource))
-                    BitmapCache.TryAdd(FilePathOrResourceName, Pic)
+                    Cache.TryAdd(FilePathOrResourceName, Pic)
                 End If
             Else
                 '使用这种自己接管 FileStream 的方法加载才能解除文件占用
@@ -92,7 +91,11 @@ Public Class MyBitmap
             Pic = My.Application.TryFindResource(FilePathOrResourceName)
             If Pic Is Nothing Then
                 Pic = New System.Drawing.Bitmap(1, 1)
-                Throw New Exception($"加载 MyBitmap 失败({FilePathOrResourceName})", ex)
+                If TypeOf ex Is ArgumentException Then
+                    Throw New Exception($"图片格式不支持,或图片文件损坏({FilePathOrResourceName})", ex)
+                Else
+                    Throw New Exception($"加载 MyBitmap 意外失败({FilePathOrResourceName})", ex)
+                End If
             Else
                 Log(ex, $"指定类型有误的 MyBitmap 加载({FilePathOrResourceName})", LogLevel.Developer)
                 Exit Try

+ 166 - 148
Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb

@@ -177,13 +177,15 @@
         ''' </summary>
         Public ReadOnly Tags As List(Of String)
         ''' <summary>
-        ''' Logo 图片的下载地址。若为 Nothing 则没有。
+        ''' Logo 图片的下载地址。
+        ''' 若为 Nothing 则没有,保证不为空字符串。
         ''' </summary>
         Public LogoUrl As String = Nothing
         ''' <summary>
-        ''' 游戏大版本列表。例如:18, 16, 15……
+        ''' 支持的 Drop 编号,从高到低排序,不为 Nothing。
+        ''' 例如:261(26.1.x)、180(1.18.x)。
         ''' </summary>
-        Public ReadOnly GameVersions As List(Of Integer)
+        Public ReadOnly Drops As List(Of Integer)
 
         '数据库信息
 
@@ -249,10 +251,10 @@
                 End If
                 Tags = CType(Data("Tags"), JArray).Select(Function(t) t.ToString).ToList
                 If Data.ContainsKey("LogoUrl") Then LogoUrl = Data("LogoUrl")
-                If Data.ContainsKey("GameVersions") Then
-                    GameVersions = CType(Data("GameVersions"), JArray).Select(Function(t) t.ToObject(Of Integer)).ToList
+                If Data.ContainsKey("Drops") Then
+                    Drops = CType(Data("Drops"), JArray).Select(Function(t) t.ToObject(Of Integer)).ToList
                 Else
-                    GameVersions = New List(Of Integer)
+                    Drops = New List(Of Integer)
                 End If
 #End Region
             Else
@@ -274,6 +276,7 @@
                             LogoUrl = Data("logo")("thumbnailUrl")
                         End If
                     End If
+                    If LogoUrl = "" Then LogoUrl = Nothing
                     'Type
                     If Website.Contains("/mc-mods/") OrElse Website.Contains("/mod/") Then
                         Type = CompType.Mod
@@ -288,7 +291,7 @@
                     Else
                         Type = CompType.DataPack
                     End If
-                    'FileIndexes / GameVersions / ModLoaders
+                    'FileIndexes / VanillaMajorVersions / ModLoaders
                     ModLoaders = New List(Of CompModLoaderType)
                     Dim Files As New List(Of KeyValuePair(Of Integer, List(Of String))) 'FileId, GameVersions
                     For Each File In If(Data("latestFiles"), New JArray)
@@ -296,17 +299,16 @@
                         If Not NewFile.Available Then Continue For
                         ModLoaders.AddRange(NewFile.ModLoaders)
                         Dim GameVersions = File("gameVersions").ToObject(Of List(Of String))
-                        If Not GameVersions.Any(Function(v) v.StartsWithF("1.")) Then Continue For
+                        If Not GameVersions.Any(Function(v) McVersion.IsFormatFit(v)) Then Continue For
                         Files.Add(New KeyValuePair(Of Integer, List(Of String))(File("id"), GameVersions))
                     Next
                     For Each File In If(Data("latestFilesIndexes"), New JArray) '这俩玩意儿包含的文件不一样,见 #3599
-                        If Not File("gameVersion").ToString.StartsWithF("1.") Then Continue For
+                        If Not McVersion.IsFormatFit(File("gameVersion")) Then Continue For
                         Files.Add(New KeyValuePair(Of Integer, List(Of String))(File("fileId"), {File("gameVersion").ToString}.ToList))
                     Next
                     CurseForgeFileIds = Files.Select(Function(f) f.Key).Distinct.ToList
-                    GameVersions = Files.SelectMany(Function(f) f.Value).Where(Function(v) v.StartsWithF("1.")).
-                        Select(Function(v) CInt(Val(v.Split(".")(1).BeforeFirst("-")))).Where(Function(v) v > 0).
-                        Distinct.OrderByDescending(Function(v) v).ToList
+                    Drops = Files.SelectMany(Function(f) f.Value).
+                        Select(Function(v) McVersion.VersionToDrop(v)).Where(Function(v) v > 0).Distinct.OrderByDescending(Function(v) v).ToList
                     ModLoaders = ModLoaders.Distinct.OrderBy(Of Integer)(Function(t) t).ToList
                     'Tags
                     Tags = New List(Of String)
@@ -333,6 +335,8 @@
                             Case 424 : Tags.Add("装饰")
                             Case 411 : Tags.Add("生物")
                             Case 434 : Tags.Add("装备")
+                            Case 6814 : Tags.Add("性能优化")
+                            Case 9026 : Tags.Add("创造模式")
                             Case 423 : Tags.Add("信息显示")
                             Case 435 : Tags.Add("服务器")
                             Case 5191 : Tags.Add("改良")
@@ -399,10 +403,8 @@
                     Website = $"https://modrinth.com/{Data("project_type")}/{Slug}"
                     'GameVersions
                     '搜索结果的键为 versions,获取特定工程的键为 game_versions
-                    GameVersions = If(CType(If(Data("game_versions"), Data("versions")), JArray), New JArray).
-                                       Select(Function(v) v.ToString).Where(Function(v) v.StartsWithF("1.")).
-                                       Select(Of Integer)(Function(v) Val(v.Split(".")(1).BeforeFirst("-"))).Where(Function(v) v > 0).
-                                       Distinct.OrderByDescending(Function(v) v).ToList
+                    Drops = If(CType(If(Data("game_versions"), Data("versions")), JArray), New JArray).
+                        Select(Function(v) McVersion.VersionToDrop(v)).Where(Function(v) v > 0).Distinct.OrderByDescending(Function(v) v).ToList
                     'Type
                     Select Case Data("project_type").ToString
                         Case "modpack" : Type = CompType.ModPack
@@ -523,58 +525,60 @@
             Json("DownloadCount") = DownloadCount
             If ModLoaders IsNot Nothing AndAlso ModLoaders.Any Then Json("ModLoaders") = New JArray(ModLoaders.Select(Function(m) CInt(m)))
             Json("Tags") = New JArray(Tags)
-            If Not String.IsNullOrEmpty(LogoUrl) Then Json("LogoUrl") = LogoUrl
-            If GameVersions.Any Then Json("GameVersions") = New JArray(GameVersions)
+            If LogoUrl IsNot Nothing Then Json("LogoUrl") = LogoUrl
+            If Drops.Any Then Json("Drops") = New JArray(Drops)
             Json("CacheTime") = Date.Now '用于检查缓存时间
             Return Json
         End Function
         ''' <summary>
         ''' 将当前工程信息实例化为控件。
         ''' </summary>
-        Public Function ToCompItem(ShowMcVersionDesc As Boolean, ShowLoaderDesc As Boolean) As MyCompItem
+        Public Function ToCompItem(ShowMcVersionDesc As Boolean, ShowLoaderDesc As Boolean) As MyVirtualizingElement(Of MyCompItem)
             '获取版本描述
             Dim GameVersionDescription As String
-            If GameVersions Is Nothing OrElse Not GameVersions.Any() Then
+            If Drops Is Nothing OrElse Not Drops.Any() Then
                 GameVersionDescription = "仅快照版本" '#5412
             Else
-                Dim SpaVersions As New List(Of String)
+                Dim Segments As New List(Of String)
                 Dim IsOld As Boolean = False
-                For i = 0 To GameVersions.Count - 1 '版本号一定为降序
+                For i = 0 To Drops.Count - 1 '版本号一定为降序
                     '获取当前连续的版本号段
-                    Dim StartVersion As Integer = GameVersions(i), EndVersion As Integer = GameVersions(i)
-                    If StartVersion < 10 Then '如果支持新版本,则不显示 1.9-
-                        If SpaVersions.Any() AndAlso Not IsOld Then
+                    Dim StartDrop As Integer = Drops(i), EndDrop As Integer = Drops(i)
+                    If StartDrop < 100 Then '如果支持新版本,则不显示 1.9-
+                        If Segments.Any() AndAlso Not IsOld Then
                             Exit For
                         Else
                             IsOld = True
                         End If
                     End If
-                    For ii = i + 1 To GameVersions.Count - 1
-                        If GameVersions(ii) <> EndVersion - 1 Then Exit For
-                        EndVersion = GameVersions(ii)
+                    For ii = i + 1 To Drops.Count - 1
+                        If AllDrops Is Nothing OrElse AllDrops.IndexOf(Drops(ii)) <> AllDrops.IndexOf(EndDrop) + 1 Then Exit For
+                        EndDrop = Drops(ii)
                         i = ii
                     Next
                     '将版本号段转为描述文本
-                    If StartVersion = EndVersion Then
-                        SpaVersions.Add("1." & StartVersion)
-                    ElseIf McVersionHighest > -1 AndAlso StartVersion >= McVersionHighest Then
-                        If EndVersion < 10 Then
-                            SpaVersions.Clear()
-                            SpaVersions.Add("全版本")
+                    Dim StartName = McVersion.DropToVersion(StartDrop)
+                    Dim EndName = McVersion.DropToVersion(EndDrop)
+                    If StartDrop = EndDrop Then
+                        Segments.Add(StartName)
+                    ElseIf AllDrops?.Any AndAlso StartDrop >= AllDrops.First Then
+                        If EndDrop < 100 Then
+                            Segments.Clear()
+                            Segments.Add("全版本")
                             Exit For
                         Else
-                            SpaVersions.Add("1." & EndVersion & "+")
+                            Segments.Add(EndName & "+")
                         End If
-                    ElseIf EndVersion < 10 Then
-                        SpaVersions.Add("1." & StartVersion & "-")
+                    ElseIf EndDrop < 100 Then
+                        Segments.Add(StartName & "-")
                         Exit For
-                    ElseIf StartVersion - EndVersion = 1 Then
-                        SpaVersions.Add("1." & StartVersion & ", 1." & EndVersion)
+                    ElseIf AllDrops Is Nothing OrElse AllDrops.IndexOf(EndDrop) - AllDrops.IndexOf(StartDrop) = 1 Then
+                        Segments.Add(StartName & ", " & EndName)
                     Else
-                        SpaVersions.Add("1." & StartVersion & "~1." & EndVersion)
+                        Segments.Add(StartName & "~" & EndName)
                     End If
                 Next
-                GameVersionDescription = SpaVersions.Join(", ")
+                GameVersionDescription = Segments.Join(", ")
             End If
             '获取 Mod 加载器描述
             Dim ModLoaderDescriptionFull As String, ModLoaderDescriptionPart As String
@@ -593,11 +597,11 @@
                     ModLoaderDescriptionFull = "仅 " & ModLoadersForDesc.Single.ToString
                     ModLoaderDescriptionPart = ModLoadersForDesc.Single.ToString
                 Case Else
-                    Dim MaxVersion As Integer = If(GameVersions.Any, GameVersions.Max, 99)
+                    Dim NewestDrop As Integer = If(Drops.Any, Drops.First, 9999)
                     If ModLoaders.Contains(CompModLoaderType.Forge) AndAlso
-                       (MaxVersion < 14 OrElse ModLoaders.Contains(CompModLoaderType.Fabric)) AndAlso
-                       (MaxVersion < 20 OrElse ModLoaders.Contains(CompModLoaderType.NeoForge)) AndAlso
-                       (MaxVersion < 14 OrElse ModLoaders.Contains(CompModLoaderType.Quilt) OrElse Setup.Get("ToolDownloadIgnoreQuilt")) Then
+                       (NewestDrop < 140 OrElse ModLoaders.Contains(CompModLoaderType.Fabric)) AndAlso
+                       (NewestDrop < 200 OrElse ModLoaders.Contains(CompModLoaderType.NeoForge)) AndAlso
+                       (NewestDrop < 140 OrElse ModLoaders.Contains(CompModLoaderType.Quilt) OrElse Setup.Get("ToolDownloadIgnoreQuilt")) Then
                         ModLoaderDescriptionFull = "任意"
                         ModLoaderDescriptionPart = ""
                     Else
@@ -606,55 +610,60 @@
                     End If
             End Select
             '实例化 UI
-            Dim NewItem As New MyCompItem With {.Tag = Me, .Logo = GetControlLogo()}
-            Dim Title = GetControlTitle(True)
-            NewItem.Title = Title.Key
-            If Title.Value = "" Then
-                CType(NewItem.LabTitleRaw.Parent, StackPanel).Children.Remove(NewItem.LabTitleRaw)
-            Else
-                NewItem.SubTitle = Title.Value
-            End If
-            NewItem.Tags = Tags
-            NewItem.Description = Description.Replace(vbCr, "").Replace(vbLf, "")
-            '下边栏
-            If Not ShowMcVersionDesc AndAlso Not ShowLoaderDesc Then
-                '全部隐藏
-                CType(NewItem.PathVersion.Parent, Grid).Children.Remove(NewItem.PathVersion)
-                CType(NewItem.LabVersion.Parent, Grid).Children.Remove(NewItem.LabVersion)
-                NewItem.ColumnVersion1.Width = New GridLength(0)
-                NewItem.ColumnVersion2.MaxWidth = 0
-                NewItem.ColumnVersion3.Width = New GridLength(0)
-            ElseIf ShowMcVersionDesc AndAlso ShowLoaderDesc Then
-                '全部显示
-                NewItem.LabVersion.Text = If(ModLoaderDescriptionPart = "", "", ModLoaderDescriptionPart & " ") & GameVersionDescription
-            ElseIf ShowMcVersionDesc Then
-                '仅显示版本
-                NewItem.LabVersion.Text = GameVersionDescription
-            Else
-                '仅显示 Mod 加载器
-                NewItem.LabVersion.Text = ModLoaderDescriptionFull
-            End If
-            NewItem.LabSource.Text = If(FromCurseForge, "CurseForge", "Modrinth")
-            If LastUpdate IsNot Nothing Then
-                NewItem.LabTime.Text = GetTimeSpanString(LastUpdate - Date.Now, True)
-            Else
-                NewItem.LabTime.Visibility = Visibility.Collapsed
-                NewItem.ColumnTime1.Width = New GridLength(0)
-                NewItem.ColumnTime2.Width = New GridLength(0)
-                NewItem.ColumnTime3.Width = New GridLength(0)
-            End If
-            NewItem.LabDownload.Text =
-                If(DownloadCount > 100000000, Math.Round(DownloadCount / 100000000, 2) & " 亿",
-                    If(DownloadCount > 100000, Math.Floor(DownloadCount / 10000) & " 万", DownloadCount))
-            Return NewItem
+            Return New MyVirtualizingElement(Of MyCompItem)(
+            Function()
+                Dim NewItem As New MyCompItem With {.Tag = Me}
+                ApplyLogoToMyImage(NewItem.PathLogo)
+                Dim Title = GetControlTitle(True)
+                NewItem.Title = Title.Key
+                If Title.Value = "" Then
+                    CType(NewItem.LabTitleRaw.Parent, StackPanel).Children.Remove(NewItem.LabTitleRaw)
+                Else
+                    NewItem.SubTitle = Title.Value
+                End If
+                NewItem.Tags = Tags
+                NewItem.Description = Description.Replace(vbCr, "").Replace(vbLf, "")
+                '下边栏
+                If Not ShowMcVersionDesc AndAlso Not ShowLoaderDesc Then
+                    '全部隐藏
+                    CType(NewItem.PathVersion.Parent, Grid).Children.Remove(NewItem.PathVersion)
+                    CType(NewItem.LabVersion.Parent, Grid).Children.Remove(NewItem.LabVersion)
+                    NewItem.ColumnVersion1.Width = New GridLength(0)
+                    NewItem.ColumnVersion2.MaxWidth = 0
+                    NewItem.ColumnVersion3.Width = New GridLength(0)
+                ElseIf ShowMcVersionDesc AndAlso ShowLoaderDesc Then
+                    '全部显示
+                    NewItem.LabVersion.Text = If(ModLoaderDescriptionPart = "", "", ModLoaderDescriptionPart & " ") & GameVersionDescription
+                ElseIf ShowMcVersionDesc Then
+                    '仅显示版本
+                    NewItem.LabVersion.Text = GameVersionDescription
+                Else
+                    '仅显示 Mod 加载器
+                    NewItem.LabVersion.Text = ModLoaderDescriptionFull
+                End If
+                NewItem.LabSource.Text = If(FromCurseForge, "CurseForge", "Modrinth")
+                If LastUpdate IsNot Nothing Then
+                    NewItem.LabTime.Text = GetTimeSpanString(LastUpdate - Date.Now, True)
+                Else
+                    NewItem.LabTime.Visibility = Visibility.Collapsed
+                    NewItem.ColumnTime1.Width = New GridLength(0)
+                    NewItem.ColumnTime2.Width = New GridLength(0)
+                    NewItem.ColumnTime3.Width = New GridLength(0)
+                End If
+                NewItem.LabDownload.Text =
+                    If(DownloadCount > 100000000, Math.Round(DownloadCount / 100000000, 2) & " 亿",
+                        If(DownloadCount > 100000, Math.Floor(DownloadCount / 10000) & " 万", DownloadCount))
+                Return NewItem
+            End Function) With {.Height = 64}
         End Function
-        Public Function GetControlLogo() As String
+        Public Sub ApplyLogoToMyImage(Img As MyImage)
             If String.IsNullOrEmpty(LogoUrl) Then
-                Return PathImage & "Icons/NoIcon.png"
+                Img.Source = PathImage & "Icons/NoIcon.png"
             Else
-                Return LogoUrl
+                Img.Source = LogoUrl
+                Img.FallbackSource = DlSourceModGet(LogoUrl)
             End If
-        End Function
+        End Sub
         Public Function GetControlTitle(HasModLoaderDescription As Boolean) As KeyValuePair(Of String, String)
             '检查下列代码时可以参考 #1567 的测试例
             Dim Title As String = RawName
@@ -755,7 +764,7 @@ NoSubtitle:
             'Mod 加载器一致
             If ModLoaders.Count <> Project.ModLoaders.Count OrElse ModLoaders.Except(Project.ModLoaders).Any() Then Return False
             '若不为光影,则要求 MC 版本一致
-            If Type <> CompType.Shader AndAlso (GameVersions.Count <> Project.GameVersions.Count OrElse GameVersions.Except(Project.GameVersions).Any()) Then Return False
+            If Type <> CompType.Shader AndAlso (Drops.Count <> Project.Drops.Count OrElse Drops.Except(Project.Drops).Any()) Then Return False
             '最近更新时间差距在一周以内
             If LastUpdate IsNot Nothing AndAlso Project.LastUpdate IsNot Nothing AndAlso
                Math.Abs((LastUpdate - Project.LastUpdate).Value.TotalDays) > 7 Then Return False
@@ -967,7 +976,7 @@ NoSubtitle:
 
 #Region "拒绝 1.13- Quilt(这个版本根本没有 Quilt)"
 
-        If Request.ModLoader = CompModLoaderType.Quilt AndAlso VersionSortInteger(If(Request.GameVersion, "1.15"), "1.14") = -1 Then
+        If Request.ModLoader = CompModLoaderType.Quilt AndAlso CompareVersion(If(Request.GameVersion, "1.15"), "1.14") = -1 Then
             Throw New Exception("Quilt 不支持 Minecraft " & Request.GameVersion)
         End If
 
@@ -1060,7 +1069,7 @@ Retry:
 
         '在 1.14-,部分老 Mod 没有设置支持的加载器,因此添加 Forge 筛选就会出现遗漏
         '所以,在发起请求时不筛选加载器,然后在返回的结果中自行筛除不是 Forge 的 Mod
-        Dim IsOldForgeRequest = Request.ModLoader = CompModLoaderType.Forge AndAlso Request.GameVersion?.Contains(".") AndAlso Val(Request.GameVersion.Split(".")(1)) < 14
+        Dim IsOldForgeRequest = Request.ModLoader = CompModLoaderType.Forge AndAlso McVersion.VersionToDrop(Request.GameVersion, True) < 140
         If IsOldForgeRequest Then Request.ModLoader = CompModLoaderType.Any
         Dim CurseForgeUrl As String = Request.GetCurseForgeAddress()
         Dim ModrinthUrl As String = Request.GetModrinthAddress()
@@ -1176,9 +1185,9 @@ Retry:
 
 #Region "提取非重复项,存储于 RealResults"
 
-        '将 Modrinth 排在 CurseForge 的前面,避免加载结束顺序不同导致排名不同
-        '这样做的话,去重后将优先保留 CurseForge 内容
-        RawResults = RawResults.Where(Function(x) Not x.FromCurseForge).Concat(RawResults.Where(Function(x) x.FromCurseForge)).ToList
+        '将 CurseForge 排在 Modrinth 的前面,避免加载结束顺序不同导致排名不同
+        '这样做的话,去重后将优先保留 Modrinth 的内容
+        RawResults = RawResults.Where(Function(x) x.FromCurseForge).Concat(RawResults.Where(Function(x) Not x.FromCurseForge)).ToList
         'RawResults 去重
         RawResults = RawResults.Distinct(Function(a, b) a.IsLike(b))
         '已有内容去重
@@ -1292,11 +1301,16 @@ Retry:
         ''' </summary>
         Public ReadOnly DownloadCount As Integer
         ''' <summary>
+        ''' Mod 版本号。
+        ''' 不一定是标准格式。CurseForge 上默认为 Nothing。
+        ''' </summary>
+        Public Version As String
+        ''' <summary>
         ''' 支持的 Mod 加载器列表。可能为空。
         ''' </summary>
         Public ReadOnly ModLoaders As List(Of CompModLoaderType)
         ''' <summary>
-        ''' 支持的游戏版本列表。类型包括:"1.18.5","1.18","1.18 预览版","21w15a","未知版本"。
+        ''' 支持的游戏版本列表。类型包括:"26.1.5","26.1","26.1 预览版","1.18.5","1.18","1.18 预览版","21w15a","未知版本"。
         ''' </summary>
         Public ReadOnly GameVersions As List(Of String)
         ''' <summary>
@@ -1369,6 +1383,7 @@ Retry:
                 FromCurseForge = Data("FromCurseForge").ToObject(Of Boolean)
                 Id = Data("Id").ToString
                 DisplayName = Data("DisplayName").ToString
+                If Data.ContainsKey("Version") Then Version = Data("Version").ToString
                 ReleaseDate = Data("ReleaseDate").ToObject(Of Date)
                 DownloadCount = Data("DownloadCount").ToObject(Of Integer)
                 Status = CType(Data("Status").ToObject(Of Integer), CompFileStatus)
@@ -1387,6 +1402,7 @@ Retry:
                     '简单信息
                     Id = Data("id")
                     DisplayName = Data("displayName").ToString.Replace("	", "").Trim(" ")
+                    Version = Nothing
                     ReleaseDate = Data("fileDate")
                     Status = CType(Data("releaseType").ToObject(Of Integer), CompFileStatus)
                     DownloadCount = Data("downloadCount")
@@ -1408,9 +1424,9 @@ Retry:
                     End If
                     'GameVersions
                     Dim RawVersions As List(Of String) = Data("gameVersions").Select(Function(t) t.ToString.Trim.ToLower).ToList
-                    GameVersions = RawVersions.Where(Function(v) v.StartsWithF("1.")).Select(Function(v) v.Replace("-snapshot", " 预览版")).ToList
+                    GameVersions = RawVersions.Where(Function(v) McVersion.IsFormatFit(v)).Select(Function(v) v.Replace("-snapshot", " 预览版")).ToList
                     If GameVersions.Count > 1 Then
-                        GameVersions = GameVersions.Sort(AddressOf VersionSortBoolean).ToList
+                        GameVersions = GameVersions.SortByComparison(AddressOf CompareVersionGE).ToList
                         If Type = CompType.ModPack Then GameVersions = New List(Of String) From {GameVersions(0)} '整合包理应只 “支持” 一个版本
                     ElseIf GameVersions.Count = 1 Then
                         GameVersions = GameVersions.ToList
@@ -1429,6 +1445,7 @@ Retry:
                     '简单信息
                     Id = Data("id")
                     DisplayName = Data("name").ToString.Replace("	", "").Trim(" ")
+                    Version = Data("version_number")
                     ReleaseDate = Data("date_published")
                     Status = If(Data("version_type").ToString = "release", CompFileStatus.Release, If(Data("version_type").ToString = "beta", CompFileStatus.Beta, CompFileStatus.Alpha))
                     DownloadCount = Data("downloads")
@@ -1467,15 +1484,15 @@ Retry:
                     End If
                     'GameVersions
                     Dim RawVersions As List(Of String) = Data("game_versions").Select(Function(t) t.ToString.Trim.ToLower).ToList
-                    GameVersions = RawVersions.Where(Function(v) v.StartsWithF("1.") OrElse v.StartsWithF("b1.")).
+                    GameVersions = RawVersions.Where(Function(v) v.Contains(".")).
                                                Select(Function(v) If(v.Contains("-"), v.BeforeFirst("-") & " 预览版", If(v.StartsWithF("b1."), "远古版本", v))).ToList
                     If GameVersions.Count > 1 Then
-                        GameVersions = GameVersions.Sort(AddressOf VersionSortBoolean).ToList
+                        GameVersions = GameVersions.SortByComparison(AddressOf CompareVersionGE).ToList
                         If Type = CompType.ModPack Then GameVersions = New List(Of String) From {GameVersions(0)} '整合包理应只 “支持” 一个版本
                     ElseIf GameVersions.Count = 1 Then
                         '无需处理
-                    ElseIf RawVersions.Any(Function(v) RegexCheck(v, "[0-9]{2}w[0-9]{2}[a-z]{1}")) Then
-                        GameVersions = RawVersions.Where(Function(v) RegexCheck(v, "[0-9]{2}w[0-9]{2}[a-z]{1}")).ToList
+                    ElseIf RawVersions.Any(Function(v) RegexCheck(v, "[0-9]{2}w[0-9]{2}[a-z]")) Then
+                        GameVersions = RawVersions.Where(Function(v) RegexCheck(v, "[0-9]{2}w[0-9]{2}[a-z]")).ToList
                     Else
                         GameVersions = New List(Of String) From {"未知版本"}
                     End If
@@ -1504,6 +1521,7 @@ Retry:
             Dim Json As New JObject
             Json.Add("FromCurseForge", FromCurseForge)
             Json.Add("Id", Id)
+            If Version IsNot Nothing Then Json.Add("Version", Version)
             Json.Add("DisplayName", DisplayName)
             Json.Add("ReleaseDate", ReleaseDate)
             Json.Add("DownloadCount", DownloadCount)
@@ -1521,56 +1539,56 @@ Retry:
         ''' 将当前文件信息实例化为控件。
         ''' </summary>
         Public Function ToListItem(OnClick As MyListItem.ClickEventHandler, Optional OnSaveClick As MyIconButton.ClickEventHandler = Nothing,
-                                   Optional BadDisplayName As Boolean = False) As MyListItem
-
-            '获取描述信息
-            Dim Title As String = If(BadDisplayName, FileName, DisplayName)
-            Dim Info As New List(Of String)
-            If Title <> FileName.BeforeLast(".") Then Info.Add(FileName.BeforeLast("."))
-            If Dependencies.Any Then Info.Add(Dependencies.Count & " 项前置")
-            If GameVersions.All(Function(v) Not IsVersionNameLikeRelease(v)) Then Info.Add($"游戏版本 {Join(GameVersions, "、")}")
-            If DownloadCount > 0 Then 'CurseForge 的下载次数经常错误地返回 0
-                Info.Add("下载 " & If(DownloadCount > 100000, Math.Round(DownloadCount / 10000) & " 万次", DownloadCount & " 次"))
-            End If
-            Info.Add("更新于 " & GetTimeSpanString(ReleaseDate - Date.Now, False))
-            If Status <> CompFileStatus.Release Then Info.Add(StatusDescription)
-
-            '建立控件
-            Dim NewItem As New MyListItem With {
-                .Title = Title,
-                .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Me,
-                .Info = Info.Join(",")
-            }
-            Select Case Status
-                Case CompFileStatus.Release
-                    NewItem.Logo = PathImage & "Icons/R.png"
-                Case CompFileStatus.Beta
-                    NewItem.Logo = PathImage & "Icons/B.png"
-                Case Else 'Alpha
-                    NewItem.Logo = PathImage & "Icons/A.png"
-            End Select
-            AddHandler NewItem.Click, OnClick
-
-            '建立另存为按钮
-            If OnSaveClick IsNot Nothing Then
-                Dim BtnSave As New MyIconButton With {.Logo = Logo.IconButtonSave, .ToolTip = "另存为"}
-                ToolTipService.SetPlacement(BtnSave, Primitives.PlacementMode.Center)
-                ToolTipService.SetVerticalOffset(BtnSave, 30)
-                ToolTipService.SetHorizontalOffset(BtnSave, 2)
-                AddHandler BtnSave.Click, OnSaveClick
-                NewItem.Buttons = {BtnSave}
-            End If
-
-            '结束
-            Return NewItem
+                                   Optional BadDisplayName As Boolean = False) As MyVirtualizingElement(Of MyListItem)
+            Return New MyVirtualizingElement(Of MyListItem)(
+            Function()
+                '获取描述信息
+                Dim Title As String = If(BadDisplayName, FileName, DisplayName)
+                Dim Info As New List(Of String)
+                If Title <> FileName.BeforeLast(".") Then Info.Add(FileName.BeforeLast("."))
+                If Dependencies.Any Then Info.Add(Dependencies.Count & " 项前置")
+                If GameVersions.All(
+                Function(VerName)
+                    Return Not VerName.Contains(".") OrElse {"w", "snapshot", "rc", "pre", "experimental", "-"}.Any(Function(s) VerName.ContainsF(s, True))
+                End Function) Then Info.Add($"游戏版本 {Join(GameVersions, "、")}")
+                If DownloadCount > 0 Then 'CurseForge 的下载次数经常错误地返回 0
+                    Info.Add("下载 " & If(DownloadCount > 100000, Math.Round(DownloadCount / 10000) & " 万次", DownloadCount & " 次"))
+                End If
+                Info.Add("更新于 " & GetTimeSpanString(ReleaseDate - Date.Now, False))
+                If Status <> CompFileStatus.Release Then Info.Add(StatusDescription)
+
+                '建立控件
+                Dim NewItem As New MyListItem With {
+                    .Title = Title,
+                    .SnapsToDevicePixels = True, .Height = 42, .Type = MyListItem.CheckType.Clickable, .Tag = Me,
+                    .Info = Info.Join(",")
+                }
+                Select Case Status
+                    Case CompFileStatus.Release
+                        NewItem.Logo = PathImage & "Icons/R.png"
+                    Case CompFileStatus.Beta
+                        NewItem.Logo = PathImage & "Icons/B.png"
+                    Case Else 'Alpha
+                        NewItem.Logo = PathImage & "Icons/A.png"
+                End Select
+                AddHandler NewItem.Click, OnClick
+
+                '建立另存为按钮
+                If OnSaveClick IsNot Nothing Then
+                    Dim BtnSave As New MyIconButton With {.Logo = Logo.IconButtonSave, .ToolTip = "另存为"}
+                    ToolTipService.SetPlacement(BtnSave, Primitives.PlacementMode.Center)
+                    ToolTipService.SetVerticalOffset(BtnSave, 30)
+                    ToolTipService.SetHorizontalOffset(BtnSave, 2)
+                    AddHandler BtnSave.Click, OnSaveClick
+                    NewItem.Buttons = {BtnSave}
+                End If
+                Return NewItem
+            End Function) With {.Height = 42}
         End Function
 
-        '辅助函数
-
         Public Overrides Function ToString() As String
             Return $"{Id}: {FileName}"
         End Function
-
     End Class
 
     '获取

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

@@ -2,9 +2,9 @@
 
     '构造函数
     Private TempFolder As String
-    Private TargetVersion As McVersion
-    Public Sub New(Optional TargetVersion As McVersion = Nothing)
-        Me.TargetVersion = TargetVersion
+    Private TargetInstance As McInstance
+    Public Sub New(Optional TargetInstance As McInstance = Nothing)
+        Me.TargetInstance = TargetInstance
         '构建文件结构
         TempFolder = RequestTaskTempFolder()
         Directory.CreateDirectory(TempFolder & "Temp\")
@@ -391,7 +391,7 @@ Extracted:
     ''' <summary>
     ''' 根据 AnalyzeLogs 与可能的版本信息分析崩溃原因。
     ''' </summary>
-    Public Sub Analyze(Optional Version As McVersion = Nothing)
+    Public Sub Analyze()
         Log("[Crash] 步骤 3:分析崩溃原因")
         LogAll = If(LogMc, If(LogMcDebug, "")) & If(LogHs, "") & If(LogCrash, "")
 
@@ -538,7 +538,7 @@ Done:
             '确定的 Mod 导致崩溃
             If LogMc.Contains("Caught exception from ") Then AppendReason(CrashReason.确定Mod导致游戏崩溃, TryAnalyzeModName(RegexSeek(LogMc, "(?<=Caught exception from )[^\n]+?")?.TrimEnd((vbCrLf & " ").ToCharArray)))
             'Mod 重复 / 前置问题
-            If LogMc.Contains("DuplicateModsFoundException") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(LogMc, "(?<=\n\t[\w]+ : [A-Z]{1}:[^\n]+(/|\\))[^/\\\n]+?.jar", RegularExpressions.RegexOptions.IgnoreCase))
+            If LogMc.Contains("DuplicateModsFoundException") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(LogMc, "(?<=\n\t[\w]+ : [A-Z]:[^\n]+(/|\\))[^/\\\n]+?.jar", RegularExpressions.RegexOptions.IgnoreCase))
             If LogMc.Contains("Found a duplicate mod") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(If(RegexSeek(LogMc, "Found a duplicate mod[^\n]+"), ""), "[^\\/]+.jar", RegularExpressions.RegexOptions.IgnoreCase))
             If LogMc.Contains("Found duplicate mods") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(LogMc, "(?<=Mod ID: ')\w+?(?=' from mod files:)").Distinct.ToList)
             If LogMc.Contains("ModResolutionException: Duplicate") Then AppendReason(CrashReason.Mod重复安装, RegexSearch(If(RegexSeek(LogMc, "ModResolutionException: Duplicate[^\n]+"), ""), "[^\\/]+.jar", RegularExpressions.RegexOptions.IgnoreCase))
@@ -607,7 +607,7 @@ Done:
                 Return True
             End If
             'JSON 名称匹配
-            For Each JsonName In RegexSearch(LogText, "(?<=^[^\t]+[ \[{(]{1})[^ \[{(]+\.[^ ]+(?=\.json)", RegularExpressions.RegexOptions.Multiline)
+            For Each JsonName In RegexSearch(LogText, "(?<=^[^\t]+[ \[{(])[^ \[{(]+\.[^ ]+(?=\.json)", RegularExpressions.RegexOptions.Multiline)
                 AppendReason(CrashReason.ModMixin失败,
                              TryAnalyzeModName(JsonName.Replace("mixins", "mixin").Replace(".mixin", "").Replace("mixin.", "")))
                 Return True
@@ -926,7 +926,7 @@ NextStack:
         '上报
         If IsManualAnalyze Then Return
         Telemetry("Minecraft 崩溃",
-                  "Version", If(TargetVersion Is Nothing, "null", TargetVersion.Version.ToString),
+                  "Version", If(TargetInstance Is Nothing, "null", TargetInstance.VersionDisplayName),
                   "Detail", FilterUserName(Detail, "*"))
     End Sub
     ''' <summary>

+ 159 - 120
Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb

@@ -6,40 +6,40 @@
     ''' 返回某 Minecraft 版本对应的原版主 Jar 文件的下载信息,要求对应依赖版本已存在。
     ''' 失败则抛出异常,不需要下载则返回 Nothing。
     ''' </summary>
-    Public Function DlClientJarGet(Version As McVersion, ReturnNothingOnFileUseable As Boolean) As NetFile
+    Public Function DlClientJarGet(Instance As McInstance, ReturnNothingOnFileUseable As Boolean) As NetFile
         '获取底层继承版本
         Try
-            Do While Not String.IsNullOrEmpty(Version.InheritVersion)
-                Version = New McVersion(Version.InheritVersion)
+            Do While Not String.IsNullOrEmpty(Instance.InheritName)
+                Instance = New McInstance(Instance.InheritName)
             Loop
         Catch ex As Exception
             Log(ex, "获取底层继承版本失败")
         End Try
         '检查 Json 是否标准
-        If Version.JsonObject("downloads") Is Nothing OrElse Version.JsonObject("downloads")("client") Is Nothing OrElse Version.JsonObject("downloads")("client")("url") Is Nothing Then
-            Throw New Exception("底层版本 " & Version.Name & " 中无 jar 文件下载信息")
+        If Instance.JsonObject("downloads") Is Nothing OrElse Instance.JsonObject("downloads")("client") Is Nothing OrElse Instance.JsonObject("downloads")("client")("url") Is Nothing Then
+            Throw New Exception("底层版本 " & Instance.Name & " 中无 jar 文件下载信息")
         End If
         '检查文件
-        Dim Checker As New FileChecker(MinSize:=1024, ActualSize:=If(Version.JsonObject("downloads")("client")("size"), -1), Hash:=Version.JsonObject("downloads")("client")("sha1"))
-        If ReturnNothingOnFileUseable AndAlso Checker.Check(Version.Path & Version.Name & ".jar") Is Nothing Then Return Nothing '通过校验
+        Dim Checker As New FileChecker(MinSize:=1024, ActualSize:=If(Instance.JsonObject("downloads")("client")("size"), -1), Hash:=Instance.JsonObject("downloads")("client")("sha1"))
+        If ReturnNothingOnFileUseable AndAlso Checker.Check(Instance.PathVersion & Instance.Name & ".jar") Is Nothing Then Return Nothing '通过校验
         '返回下载信息
-        Dim JarUrl As String = Version.JsonObject("downloads")("client")("url")
-        Return New NetFile(DlSourceLauncherOrMetaGet(JarUrl), Version.Path & Version.Name & ".jar", Checker)
+        Dim JarUrl As String = Instance.JsonObject("downloads")("client")("url")
+        Return New NetFile(DlSourceLauncherOrMetaGet(JarUrl), Instance.PathVersion & Instance.Name & ".jar", Checker)
     End Function
 
     ''' <summary>
     ''' 返回某 Minecraft 版本对应的原版主 AssetIndex 文件的下载信息,要求对应依赖版本已存在。
     ''' 若未找到,则会返回 Legacy 资源文件或 Nothing。
     ''' </summary>
-    Public Function DlClientAssetIndexGet(Version As McVersion) As NetFile
+    Public Function DlClientAssetIndexGet(Instance As McInstance) As NetFile
         '获取底层继承版本
-        Do While Not String.IsNullOrEmpty(Version.InheritVersion)
-            Version = New McVersion(Version.InheritVersion)
+        Do While Not String.IsNullOrEmpty(Instance.InheritName)
+            Instance = New McInstance(Instance.InheritName)
         Loop
         '获取信息
-        Dim IndexInfo = McAssetsGetIndex(Version, True, True)
-        Dim IndexAddress As String = PathMcFolder & "assets\indexes\" & IndexInfo("id").ToString & ".json"
-        Log("[Download] 版本 " & Version.Name & " 对应的资源文件索引为 " & IndexInfo("id").ToString)
+        Dim IndexInfo = McAssetsGetIndex(Instance, True, True)
+        Dim IndexAddress As String = McFolderSelected & "assets\indexes\" & IndexInfo("id").ToString & ".json"
+        Log("[Download] 版本 " & Instance.Name & " 对应的资源文件索引为 " & IndexInfo("id").ToString)
         Dim IndexUrl As String = If(IndexInfo("url"), "")
         If IndexUrl = "" Then
             Return Nothing
@@ -51,12 +51,12 @@
     ''' <summary>
     ''' 构造补全某 Minecraft 版本的所有文件的加载器列表。失败会抛出异常。
     ''' </summary>
-    Public Function DlClientFix(Version As McVersion, CheckAssetsHash As Boolean, AssetsIndexBehaviour As AssetsIndexExistsBehaviour) As List(Of LoaderBase)
+    Public Function DlClientFix(Instance As McInstance, CheckAssetsHash As Boolean, AssetsIndexBehaviour As AssetsIndexExistsBehaviour) As List(Of LoaderBase)
         Dim Loaders As New List(Of LoaderBase)
 
 #Region "下载支持库文件"
         Dim LoadersLib As New List(Of LoaderBase) From {
-            New LoaderTask(Of String, List(Of NetFile))("分析缺失支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibFix(Version)) With {.ProgressWeight = 1},
+            New LoaderTask(Of String, List(Of NetFile))("分析缺失支持库文件", Sub(Task As LoaderTask(Of String, List(Of NetFile))) Task.Output = McLibNetFilesFromInstance(Instance)) With {.ProgressWeight = 1},
             New LoaderDownload("下载支持库文件", New List(Of NetFile)) With {.ProgressWeight = 15}
         }
         '构造加载器
@@ -64,7 +64,7 @@
 #End Region
 
 #Region "下载资源文件"
-        If ShouldIgnoreFileCheck(Version) Then
+        If ShouldIgnoreFileCheck(Instance) Then
             Log("[Download] 已跳过所有 Assets 检查")
         Else
             Dim LoadersAssets As New List(Of LoaderBase)
@@ -72,10 +72,10 @@
             LoadersAssets.Add(New LoaderTask(Of String, List(Of NetFile))("分析资源文件索引地址",
             Sub(Task As LoaderTask(Of String, List(Of NetFile)))
                 Try
-                    Dim IndexFile = DlClientAssetIndexGet(Version)
+                    Dim IndexFile = DlClientAssetIndexGet(Instance)
                     If IndexFile Is Nothing Then
                         Task.Output = New List(Of NetFile)
-                        Log("[Download] 未找到版本 " & Version.Name & " 的合适的资源索引下载地址,游戏 assets 可能缺失", LogLevel.Debug)
+                        Log("[Download] 未找到版本 " & Instance.Name & " 的合适的资源索引下载地址,游戏 assets 可能缺失", LogLevel.Debug)
                     ElseIf AssetsIndexBehaviour <> AssetsIndexExistsBehaviour.AlwaysDownload AndAlso IndexFile.Check.Check(IndexFile.LocalPath) Is Nothing Then
                         Task.Output = New List(Of NetFile)
                     Else
@@ -94,9 +94,9 @@
                 Dim RealAddress As String = Nothing
                 LoadersAssetsUpdate.Add(New LoaderTask(Of String, List(Of NetFile))("后台分析资源文件索引地址",
                 Sub(Task As LoaderTask(Of String, List(Of NetFile)))
-                    Dim BackAssetsFile As NetFile = DlClientAssetIndexGet(Version)
+                    Dim BackAssetsFile As NetFile = DlClientAssetIndexGet(Instance)
                     If BackAssetsFile Is Nothing Then
-                        Log("[Download] 未找到版本 " & Version.Name & " 的合适的资源索引下载地址,游戏 assets 可能缺失", LogLevel.Debug)
+                        Log("[Download] 未找到版本 " & Instance.Name & " 的合适的资源索引下载地址,游戏 assets 可能缺失", LogLevel.Debug)
                         Task.Abort()
                         Throw New ThreadInterruptedException
                     End If
@@ -121,14 +121,12 @@
                 Updater.Start()
             End If
             '获取资源文件地址
-            LoadersAssets.Add(New LoaderTask(Of String, List(Of NetFile))("分析缺失资源文件",
-            Sub(Task As LoaderTask(Of String, List(Of NetFile)))
-                Task.Output = McAssetsFixList(Version, CheckAssetsHash, Task)
-            End Sub) With {.ProgressWeight = 3})
+            LoadersAssets.Add(New LoaderTask(Of String, List(Of NetFile))("获取资源文件列表",
+                Sub(Task) Task.Output = McAssetsFixList(Instance, CheckAssetsHash, Task)) With {.ProgressWeight = 0.01})
             '下载资源文件
             LoadersAssets.Add(New LoaderDownload("下载资源文件", New List(Of NetFile)) With {.ProgressWeight = 25})
             '构造加载器
-            Loaders.Add(New LoaderCombo(Of String)("下载资源文件(主加载器)", LoadersAssets) With {.Block = False, .Show = False, .ProgressWeight = 30.5})
+            Loaders.Add(New LoaderCombo(Of String)("下载资源文件(主加载器)", LoadersAssets) With {.Block = False, .Show = False, .ProgressWeight = 27})
         End If
 #End Region
 
@@ -153,6 +151,23 @@
 
 #Region "DlClientList | Minecraft 客户端 版本列表"
 
+    ''' <summary>
+    ''' 所有正式版的 Minecraft Drop 序数,按从高到低排列。
+    ''' Nothing 代表从未完成过获取。
+    ''' </summary>
+    Public Property AllDrops As List(Of Integer)
+        Get
+            If _AllDrops Is Nothing Then _AllDrops = Setup.Get("CacheDrops").ToString.Split(","c).Select(Function(d) CInt(d)).ToList()
+            If Not _AllDrops.Any Then _AllDrops = Nothing
+            Return _AllDrops
+        End Get
+        Set(value As List(Of Integer))
+            _AllDrops = value
+            Setup.Set("CacheDrops", value.Join(","))
+        End Set
+    End Property
+    Private _AllDrops As List(Of Integer) = Nothing
+
     '主加载器
     Public Structure DlClientListResult
         ''' <summary>
@@ -167,10 +182,6 @@
         ''' 获取到的 Json 数据。
         ''' </summary>
         Public Value As JObject
-        '''' <summary>
-        '''' 官方源的失败原因。若没有则为 Nothing。
-        '''' </summary>
-        'Public OfficialError As Exception
     End Structure
     ''' <summary>
     ''' Minecraft 客户端 版本列表,主加载器。
@@ -195,6 +206,12 @@
                     New KeyValuePair(Of LoaderTask(Of String, DlClientListResult), Integer)(DlClientListBmclapiLoader, 60 + 60)
                 }, Loader.IsForceRestarting)
         End Select
+        '提取所有 Drop 序数
+        Dim Drops As New List(Of Integer)
+        For Each Version As JObject In Loader.Output.Value("versions")
+            Drops.Add(McVersion.VersionToDrop(Version("id")))
+        Next
+        AllDrops = Drops.Distinct.OrderByDescending(Function(d) d).ToList()
     End Sub
 
     '各个下载源的分加载器
@@ -202,8 +219,6 @@
     ''' Minecraft 客户端 版本列表,Mojang 官方源加载器。
     ''' </summary>
     Public DlClientListMojangLoader As New LoaderTask(Of String, DlClientListResult)("DlClientList Mojang", AddressOf DlClientListMojangMain)
-    Private IsNewClientVersionHinted As Boolean = False
-    Private ReadOnly HintLock As New Object() ' 线程安全锁
     Private Sub DlClientListMojangMain(Loader As LoaderTask(Of String, DlClientListResult))
         Dim StartTime As Long = GetTimeTick()
         Dim Json As JObject = GetJson(NetRequestByClientRetry("https://launchermeta.mojang.com/mc/game/version_manifest.json", RequireJson:=True))
@@ -220,29 +235,25 @@
             If File.Exists(PathTemp & "Cache\download.json") Then Versions.Merge(GetJson(ReadFile(PathTemp & "Cache\download.json")))
             '返回
             Loader.Output = New DlClientListResult With {.IsOfficial = True, .SourceName = "Mojang 官方源", .Value = Json}
-            '解析更新提示(Release)
-            Dim Version As String = Json("latest")("release")
-            If Setup.Get("ToolUpdateRelease") AndAlso Not Setup.Get("ToolUpdateReleaseLast") = "" AndAlso Version IsNot Nothing AndAlso Not Setup.Get("ToolUpdateReleaseLast") = Version Then
-                SyncLock HintLock
-                    If Not IsNewClientVersionHinted Then ' 在锁内再次检查
-                        McDownloadClientUpdateHint(Version, Json)
-                        IsNewClientVersionHinted = True
-                    End If
-                End SyncLock
-            End If
-            McVersionHighest = Version.Split(".")(1)
-            Setup.Set("ToolUpdateReleaseLast", Version)
-            '解析更新提示(Snapshot)
+            'MC 更新提示
+            Static IsHinted As Boolean = False
+            Dim Version As String
+            '快照版
             Version = Json("latest")("snapshot")
-            If Setup.Get("ToolUpdateSnapshot") AndAlso Not Setup.Get("ToolUpdateSnapshotLast") = "" AndAlso Version IsNot Nothing AndAlso Not Setup.Get("ToolUpdateSnapshotLast") = Version Then
-                SyncLock HintLock
-                    If Not IsNewClientVersionHinted Then ' 在锁内再次检查
-                        McDownloadClientUpdateHint(Version, Json)
-                        IsNewClientVersionHinted = True
-                    End If
-                End SyncLock
+            If Setup.Get("ToolUpdateSnapshot") AndAlso Not Setup.Get("ToolUpdateSnapshotLast") = "" AndAlso
+               Setup.Get("ToolUpdateSnapshotLast") <> Version AndAlso Not IsHinted Then
+                IsHinted = True
+                McDownloadClientUpdateHint(Version, Json)
             End If
             Setup.Set("ToolUpdateSnapshotLast", If(Version, "Nothing"))
+            '正式版
+            Version = Json("latest")("release")
+            If Setup.Get("ToolUpdateRelease") AndAlso Not Setup.Get("ToolUpdateReleaseLast") = "" AndAlso
+               Setup.Get("ToolUpdateReleaseLast") <> Version AndAlso Not IsHinted Then
+                IsHinted = True
+                McDownloadClientUpdateHint(Version, Json)
+            End If
+            Setup.Set("ToolUpdateReleaseLast", Version)
         Catch ex As Exception
             Throw New Exception("Minecraft 官方源版本列表解析失败", ex)
         End Try
@@ -329,15 +340,15 @@
         ''' <summary>
         ''' 显示名称,已去除 HD_U 字样,如“1.12.2 C8”。
         ''' </summary>
-        Public NameDisplay As String
+        Public DisplayName As String
         ''' <summary>
         ''' 原始文件名称,如“preview_OptiFine_1.11_HD_U_E1_pre.jar”。
         ''' </summary>
-        Public NameFile As String
+        Public FileName As String
         ''' <summary>
         ''' 对应的版本名称,如“1.13.2-OptiFine_HD_U_E6”。
         ''' </summary>
-        Public NameVersion As String
+        Public InstanceName As String
         ''' <summary>
         ''' 是否为测试版。
         ''' </summary>
@@ -409,14 +420,14 @@
             For i = 0 To ReleaseTime.Count - 1
                 Name(i) = Name(i).Replace("_", " ")
                 Dim Entry As New DlOptiFineListEntry With {
-                             .NameDisplay = Name(i).Replace("HD U ", "").Replace(".0 ", " "),
-                             .ReleaseTime = Join({ReleaseTime(i).Split(".")(2), ReleaseTime(i).Split(".")(1), ReleaseTime(i).Split(".")(0)}, "/"),
-                             .IsPreview = Name(i).ContainsF("pre", True),
-                             .Inherit = Name(i).ToString.Split(" ")(0),
-                             .NameFile = If(Name(i).ContainsF("pre", True), "preview_", "") & "OptiFine_" & Name(i).Replace(" ", "_") & ".jar",
-                             .RequiredForgeVersion = Forge(i).Replace("Forge ", "").Replace("#", "")}
+                    .DisplayName = Name(i).Replace("HD U ", "").Replace(".0 ", " "),
+                    .ReleaseTime = Join({ReleaseTime(i).Split(".")(2), ReleaseTime(i).Split(".")(1), ReleaseTime(i).Split(".")(0)}, "/"),
+                    .IsPreview = Name(i).ContainsF("pre", True),
+                    .Inherit = Name(i).ToString.Split(" ")(0),
+                    .FileName = If(Name(i).ContainsF("pre", True), "preview_", "") & "OptiFine_" & Name(i).Replace(" ", "_") & ".jar",
+                    .RequiredForgeVersion = Forge(i).Replace("Forge ", "").Replace("#", "")}
                 If Entry.RequiredForgeVersion.Contains("N/A") Then Entry.RequiredForgeVersion = Nothing
-                Entry.NameVersion = Entry.Inherit & "-OptiFine_" & Name(i).ToString.Replace(" ", "_").Replace(Entry.Inherit & "_", "")
+                Entry.InstanceName = Entry.Inherit & "-OptiFine_" & Name(i).ToString.Replace(" ", "_").Replace(Entry.Inherit & "_", "")
                 Versions.Add(Entry)
             Next
             Loader.Output = New DlOptiFineListResult With {.IsOfficial = True, .SourceName = "OptiFine 官方源", .Value = Versions}
@@ -435,15 +446,15 @@
             Dim Versions As New List(Of DlOptiFineListEntry)
             For Each Token As JObject In Json
                 Dim Entry As New DlOptiFineListEntry With {
-                             .NameDisplay = (Token("mcversion").ToString & Token("type").ToString.Replace("HD_U", "").Replace("_", " ") & " " & Token("patch").ToString).Replace(".0 ", " "),
-                             .ReleaseTime = "",
-                             .IsPreview = Token("patch").ToString.ContainsF("pre", True),
-                             .Inherit = Token("mcversion").ToString,
-                             .NameFile = Token("filename").ToString,
-                             .RequiredForgeVersion = If(Token("forge"), "").ToString.Replace("Forge ", "").Replace("#", "")
-                         }
+                    .DisplayName = (Token("mcversion").ToString & Token("type").ToString.Replace("HD_U", "").Replace("_", " ") & " " & Token("patch").ToString).Replace(".0 ", " "),
+                    .ReleaseTime = "",
+                    .IsPreview = Token("patch").ToString.ContainsF("pre", True),
+                    .Inherit = Token("mcversion").ToString,
+                    .FileName = Token("filename").ToString,
+                    .RequiredForgeVersion = If(Token("forge"), "").ToString.Replace("Forge ", "").Replace("#", "")
+                }
                 If Entry.RequiredForgeVersion.Contains("N/A") Then Entry.RequiredForgeVersion = Nothing
-                Entry.NameVersion = Entry.Inherit & "-OptiFine_" & (Token("type").ToString & " " & Token("patch").ToString).Replace(".0 ", " ").Replace(" ", "_").Replace(Entry.Inherit & "_", "")
+                Entry.InstanceName = Entry.Inherit & "-OptiFine_" & (Token("type").ToString & " " & Token("patch").ToString).Replace(".0 ", " ").Replace(" ", "_").Replace(Entry.Inherit & "_", "")
                 Versions.Add(Entry)
             Next
             Loader.Output = New DlOptiFineListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Versions}
@@ -503,7 +514,7 @@
         Dim Result As String = NetRequestByClientRetry("https://files.minecraftforge.net/maven/net/minecraftforge/forge/index_1.2.4.html", Encoding:=Encoding.Default, Accept:="text/html", SimulateBrowserHeaders:=True)
         If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")")
         '获取所有版本信息
-        Dim Names As List(Of String) = RegexSearch(Result, "(?<=a href=""index_)[0-9.]+(_pre[0-9]?)?(?=.html)")
+        Dim Names As List(Of String) = RegexSearch(Result, "(?<=a href=""index_)[0-9.]+((_pre|[_-]snapshot[_-]?)[0-9]?)?(?=.html)")
         Names.Add("1.2.4") '1.2.4 不会被匹配上
         If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")")
         Loader.Output = New DlForgeListResult With {.IsOfficial = True, .SourceName = "Forge 官方源", .Value = Names}
@@ -514,11 +525,10 @@
     ''' </summary>
     Public DlForgeListBmclapiLoader As New LoaderTask(Of Integer, DlForgeListResult)("DlForgeList Bmclapi", AddressOf DlForgeListBmclapiMain)
     Private Sub DlForgeListBmclapiMain(Loader As LoaderTask(Of Integer, DlForgeListResult))
-        Dim Result As String = NetRequestByClientRetry("https://bmclapi2.bangbang93.com/forge/minecraft", Encoding:=Encoding.Default)
-        If Result.Length < 200 Then Throw New Exception("获取到的版本列表长度不足(" & Result & ")")
-        '获取所有版本信息
-        Dim Names As List(Of String) = RegexSearch(Result, "[0-9.]+(_pre[0-9]?)?")
-        If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足(" & Result & ")")
+        Dim Result As JArray = GetJson(NetRequestByClientRetry("https://bmclapi2.bangbang93.com/forge/minecraft",
+                                                       Encoding:=Encoding.Default, RequireJson:=True))
+        Dim Names As List(Of String) = Result.Select(Function(v) v.ToString).ToList
+        If Names.Count < 10 Then Throw New Exception("获取到的版本数量不足")
         Loader.Output = New DlForgeListResult With {.IsOfficial = False, .SourceName = "BMCLAPI", .Value = Names}
     End Sub
 
@@ -527,60 +537,47 @@
 #Region "DlForgeVersion | Forge 版本列表"
 
     Public MustInherit Class DlForgelikeEntry
+        Implements IComparable(Of DlForgelikeEntry)
+
         Public IsNeoForge As Boolean
         ''' <summary>
         ''' 加载器名称。Forge 或 NeoForge。
         ''' </summary>
-        Public ReadOnly Property LoaderName As String
-            Get
-                Return If(IsNeoForge, "NeoForge", "Forge")
-            End Get
-        End Property
+        Public MustOverride ReadOnly Property LoaderName As String
         ''' <summary>
         ''' 文件扩展名。不以小数点开头。
         ''' </summary>
-        Public ReadOnly Property FileExtension As String
-            Get
-                If IsNeoForge Then
-                    Return "jar"
-                Else
-                    Return If(CType(Me, DlForgeVersionEntry).Category = "installer", "jar", "zip")
-                End If
-            End Get
-        End Property
-        ''' <summary>
-        ''' Forge:MC 版本是否小于 1.13。
-        ''' NeoForge:MC 版本是否为 1.20.1。
-        ''' </summary>
-        Public ReadOnly Property IsLegacy As Boolean
-            Get
-                '虽然很抽象,但确实可以这样判断
-                'Forge:1.13+ 的版本号首位都大于 20
-                'NeoForge:1.20.1 的版本号首位人为规定为 19 开头
-                Return Version.Major < 20
-            End Get
-        End Property
+        Public MustOverride ReadOnly Property FileExtension As String
         ''' <summary>
-        ''' 标准化后的版本号,仅可用于比较与排序。
+        ''' 标准化后的版本号,仅可用于比较与排序,且 NeoForge 项不包含 alpha/beta 编号!
         ''' 格式:Major.Minor.Build.Revision
         ''' Forge:如 “50.1.9.0”(最后一位固定为 0)、“14.22.1.2478”(Legacy)。
         ''' NeoForge:如 “20.4.30.0”(最后一位固定为 0)、“19.47.1.99”(Legacy:第一位固定为 19)。
         ''' </summary>
         Public Version As Version
         ''' <summary>
-        ''' 可对玩家显示的非格式化版本名。
+        ''' 可读的非格式化版本名。
         ''' Forge:如 “50.1.9”、“14.22.1.2478”(Legacy)。
         ''' NeoForge:如 “20.4.30-beta”、“47.1.99”(Legacy)。
         ''' </summary>
         Public VersionName As String
         ''' <summary>
-        ''' 对应的 Minecraft 版本,如“1.12.2”。
+        ''' 对应的 Minecraft 版本,如 1.12.2、26.1-snapshot-1。
         ''' </summary>
         Public Inherit As String
+
+        Public Function CompareTo(other As DlForgelikeEntry) As Integer Implements IComparable(Of DlForgelikeEntry).CompareTo
+            If Version <> other.Version Then
+                Return Version.CompareTo(other.Version)
+            Else
+                Return CompareVersion(VersionName, other.VersionName)
+            End If
+        End Function
     End Class
 
     Public Class DlForgeVersionEntry
         Inherits DlForgelikeEntry
+
         ''' <summary>
         ''' 发布时间,格式为“yyyy/MM/dd HH:mm”。
         ''' </summary>
@@ -602,6 +599,23 @@
         ''' </summary>
         Public FileVersion As String
 
+        ''' <summary>
+        ''' 加载器名称。Forge 或 NeoForge。
+        ''' </summary>
+        Public Overrides ReadOnly Property LoaderName As String
+            Get
+                Return "Forge"
+            End Get
+        End Property
+        ''' <summary>
+        ''' 文件扩展名。不以小数点开头。
+        ''' </summary>
+        Public Overrides ReadOnly Property FileExtension As String
+            Get
+                Return If(Category = "installer", "jar", "zip")
+            End Get
+        End Property
+
         Public Sub New(Version As String, Branch As String, Inherit As String)
             '司马版本的特殊处理
             If Version = "11.15.1.2318" OrElse Version = "11.15.1.1902" OrElse Version = "11.15.1.1890" Then Branch = "1.8.9"
@@ -613,6 +627,7 @@
             Me.Inherit = Inherit
             FileVersion = Version & If(Branch Is Nothing, "", "-" & Branch)
         End Sub
+
     End Class
 
     ''' <summary>
@@ -651,7 +666,7 @@
                                           ".html", SimulateBrowserHeaders:=True)
         Catch ex As Exception
             If ex.GetBrief().Contains("(404)") Then
-                Throw New Exception("不可用")
+                Throw New Exception("无")
             Else
                 Throw
             End If
@@ -709,7 +724,7 @@
         Catch ex As Exception
             Throw New Exception("Forge 官方源版本列表解析失败(" & Result & ")", ex)
         End Try
-        If Not Versions.Any() Then Throw New Exception("不可用")
+        If Not Versions.Any() Then Throw New Exception("无")
         Loader.Output = Versions
     End Sub
 
@@ -718,7 +733,7 @@
     ''' </summary>
     Public Sub DlForgeVersionBmclapiMain(Loader As LoaderTask(Of String, List(Of DlForgeVersionEntry)))
         Dim Json As JArray = GetJson(NetRequestByClientRetry("https://bmclapi2.bangbang93.com/forge/minecraft/" &
-                                                      Loader.Input.Replace("-", "_"), RequireJson:=True)) '兼容 Forge 1.7.10-pre4,#4057
+            Loader.Input.Replace("-", "_"), RequireJson:=True)) '兼容 Forge 1.7.10-pre4,#4057
         Dim Versions As New List(Of DlForgeVersionEntry)
         Try
             Dim Recommended As String = McDownloadForgeRecommendedGet(Loader.Input)
@@ -763,7 +778,7 @@
         Catch ex As Exception
             Throw New Exception("Forge BMCLAPI 版本列表解析失败(" & Json.ToString & ")", ex)
         End Try
-        If Not Versions.Any() Then Throw New Exception("不可用")
+        If Not Versions.Any() Then Throw New Exception("无")
         Loader.Output = Versions
     End Sub
 
@@ -788,6 +803,7 @@
 
     Public Class DlNeoForgeListEntry
         Inherits DlForgelikeEntry
+
         ''' <summary>
         ''' 是否是 Beta 版。
         ''' </summary>
@@ -801,11 +817,28 @@
         ''' </summary>
         Public ReadOnly Property UrlBase As String
             Get
-                Dim PackageName As String = If(IsLegacy, "forge", "neoforge")
+                Dim PackageName As String = If(Inherit = "1.20.1", "forge", "neoforge")
                 Return $"https://maven.neoforged.net/releases/net/neoforged/{PackageName}/{ApiName}/{PackageName}-{ApiName}"
             End Get
         End Property
 
+        ''' <summary>
+        ''' 加载器名称。Forge 或 NeoForge。
+        ''' </summary>
+        Public Overrides ReadOnly Property LoaderName As String
+            Get
+                Return "NeoForge"
+            End Get
+        End Property
+        ''' <summary>
+        ''' 文件扩展名。不以小数点开头。
+        ''' </summary>
+        Public Overrides ReadOnly Property FileExtension As String
+            Get
+                Return "jar"
+            End Get
+        End Property
+
         Public Sub New(ApiName As String)
             IsNeoForge = True
             Me.ApiName = ApiName
@@ -816,12 +849,18 @@
                 Inherit = "1.20.1"
             ElseIf ApiName.StartsWith("0.") Then '0.25w14craftmine.3-beta
                 VersionName = ApiName
-                Version = New Version("0.0." & ApiName.BeforeFirst("-").AfterFirst(".").AfterFirst(".") & ".0") 'Minor 里有字母,但 Version 类的 Minor 是 Int 类型,只能这样写了
-                Inherit = ApiName.BeforeFirst("-").AfterFirst(".").BeforeFirst(".")
-            Else '20.4.30-beta
+                Dim Segments = ApiName.BeforeFirst("-").Split("."c)
+                Version = New Version(0, 0, Segments.Last)
+                Inherit = Segments(1)
+            Else '20.4.30-beta;26.1.0.0-alpha.1+snapshot-1
                 VersionName = ApiName
                 Version = New Version(ApiName.BeforeFirst("-"))
-                Inherit = $"1.{Version.Major}" & If(Version.Minor = 0, "", "." & Version.Minor)
+                If Version.Major >= 24 Then
+                    Inherit = Version.ToString.Replace(".0", "")
+                Else
+                    Inherit = "1." & Version.Major & If(Version.Minor > 0, "." & Version.Minor, "")
+                End If
+                If VersionName.Contains("+") Then Inherit &= "-" & VersionName.AfterFirst("+")
             End If
         End Sub
     End Class
@@ -888,12 +927,12 @@
 
     Private Function GetNeoForgeEntries(LatestJson As String, LatestLegacyJson As String) As List(Of DlNeoForgeListEntry)
         Dim VersionNames = RegexSearch(LatestLegacyJson & LatestJson,
-            "(?<="")(?:(1\.20\.1-)?\d+\.\d+\.\d+|0\.[^.]+\.\d+)(-beta)?(?="")") '我寻思直接正则就行.jpg
+            "(?<="")(1\.20\.1-)?\d+\.[^\.]+\.\d+(\.\d+)?(-(beta|alpha)(\.\d+)?)?(\+snapshot-\d+)?(?="")")
         Dim Versions = VersionNames.
             Where(Function(name) name <> "47.1.82"). '这个版本虽然在版本列表中,但不能下载
-            Select(Function(name) New DlNeoForgeListEntry(name)).ToList
-        If Not Versions.Any() Then Throw New Exception("不可用")
-        Versions = Versions.OrderByDescending(Function(a) a.Version).ToList
+            Select(Function(name) New DlNeoForgeListEntry(name)).
+            OrderByDescending(Function(a) a).ToList
+        If Not Versions.Any() Then Throw New Exception("无")
         Return Versions
     End Function
 
@@ -1308,7 +1347,7 @@
                     For ii = 0 To LoaderList.Count - 1
                         LoaderList(ii).Key.Input = Nothing '重置输入,以免以同样的输入“重试加载”时直接失败
                         If LoaderList(ii).Key.Error IsNot Nothing Then
-                            If ErrorInfo Is Nothing OrElse LoaderList(ii).Key.Error.Message.Contains("不可用") Then
+                            If ErrorInfo Is Nothing OrElse LoaderList(ii).Key.Error.Message = "无" Then
                                 ErrorInfo = LoaderList(ii).Key.Error
                             End If
                         End If

+ 50 - 59
Plain Craft Launcher 2/Modules/Minecraft/ModJava.vb

@@ -35,7 +35,7 @@
         ''' <summary>
         ''' Java 的大版本号。
         ''' </summary>
-        Public ReadOnly Property VersionCode As Integer
+        Public ReadOnly Property MajorVersion As Integer
             Get
                 Return Version.Minor
             End Get
@@ -71,7 +71,7 @@
         Public Overrides Function ToString() As String
             Dim VersionString = Version.ToString
             If VersionString.StartsWithF("1.") Then VersionString = Mid(VersionString, 3)
-            Return If(IsJre, "JRE ", "JDK ") & VersionCode & " (" & VersionString & ")" & If(Is64Bit, "", ",32 位") & If(IsUserImport, ",手动导入", "") & ":" & PathFolder
+            Return If(IsJre, "JRE ", "JDK ") & MajorVersion & " (" & VersionString & ")" & If(Is64Bit, "", ",32 位") & If(IsUserImport, ",手动导入", "") & ":" & PathFolder
         End Function
 
         '构造
@@ -124,7 +124,7 @@
                 '#3649:在 64 位系统上禁用 32 位 Java
                 If Not Is64Bit AndAlso Not Is32BitSystem Then Throw New Exception("该 Java 为 32 位版本,请安装 64 位的 Java")
                 '#2249:JRE 17 似乎会导致 Forge 安装失败,干脆禁用更多版本的 JRE
-                If IsJre AndAlso VersionCode >= 16 Then Throw New Exception("由于高版本 JRE 对游戏的兼容性很差,因此不再允许使用。你可以使用对应版本的 JDK,而非 JRE!")
+                If IsJre AndAlso MajorVersion >= 16 Then Throw New Exception("由于高版本 JRE 对游戏的兼容性很差,因此不再允许使用。你可以使用对应版本的 JDK,而非 JRE!")
             Catch ex As ApplicationException
                 Throw ex
             Catch ex As ThreadInterruptedException
@@ -199,19 +199,19 @@
     ''' 必须在工作线程调用,且必须包括 SyncLock JavaLock。
     ''' </summary>
     Public Function JavaSelect(CancelException As String, Optional MinVersion As Version = Nothing, Optional MaxVersion As Version = Nothing,
-                               Optional RelatedVersion As McVersion = Nothing) As JavaEntry
+                               Optional GameInstance As McInstance = Nothing) As JavaEntry
         Try
             Dim AllowedJavaList As New List(Of JavaEntry)
 
             '添加特定的 Java
             Dim JavaPreList As New Dictionary(Of String, Boolean)
-            If PathMcFolder.Split("\").Count > 3 AndAlso Not PathMcFolder.Contains("AppData\Roaming") Then
-                JavaSearchFolder(GetPathFromFullPath(PathMcFolder), JavaPreList, False, True) 'Minecraft 文件夹的父文件夹(如果不是根目录或 %APPDATA% 的话)
+            If McFolderSelected.Split("\").Count > 3 AndAlso Not McFolderSelected.Contains("AppData\Roaming") Then
+                JavaSearchFolder(GetPathFromFullPath(McFolderSelected), JavaPreList, False, True) 'Minecraft 文件夹的父文件夹(如果不是根目录或 %APPDATA% 的话)
             End If
-            JavaSearchFolder(PathMcFolder, JavaPreList, False, True) 'Minecraft 文件夹
+            JavaSearchFolder(McFolderSelected, JavaPreList, False, True) 'Minecraft 文件夹
             JavaPreList = JavaPreList.Where(Function(j) Not j.Key.Contains(".minecraft\runtime")).
                 ToDictionary(Function(j) j.Key, Function(j) j.Value) '排除官启自带 Java(#4286)
-            If RelatedVersion IsNot Nothing Then JavaSearchFolder(RelatedVersion.Path, JavaPreList, False, True) '所选版本文件夹
+            If GameInstance IsNot Nothing Then JavaSearchFolder(GameInstance.PathVersion, JavaPreList, False, True) '所选版本文件夹
             Dim TargetJavaList As New List(Of JavaEntry)
             For Each Entry In JavaPreList
                 TargetJavaList.Add(New JavaEntry(Entry.Key, Entry.Value))
@@ -232,8 +232,8 @@
 
             '获取版本独立设置中指定的 Java
             Dim VersionSelect As String = ""
-            If RelatedVersion IsNot Nothing Then
-                VersionSelect = Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion)
+            If GameInstance IsNot Nothing Then
+                VersionSelect = Setup.Get("VersionArgumentJavaSelect", Instance:=GameInstance)
                 If VersionSelect.StartsWithF("{") Then
                     Try
                         UserJava = JavaEntry.FromJson(GetJson(VersionSelect))
@@ -242,7 +242,7 @@
                         Throw
                     Catch ex As Exception
                         UserJava = Nothing
-                        Setup.Reset("VersionArgumentJavaSelect", Version:=RelatedVersion)
+                        Setup.Reset("VersionArgumentJavaSelect", Instance:=GameInstance)
                         Log(ex, "版本独立设置中指定的 Java 已无法使用,此设置已重置", LogLevel.Hint)
                     End Try
                 End If
@@ -330,8 +330,8 @@ RetryGet:
                 Dim Right As String = MaxVersion.Minor & If(ShowRevision, "." & MaxVersion.MajorRevision & "." & MaxVersion.MinorRevision, "")
                 Requirement = "需要 Java " & If(Left = Right, Left, Left & " ~ " & Right)
             End If
-            Dim JavaCurrent As String = UserJava.VersionCode & If(ShowRevision, "." & UserJava.Version.MajorRevision & "." & UserJava.Version.MinorRevision, "")
-            If RelatedVersion IsNot Nothing AndAlso Setup.Get("VersionAdvanceJava", RelatedVersion) Then
+            Dim JavaCurrent As String = UserJava.MajorVersion & If(ShowRevision, "." & UserJava.Version.MajorRevision & "." & UserJava.Version.MinorRevision, "")
+            If GameInstance IsNot Nothing AndAlso Setup.Get("VersionAdvanceJava", GameInstance) Then
                 '直接跳过弹窗
                 Log("[Java] 设置中指定了使用 Java " & JavaCurrent & ",但当前版本" & Requirement & ",这可能会导致游戏崩溃!", LogLevel.Debug)
                 AllowedJavaList = New List(Of JavaEntry) From {UserJava}
@@ -372,7 +372,7 @@ ExitUserJavaCheck:
 UserPass:
 
             '对适合的 Java 进行排序
-            AllowedJavaList = AllowedJavaList.Sort(AddressOf JavaSorter)
+            AllowedJavaList = AllowedJavaList.SortByComparison(AddressOf JavaSorter)
             Log($"[Java] 排序后的 Java 优先顺序:")
             For Each Java In AllowedJavaList
                 Log($"[Java]  - {Java}")
@@ -408,12 +408,12 @@ UserPass:
     ''' <summary>
     ''' 是否强制指定了 64 位 Java。如果没有强制指定,返回是否安装了 64 位 Java。
     ''' </summary>
-    Public Function JavaIs64Bit(Optional RelatedVersion As McVersion = Nothing) As Boolean
+    Public Function JavaIs64Bit(Optional GameInstance As McInstance = Nothing) As Boolean
         Try
             '检查强制指定
             Dim UserSetup As String = Setup.Get("LaunchArgumentJavaSelect")
-            If RelatedVersion IsNot Nothing Then
-                Dim UserSetupVersion As String = Setup.Get("VersionArgumentJavaSelect", Version:=RelatedVersion)
+            If GameInstance IsNot Nothing Then
+                Dim UserSetupVersion As String = Setup.Get("VersionArgumentJavaSelect", Instance:=GameInstance)
                 If UserSetupVersion <> "使用全局设置" Then UserSetup = UserSetupVersion
             End If
             If UserSetup <> "" Then
@@ -422,7 +422,7 @@ UserPass:
                     UserJava = JavaEntry.FromJson(GetJson(UserSetup))
                 Catch ex As Exception
                     Log(ex, "版本指定的 Java 信息已损坏,已重置版本设置中指定的 Java")
-                    Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Version:=RelatedVersion)
+                    Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=GameInstance)
                     GoTo NoUserJava
                 End Try
                 For Each Java In JavaList
@@ -446,14 +446,14 @@ NoUserJava:
     ''' </summary>
     Public Function JavaSorter(Left As JavaEntry, Right As JavaEntry) As Boolean
         Dim PathInfo As New DirectoryInfo(Path)
-        Dim PathMcInfo As New DirectoryInfo(PathMcFolder)
+        Dim PathMcInfo As New DirectoryInfo(McFolderSelected)
         '1. 尽量在当前文件夹或当前 Minecraft 文件夹
         Dim ProgramPathParent As String, MinecraftPathParent As String = ""
         ProgramPathParent = If(PathInfo.Parent, PathInfo).FullName
-        If PathMcFolder <> "" Then MinecraftPathParent = If(PathMcInfo.Parent, PathMcInfo).FullName
+        If McFolderSelected <> "" Then MinecraftPathParent = If(PathMcInfo.Parent, PathMcInfo).FullName
         If Left.PathFolder.StartsWithF(ProgramPathParent) AndAlso Not Right.PathFolder.StartsWithF(ProgramPathParent) Then Return True
         If Not Left.PathFolder.StartsWithF(ProgramPathParent) AndAlso Right.PathFolder.StartsWithF(ProgramPathParent) Then Return False
-        If PathMcFolder <> "" Then
+        If McFolderSelected <> "" Then
             If Left.PathFolder.StartsWithF(MinecraftPathParent) AndAlso Not Right.PathFolder.StartsWithF(MinecraftPathParent) Then Return True
             If Not Left.PathFolder.StartsWithF(MinecraftPathParent) AndAlso Right.PathFolder.StartsWithF(MinecraftPathParent) Then Return False
         End If
@@ -464,10 +464,10 @@ NoUserJava:
         If Left.IsJre AndAlso Not Right.IsJre Then Return True
         If Not Left.IsJre AndAlso Right.IsJre Then Return False
         '4. Java 大版本
-        If Left.VersionCode <> Right.VersionCode Then
+        If Left.MajorVersion <> Right.MajorVersion Then
             '                             Java  7   8   9  10  11  12 13 14 15  16  17  18  19  20  21  22  23...
             Dim Weight = {0, 1, 2, 3, 4, 5, 6, 14, 30, 10, 12, 15, 13, 9, 8, 7, 11, 31, 29, 16, 17, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18}
-            Return Weight.ElementAtOrDefault(Left.VersionCode) >= Weight.ElementAtOrDefault(Right.VersionCode)
+            Return Weight.ElementAtOrDefault(Left.MajorVersion) >= Weight.ElementAtOrDefault(Right.MajorVersion)
         End If
         '5. 最次级版本号更接近 51
         Return Math.Abs(Left.Version.Revision - 51) <= Math.Abs(Right.Version.Revision - 51)
@@ -487,11 +487,11 @@ NoUserJava:
                 FrmSetupLaunch.ComboArgumentJava.Items.Add(New ComboBoxItem With {.Content = "加载中……", .IsSelected = True})
             End Sub)
         End If
-        If FrmVersionSetup IsNot Nothing Then
+        If FrmInstanceSetup IsNot Nothing Then
             RunInUiWait(
             Sub()
-                FrmVersionSetup.ComboArgumentJava.Items.Clear()
-                FrmVersionSetup.ComboArgumentJava.Items.Add(New ComboBoxItem With {.Content = "加载中……", .IsSelected = True})
+                FrmInstanceSetup.ComboArgumentJava.Items.Clear()
+                FrmInstanceSetup.ComboArgumentJava.Items.Add(New ComboBoxItem With {.Content = "加载中……", .IsSelected = True})
             End Sub)
         End If
 
@@ -525,8 +525,8 @@ NoUserJava:
             '查找启动器目录中的 Java
             JavaSearchFolder(Path, JavaPreList, False, IsFullSearch:=True)
             '查找所选 Minecraft 文件夹中的 Java
-            If Not String.IsNullOrWhiteSpace(PathMcFolder) AndAlso Path <> PathMcFolder Then
-                JavaSearchFolder(PathMcFolder, JavaPreList, False, IsFullSearch:=True)
+            If Not String.IsNullOrWhiteSpace(McFolderSelected) AndAlso Path <> McFolderSelected Then
+                JavaSearchFolder(McFolderSelected, JavaPreList, False, IsFullSearch:=True)
             End If
 
             '若不全为符号链接,则清除符号链接的地址
@@ -579,7 +579,7 @@ NoUserJava:
             For Each Entry In JavaPreList.Distinct(Function(a, b) a.Key.ToLower = b.Key.ToLower) '#794
                 NewJavaList.Add(New JavaEntry(Entry.Key, Entry.Value))
             Next
-            NewJavaList = JavaCheckList(NewJavaList).Sort(AddressOf JavaSorter)
+            NewJavaList = JavaCheckList(NewJavaList).SortByComparison(AddressOf JavaSorter)
 
             '修改设置项
             Dim AllList As New JArray
@@ -596,7 +596,7 @@ NoUserJava:
 
         Log("[Java] Java 搜索完成,发现 " & JavaList.Count & " 个 Java")
         If FrmSetupLaunch IsNot Nothing Then RunInUi(Sub() FrmSetupLaunch.RefreshJavaComboBox())
-        If FrmVersionSetup IsNot Nothing Then RunInUi(Sub() FrmVersionSetup.RefreshJavaComboBox())
+        If FrmInstanceSetup IsNot Nothing Then RunInUi(Sub() FrmInstanceSetup.RefreshJavaComboBox())
     End Sub
 
     ''' <summary>
@@ -695,28 +695,12 @@ Wait:
 #Region "下载"
 
     ''' <summary>
-    ''' 提示 Java 缺失,并弹窗确认是否自动下载。返回玩家选择是否下载。
+    ''' 获取下载 Java 的加载器。需要开启 IsForceRestart 以正常刷新 Java 列表。
     ''' </summary>
-    Public Function JavaDownloadConfirm(VersionDescription As String, Optional ForcedManualDownload As Boolean = False) As Boolean
-        If ForcedManualDownload Then
-            MyMsgBox($"PCL 未找到 {VersionDescription}。" & vbCrLf &
-                     $"请自行搜索并安装 {VersionDescription},安装后在 设置 → 启动选项 → 游戏 Java 中重新搜索或导入。",
-                     "未找到 Java")
-            Return False
-        Else
-            Return MyMsgBox($"PCL 未找到 {VersionDescription},是否需要 PCL 自动下载?" & vbCrLf &
-                            $"如果你已经安装了 {VersionDescription},可以在 设置 → 启动选项 → 游戏 Java 中手动导入。",
-                            "自动下载 Java?", "自动下载", "取消") = 1
-        End If
-    End Function
-
-    ''' <summary>
-    ''' 获取下载 Java 8/14/17/21 的加载器。需要开启 IsForceRestart 以正常刷新 Java 列表。
-    ''' </summary>
-    Public Function JavaFixLoaders(Version As Integer) As LoaderCombo(Of Integer)
+    Public Function GetJavaDownloadLoader() As LoaderCombo(Of String)
         Dim JavaDownloadLoader As New LoaderDownload("下载 Java 文件", New List(Of NetFile)) With {.ProgressWeight = 10}
-        Dim Loader = New LoaderCombo(Of Integer)($"下载 Java {Version}", {
-            New LoaderTask(Of Integer, List(Of NetFile))("获取 Java 下载信息", AddressOf JavaFileList) With {.ProgressWeight = 2},
+        Dim Loader = New LoaderCombo(Of String)($"下载 Java", {
+            New LoaderTask(Of String, List(Of NetFile))("获取 Java 下载信息", AddressOf JavaFileList) With {.ProgressWeight = 2},
             JavaDownloadLoader,
             JavaSearchLoader
         })
@@ -733,22 +717,29 @@ Wait:
         Return Loader
     End Function
     Private LastJavaBaseDir As String = Nothing '用于在下载中断或失败时删除未完成下载的 Java 文件夹,防止残留只下了一半但 -version 能跑的 Java
-    Private Sub JavaFileList(Loader As LoaderTask(Of Integer, List(Of NetFile)))
+    Private Sub JavaFileList(Loader As LoaderTask(Of String, List(Of NetFile)))
         Log("[Java] 开始获取 Java 下载信息")
         Dim IndexFileStr As String = NetRequestByLoader(DlVersionListOrder(
             {"https://piston-meta.mojang.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"},
             {"https://bmclapi2.bangbang93.com/v1/products/java-runtime/2ec0cc96c44e5a76b9c8b7c39df7210883d12871/all.json"}
         ), IsJson:=True)
-        '获取下载地址
-        Dim MainEntry As JObject = CType(GetJson(IndexFileStr), JObject)($"windows-x{If(Is32BitSystem, "86", "64")}")
-        Dim Entries = MainEntry.Children.Reverse. '选择最靠后的一项(最新)
-            SelectMany(Function(e As JProperty) CType(e.Value, JArray).Select(Function(v) New KeyValuePair(Of String, JObject)(e.Name, v)))
-        Dim TargetEntry = Entries.First(Function(t) t.Value("version")("name").ToString.StartsWithF(Loader.Input))
-        Dim Address As String = TargetEntry.Value("manifest")("url")
-        Log($"[Java] 准备下载 Java {TargetEntry.Value("version")("name")}({TargetEntry.Key}):{Address}")
+        '查找要下载的目标 Java
+        Dim TargetEntry As JProperty = Nothing
+        Dim Components As JObject = CType(GetJson(IndexFileStr), JObject)($"windows-x{If(Is32BitSystem, "86", "64")}")
+        If Components.ContainsKey(Loader.Input) Then '精确匹配
+            TargetEntry = Components.Property(Loader.Input)
+        Else '模糊匹配
+            TargetEntry = Components.Properties.FirstOrDefault(
+                Function(c) c.Value?.ToArray.FirstOrDefault()?("version")("name").ToString.StartsWithF(Loader.Input))
+            If TargetEntry Is Nothing Then Throw New Exception($"未能找到所需的 Java {Loader.Input}")
+        End If
+        Dim TargetComponent = TargetEntry.Value.ToArray.FirstOrDefault
+        If TargetComponent Is Nothing Then Throw New Exception($"Mojang 未提供所需的 Java {Loader.Input}")
         '获取文件列表
+        Dim Address As String = TargetComponent("manifest")("url")
+        McLaunchLog($"准备下载 Java {TargetComponent("version")("name")}({TargetEntry.Name}):{Address}")
         Dim ListFileStr As String = NetRequestByLoader(DlSourceOrder({Address}, {Address.Replace("piston-meta.mojang.com", "bmclapi2.bangbang93.com")}), IsJson:=True)
-        LastJavaBaseDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\runtime\" & TargetEntry.Key & "\"
+        LastJavaBaseDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\.minecraft\runtime\" & TargetEntry.Name & "\"
         Dim Results As New List(Of NetFile)
         For Each File As JProperty In CType(GetJson(ListFileStr), JObject)("files")
             If CType(File.Value, JObject)("downloads")?("raw") Is Nothing Then Continue For

Dosya farkı çok büyük olduğundan ihmal edildi
+ 205 - 217
Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb


Dosya farkı çok büyük olduğundan ihmal edildi
+ 374 - 335
Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb


+ 92 - 489
Plain Craft Launcher 2/Modules/Minecraft/ModMod.vb

@@ -1,7 +1,7 @@
 Imports System.IO.Compression
 
 Public Module ModMod
-    Private Const LocalModCacheVersion As Integer = 8
+    Private Const LocalModCacheVersion As Integer = 10
 
     Public Class McMod
 
@@ -46,10 +46,7 @@ Public Module ModMod
         ''' </summary>
         Public ReadOnly Property State As McModState
             Get
-                Load()
-                If Not IsFileAvailable Then
-                    Return McModState.Unavailable
-                ElseIf Path.EndsWithF(".disabled", True) OrElse Path.EndsWithF(".old", True) Then
+                If Path.EndsWithF(".disabled", True) OrElse Path.EndsWithF(".old", True) Then
                     Return McModState.Disabled
                 Else
                     Return McModState.Fine
@@ -59,7 +56,6 @@ Public Module ModMod
         Public Enum McModState As Integer
             Fine = 0
             Disabled = 1
-            Unavailable = 2
         End Enum
 
 #End Region
@@ -67,12 +63,17 @@ Public Module ModMod
 #Region "信息项"
 
         ''' <summary>
-        ''' Mod 的名称。若不可用则为 ModID 或无扩展的文件名。
+        ''' 当任何信息在初始化后更新时触发。
         ''' </summary>
-        Public Property Name As String
+        Public Event OnUpdate(sender As McMod)
+
+        ''' <summary>
+        ''' Mod 的可读名称。
+        ''' 可能为无扩展的文件名,但不会是 Nothing。
+        ''' </summary>
+        Public Property DisplayName As String
             Get
-                If _Name Is Nothing Then Load()
-                If _Name Is Nothing Then _Name = _ModId
+                If _Name Is Nothing Then _Name = CompFile?.DisplayName
                 If _Name Is Nothing Then _Name = IO.Path.GetFileNameWithoutExtension(Path)
                 Return _Name
             End Get
@@ -87,12 +88,10 @@ Public Module ModMod
 
         ''' <summary>
         ''' Mod 的描述信息。
+        ''' 可能为 Nothing。
         ''' </summary>
         Public Property Description As String
             Get
-                If _Description Is Nothing Then Load()
-                If _Description Is Nothing AndAlso FileUnavailableReason IsNot Nothing Then _Description = FileUnavailableReason.Message
-                'If _Description Is Nothing Then _Description = Path
                 Return _Description
             End Get
             Set(value As String)
@@ -106,11 +105,12 @@ Public Module ModMod
         Private _Description As String = Nothing
 
         ''' <summary>
-        ''' Mod 的版本,不保证符合版本格式规范。
+        ''' Mod 的版本。
+        ''' 不保证符合版本格式规范,且可能为 Nothing。
         ''' </summary>
         Public Property Version As String
             Get
-                If _Version Is Nothing Then Load()
+                If _Version Is Nothing Then _Version = CompFile?.Version
                 Return _Version
             End Get
             Set(value As String)
@@ -121,167 +121,17 @@ Public Module ModMod
         End Property
         Public _Version As String = Nothing
 
-        ''' <summary>
-        ''' 用于依赖检查的 ModID。
-        ''' </summary>
-        Public Property ModId As String
-            Get
-                If _ModId Is Nothing Then Load()
-                Return _ModId
-            End Get
-            Set(value As String)
-                If value Is Nothing Then Return
-                value = RegexSeek(value, "[0-9a-zA-Z_-]+")
-                If value Is Nothing OrElse value.Count <= 1 OrElse Val(value).ToString = value Then Return
-                If value.ContainsF("name", True) OrElse value.ContainsF("modid", True) Then Return
-                If Not PossibleModId.Contains(value) Then PossibleModId.Add(value)
-                If _ModId Is Nothing Then _ModId = value
-            End Set
-        End Property
-        Private _ModId As String = Nothing
-        ''' <summary>
-        ''' 其他可能的 ModID。
-        ''' </summary>
-        Public PossibleModId As New List(Of String)
-
-        ''' <summary>
-        ''' Mod 的主页。
-        ''' </summary>
-        Public Property Url As String
-            Get
-                If _Url Is Nothing Then Load()
-                Return _Url
-            End Get
-            Set(value As String)
-                If _Url Is Nothing AndAlso value IsNot Nothing AndAlso value.StartsWithF("http") Then
-                    _Url = value
-                End If
-            End Set
-        End Property
-        Private _Url As String = Nothing
-
-        ''' <summary>
-        ''' Mod 的作者列表。
-        ''' </summary>
-        Public Property Authors As String
-            Get
-                If _Authors Is Nothing Then Load()
-                Return _Authors
-            End Get
-            Set(value As String)
-                If _Authors Is Nothing AndAlso Not String.IsNullOrWhiteSpace(value) Then
-                    _Authors = value
-                End If
-            End Set
-        End Property
-        Private _Authors As String = Nothing
-
-        ''' <summary>
-        ''' 依赖项,其中包括了 Minecraft 的版本要求。格式为 ModID - VersionRequirement,若无版本要求则为 Nothing。
-        ''' </summary>
-        Public ReadOnly Property Dependencies As Dictionary(Of String, String)
-            Get
-                Load()
-                Return _Dependencies
-            End Get
-        End Property
-        Private _Dependencies As New Dictionary(Of String, String)
-        Private Sub AddDependency(ModID As String, Optional VersionRequirement As String = Nothing)
-            '确保信息正确
-            If ModID Is Nothing OrElse ModID.Count < 2 Then Return
-            ModID = ModID.ToLower
-            If ModID = "name" OrElse Val(ModID).ToString = ModID Then Return '跳过 name 与纯数字 id
-            If VersionRequirement Is Nothing OrElse ((Not VersionRequirement.Contains(".")) AndAlso (Not VersionRequirement.Contains("-"))) OrElse VersionRequirement.Contains("$") Then
-                VersionRequirement = Nothing
-            Else
-                If (Not VersionRequirement.StartsWithF("[")) AndAlso (Not VersionRequirement.StartsWithF("(")) AndAlso (Not VersionRequirement.EndsWithF("]")) AndAlso (Not VersionRequirement.EndsWithF(")")) Then VersionRequirement = "[" & VersionRequirement & ",)"
-            End If
-            '向依赖项中添加
-            If _Dependencies.ContainsKey(ModID) Then
-                If _Dependencies(ModID) Is Nothing Then _Dependencies(ModID) = VersionRequirement
-            Else
-                _Dependencies.Add(ModID, VersionRequirement)
-            End If
-        End Sub
-
-#End Region
-
-#Region "加载步骤标记"
-
-        '1. 进行文件可用性检查
-        '   成功:继续第二步。
-        '   失败:标记 FileUnavailableReason, 并停止后续加载。
-        ''' <summary>
-        ''' 是否已进行 Mod 文件的基础加载。(这包括第一步和第二步)
-        ''' </summary>
-        Private IsLoaded As Boolean = False
-        ''' <summary>
-        ''' Mod 文件是否可被正常读取。
-        ''' </summary>
-        Public ReadOnly Property IsFileAvailable As Boolean
-            Get
-                Load()
-                Return FileUnavailableReason Is Nothing
-            End Get
-        End Property
-        ''' <summary>
-        ''' Mod 文件出错的原因。若无错误,则为 Nothing。
-        ''' </summary>
-        Public ReadOnly Property FileUnavailableReason As Exception
-            Get
-                Load()
-                Return _FileUnavailableReason
-            End Get
-        End Property
-        Private _FileUnavailableReason As Exception = Nothing
-
-        '2. 进行 .class 以外的信息获取
-        '   成功:标记 IsInfoWithoutClassAvailable。
-        '   失败:什么也不干。如果需要补充信息的话,检测到 IsInfoWithoutClassAvailable 为 False,会自动继续加载。
-        ''' <summary>
-        ''' 是否已在不获取 .class 文件的前提下完成了所需信息的加载。
-        ''' </summary>
-        Private IsInfoWithoutClassAvailable As Boolean = False
-
-        '3. 尝试从 .class 文件中获取信息
-        '   成功:标记 IsInfoWithClassAvailable。
-        '   失败:什么也不干。
-        ''' <summary>
-        ''' 是否已进行 .class 文件的信息获取。
-        ''' </summary>
-        Private IsInfoWithClassLoaded As Boolean = False
-        ''' <summary>
-        ''' 是否已在 .class 文件中完成了所需信息的加载。
-        ''' </summary>
-        Private IsInfoWithClassAvailable As Boolean = False
-
 #End Region
 
-#Region "加载"
+#Region "从 JAR 获取信息"
 
         ''' <summary>
-        ''' 初始化所有数据。
+        ''' 从 JAR 文件中获取 Mod 信息。
         ''' </summary>
-        Private Sub Init()
-            _Name = Nothing
-            _Description = Nothing
-            _Version = Nothing
-            _ModId = Nothing
-            PossibleModId = New List(Of String)
-            _Dependencies = New Dictionary(Of String, String)
-            IsLoaded = False
-            _FileUnavailableReason = Nothing
-            IsInfoWithClassLoaded = False
-            IsInfoWithClassAvailable = False
-        End Sub
-
-        ''' <summary>
-        ''' 进行文件可用性检查与 .class 以外的信息获取。
-        ''' </summary>
-        Public Sub Load(Optional ForceReload As Boolean = False)
-            If IsLoaded AndAlso Not ForceReload Then Return
-            '初始化
-            Init()
+        Public Sub LoadMetadataFromJar()
+            Static IsLoaded As Boolean = False
+            If IsLoaded Then Return
+            IsLoaded = True
             Dim Jar As ZipArchive = Nothing
             Try
                 '基础可用性检查、打开 Jar 文件
@@ -289,24 +139,16 @@ Public Module ModMod
                 If Not File.Exists(Path) Then Throw New FileNotFoundException("未找到 Mod 文件(" & Path & ")")
                 Jar = New ZipArchive(New FileStream(Path, FileMode.Open))
                 '信息获取
-                LookupMetadata(Jar)
+                LoadMetadataFromJar(Jar)
             Catch ex As UnauthorizedAccessException
                 Log(ex, "Mod 文件由于无权限无法打开(" & Path & ")", LogLevel.Developer)
-                _FileUnavailableReason = New UnauthorizedAccessException("没有读取此文件的权限,请尝试右键以管理员身份运行 PCL", ex)
             Catch ex As Exception
                 Log(ex, "Mod 文件无法打开(" & Path & ")", LogLevel.Developer)
-                _FileUnavailableReason = ex
             Finally
                 If Jar IsNot Nothing Then Jar.Dispose()
             End Try
-            '完成标记
-            IsLoaded = True
         End Sub
-
-        ''' <summary>
-        ''' 从 jar 文件中获取 Mod 信息。
-        ''' </summary>
-        Private Sub LookupMetadata(Jar As ZipArchive)
+        Private Sub LoadMetadataFromJar(Jar As ZipArchive)
 
 #Region "尝试使用 mcmod.info"
             Try
@@ -327,45 +169,9 @@ Public Module ModMod
                     InfoObject = JsonObject("modList")(0)
                 End If
                 '从文件中获取 Mod 信息项
-                Name = InfoObject("name")
+                DisplayName = InfoObject("name")
                 Description = InfoObject("description")
                 Version = InfoObject("version")
-                Url = InfoObject("url")
-                ModId = InfoObject("modid")
-                Dim AuthorJson As JArray = InfoObject("authorList")
-                If AuthorJson IsNot Nothing Then
-                    Dim Author As New List(Of String)
-                    For Each Token In AuthorJson
-                        Author.Add(Token.ToString)
-                    Next
-                    If Author.Any Then Authors = Join(Author, ", ")
-                End If
-                Dim Reqs As JArray = InfoObject("requiredMods")
-                If Reqs IsNot Nothing Then
-                    For Each Token As String In Reqs
-                        If Not String.IsNullOrEmpty(Token) Then
-                            Token = Token.Substring(Token.IndexOfF(":") + 1)
-                            If Token.Contains("@") Then
-                                AddDependency(Token.Split("@")(0), Token.Split("@")(1))
-                            Else
-                                AddDependency(Token)
-                            End If
-                        End If
-                    Next
-                End If
-                Reqs = InfoObject("dependancies")
-                If Reqs IsNot Nothing Then
-                    For Each Token As String In Reqs
-                        If Not String.IsNullOrEmpty(Token) Then
-                            Token = Token.Substring(Token.IndexOfF(":") + 1)
-                            If Token.Contains("@") Then
-                                AddDependency(Token.Split("@")(0), Token.Split("@")(1))
-                            Else
-                                AddDependency(Token)
-                            End If
-                        End If
-                    Next
-                End If
             Catch ex As Exception
                 Log(ex, "读取 mcmod.info 时出现未知错误(" & Path & ")", LogLevel.Developer)
             End Try
@@ -383,37 +189,9 @@ Public Module ModMod
                 Dim FabricObject As JObject = GetJson(FabricText)
 GotFabric:
                 '从文件中获取 Mod 信息项
-                If FabricObject.ContainsKey("name") Then Name = FabricObject("name")
+                If FabricObject.ContainsKey("name") Then DisplayName = FabricObject("name")
                 If FabricObject.ContainsKey("version") Then Version = FabricObject("version")
                 If FabricObject.ContainsKey("description") Then Description = FabricObject("description")
-                If FabricObject.ContainsKey("id") Then ModId = FabricObject("id")
-                If FabricObject.ContainsKey("contact") Then Url = If(FabricObject("contact")("homepage"), "")
-                Dim AuthorJson As JArray = FabricObject("authors")
-                If AuthorJson IsNot Nothing Then
-                    Dim Author As New List(Of String)
-                    For Each Token In AuthorJson
-                        Author.Add(Token.ToString)
-                    Next
-                    If Author.Any Then Authors = Join(Author, ", ")
-                End If
-                'If (Not FabricObject.ContainsKey("serverSideOnly")) OrElse FabricObject("serverSideOnly")("value").ToObject(Of Boolean) = False Then
-                '    '添加 Minecraft 依赖
-                '    Dim DepMinecraft As String = If(If(FabricObject("acceptedMinecraftVersions") IsNot Nothing, FabricObject("acceptedMinecraftVersions")("value"), ""), "")
-                '    If DepMinecraft <> "" Then AddDependency("minecraft", DepMinecraft)
-                '    '添加其他依赖
-                '    Dim Deps As String = If(If(FabricObject("dependencies") IsNot Nothing, FabricObject("dependencies")("value"), ""), "")
-                '    If Deps <> "" Then
-                '        For Each Dep In Deps.Split(";")
-                '            If Dep = "" OrElse Not Dep.StartsWithF("required-") Then Continue For
-                '            Dep = Dep.Substring(Dep.IndexOfF(":") + 1)
-                '            If Dep.Contains("@") Then
-                '                AddDependency(Dep.Split("@")(0), Dep.Split("@")(1))
-                '            Else
-                '                AddDependency(Dep)
-                '            End If
-                '        Next
-                '    End If
-                'End If
                 '加载成功
                 GoTo Finished
             Catch ex As Exception
@@ -500,22 +278,9 @@ GotFabric:
                     End If
                 Next
                 If ModEntry Is Nothing OrElse Not ModEntry.ContainsKey("modId") Then Exit Try
-                ModId = ModEntry("modId")
-                If _ModId Is Nothing Then Exit Try '设置了无效的 ModID
-                If ModEntry.ContainsKey("displayName") Then Name = ModEntry("displayName")
+                If ModEntry.ContainsKey("displayName") Then DisplayName = ModEntry("displayName")
                 If ModEntry.ContainsKey("description") Then Description = ModEntry("description")
                 If ModEntry.ContainsKey("version") Then Version = ModEntry("version")
-                If TomlData(0).Value.ContainsKey("displayURL") Then Url = TomlData(0).Value("displayURL")
-                If TomlData(0).Value.ContainsKey("authors") Then Authors = TomlData(0).Value("authors")
-                For Each TomlSubData In TomlData
-                    If TomlSubData.Key.ToLower = $"dependencies.{ModId.ToLower}" Then
-                        Dim DepEntry As Dictionary(Of String, Object) = TomlSubData.Value
-                        If DepEntry.ContainsKey("modId") AndAlso DepEntry.ContainsKey("mandatory") AndAlso DepEntry("mandatory") AndAlso
-                           DepEntry.ContainsKey("side") AndAlso Not DepEntry("side").ToString.ToLower = "server" Then
-                            AddDependency(DepEntry("modId"), If(DepEntry.ContainsKey("versionRange"), DepEntry("versionRange"), Nothing))
-                        End If
-                    End If
-                Next
                 '加载成功
                 GoTo Finished
             Catch ex As Exception
@@ -551,41 +316,16 @@ GotFabric:
                 Exit Try
 Got:
                 '从文件中获取 Mod 信息项
-                If FmlObject.ContainsKey("useMetadata") AndAlso If(FmlObject("useMetadata")("value"), "").ToString.ToLower = "true" Then
-                    '要求使用 mcmod.info 中的信息
-                    Dim value As String = FmlObject("modid")("value")
-                    If value Is Nothing Then Exit Try
-                    value = RegexSeek(value.ToLower, "[0-9a-z_]+")
-                    If value IsNot Nothing AndAlso value.ToLower <> "name" AndAlso value.Count > 1 AndAlso Val(value).ToString <> value Then
-                        If Not PossibleModId.Contains(value) Then PossibleModId.Add(value)
-                    End If
-                    Exit Try
-                End If
-                If FmlObject.ContainsKey("name") Then Name = FmlObject("name")("value")
+                If FmlObject.ContainsKey("name") Then DisplayName = FmlObject("name")("value")
                 If FmlObject.ContainsKey("version") Then Version = FmlObject("version")("value")
-                If FmlObject.ContainsKey("modid") Then ModId = FmlObject("modid")("value")
-                If (Not FmlObject.ContainsKey("serverSideOnly")) OrElse FmlObject("serverSideOnly")("value").ToObject(Of Boolean) = False Then
-                    '添加 Minecraft 依赖
-                    Dim DepMinecraft As String = If(If(FmlObject("acceptedMinecraftVersions") IsNot Nothing, FmlObject("acceptedMinecraftVersions")("value"), ""), "")
-                    If DepMinecraft <> "" Then AddDependency("minecraft", DepMinecraft)
-                    '添加其他依赖
-                    Dim Deps As String = If(If(FmlObject("dependencies") IsNot Nothing, FmlObject("dependencies")("value"), ""), "")
-                    If Deps <> "" Then
-                        For Each Dep In Deps.Split(";")
-                            If Dep = "" OrElse Not Dep.StartsWithF("required-") Then Continue For
-                            Dep = Dep.Substring(Dep.IndexOfF(":") + 1)
-                            If Dep.Contains("@") Then
-                                AddDependency(Dep.Split("@")(0), Dep.Split("@")(1))
-                            Else
-                                AddDependency(Dep)
-                            End If
-                        Next
-                    End If
-                End If
+                '加载成功
+                GoTo Finished
             Catch ex As Exception
                 Log(ex, "读取 fml_cache_annotation.json 时出现未知错误(" & Path & ")", LogLevel.Developer)
             End Try
 #End Region
+            Return '没能成功获取任何信息
+
 Finished:
 #Region "将 Version 代号转换为 META-INF 中的版本"
             If _Version = "version" Then
@@ -606,6 +346,7 @@ Finished:
             End If
             If _Version IsNot Nothing AndAlso Not (_Version.Contains(".") OrElse _Version.Contains("-")) Then Version = Nothing
 #End Region
+            RaiseEvent OnUpdate(Me)
 
         End Sub
 
@@ -613,11 +354,6 @@ Finished:
 
 #Region "网络信息"
 
-        ''' <summary>
-        ''' 当任何网络信息更新时触发。
-        ''' </summary>
-        Public Event OnCompUpdate(sender As McMod)
-
         ''' <summary>
         ''' 该 Mod 关联的网络项目。
         ''' </summary>
@@ -627,7 +363,7 @@ Finished:
             End Get
             Set(value As CompProject)
                 _Comp = value
-                RaiseEvent OnCompUpdate(Me)
+                RaiseEvent OnUpdate(Me)
             End Set
         End Property
         Private _Comp As CompProject
@@ -646,7 +382,7 @@ Finished:
             End Get
             Set(value As CompFile)
                 _UpdateFile = value
-                RaiseEvent OnCompUpdate(Me)
+                RaiseEvent OnUpdate(Me)
             End Set
         End Property
         Private _UpdateFile As CompFile
@@ -688,7 +424,7 @@ Finished:
         ''' </summary>
         Public ReadOnly Property CanUpdate As Boolean
             Get
-                Return Not Setup.Get("UiHiddenFunctionModUpdate") AndAlso Not Setup.Get("VersionAdvanceDisableModUpdate", Version:=PageVersionLeft.Version) AndAlso ChangelogUrls.Any()
+                Return Not Setup.Get("UiHiddenFunctionModUpdate") AndAlso Not Setup.Get("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance) AndAlso ChangelogUrls.Any()
             End Get
         End Property
 
@@ -787,10 +523,10 @@ Finished:
 #End Region
 
         ''' <summary>
-        ''' 是否可能为前置 Mod。
+        ''' 是否可能为前置 Mod。目前非常不准确。
         ''' </summary>
         Public Function IsPresetMod() As Boolean
-            Return Not Dependencies.Any() AndAlso Name IsNot Nothing AndAlso (Name.ToLower.Contains("core") OrElse Name.ToLower.Contains("lib"))
+            Return DisplayName IsNot Nothing AndAlso (DisplayName.ToLower.Contains("core") OrElse DisplayName.ToLower.Contains("lib"))
         End Function
 
         ''' <summary>
@@ -811,21 +547,21 @@ Finished:
     Public McModLoader As New LoaderTask(Of String, List(Of McMod))("Mod List Loader", AddressOf McModLoad)
     Private Sub McModLoad(Loader As LoaderTask(Of String, List(Of McMod)))
         Try
-            RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.ShowProgress = False)
+            RunInUiWait(Sub() If FrmInstanceMod IsNot Nothing Then FrmInstanceMod.Load.ShowProgress = False)
 
             '等待 Mod 更新完成
-            If PageVersionMod.UpdatingVersions.Contains(Loader.Input) Then
+            If PageInstanceMod.UpdatingInstanceModFolders.Contains(Loader.Input) Then
                 Log($"[Mod] 等待 Mod 更新完成后才能继续加载 Mod 列表:" & Loader.Input)
                 Try
-                    RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.Text = "正在更新 Mod")
-                    Do Until Not PageVersionMod.UpdatingVersions.Contains(Loader.Input)
+                    RunInUiWait(Sub() If FrmInstanceMod IsNot Nothing Then FrmInstanceMod.Load.Text = "正在更新 Mod")
+                    Do Until Not PageInstanceMod.UpdatingInstanceModFolders.Contains(Loader.Input)
                         If Loader.IsAborted Then Return
                         Thread.Sleep(100)
                     Loop
                 Finally
-                    RunInUiWait(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.Text = "正在加载 Mod 列表")
+                    RunInUiWait(Sub() If FrmInstanceMod IsNot Nothing Then FrmInstanceMod.Load.Text = "正在加载 Mod 列表")
                 End Try
-                FrmVersionMod.LoaderRun(LoaderFolderRunType.UpdateOnly)
+                FrmInstanceMod.LoaderRun(LoaderFolderRunType.UpdateOnly)
             End If
 
             '获取 Mod 文件夹下的可用文件列表
@@ -835,9 +571,9 @@ Finished:
                 For Each File As FileInfo In EnumerateFiles(Loader.Input)
                     If File.DirectoryName.ToLower & "\" <> RawName Then
                         '仅当 Forge 1.13- 且文件夹名与版本号相同时,才加载该子文件夹下的 Mod
-                        If Not (PageVersionLeft.Version IsNot Nothing AndAlso PageVersionLeft.Version.Version.HasForge AndAlso
-                                PageVersionLeft.Version.Version.McCodeMain < 13 AndAlso
-                                File.Directory.Name = $"1.{PageVersionLeft.Version.Version.McCodeMain}.{PageVersionLeft.Version.Version.McCodeSub}") Then
+                        If Not (PageInstanceLeft.Instance IsNot Nothing AndAlso PageInstanceLeft.Instance.Version.HasForge AndAlso
+                                PageInstanceLeft.Instance.Version.Vanilla.Major < 13 AndAlso
+                                File.Directory.Name = $"1.{PageInstanceLeft.Instance.Version.Vanilla.Major}.{PageInstanceLeft.Instance.Version.Vanilla.Build}") Then
                             Continue For
                         End If
                     End If
@@ -845,10 +581,6 @@ Finished:
                 Next
             End If
 
-            '确定是否显示进度
-            Loader.Progress = 0.05
-            If ModFileList.Count > 50 Then RunInUi(Sub() If FrmVersionMod IsNot Nothing Then FrmVersionMod.Load.ShowProgress = True)
-
             '获取本地文件缓存
             Dim CachePath As String = PathTemp & "Cache\LocalMod.json"
             Dim Cache As New JObject
@@ -869,13 +601,9 @@ Finished:
 
             '加载 Mod 列表
             Dim ModList As New List(Of McMod)
-            Dim ModUpdateList As New List(Of McMod)
             For Each ModFile As FileInfo In ModFileList
-                Loader.Progress += 0.94 / ModFileList.Count
                 If Loader.IsAborted Then Return
-                '加载 McMod 对象
                 Dim ModEntry As New McMod(ModFile.FullName)
-                ModEntry.Load()
                 Dim DumpMod As McMod = ModList.FirstOrDefault(Function(m) m.RawFileName = ModEntry.RawFileName)
                 If DumpMod IsNot Nothing Then
                     Dim DisabledMod As McMod = If(DumpMod.State = McMod.McModState.Disabled, DumpMod, ModEntry)
@@ -884,31 +612,16 @@ Finished:
                         Continue For
                     Else
                         ModList.Remove(DisabledMod)
-                        ModUpdateList.Remove(DisabledMod)
                     End If
                 End If
                 ModList.Add(ModEntry)
-                '读取 Comp 缓存
-                If ModEntry.State = McMod.McModState.Unavailable Then Continue For
-                Dim CacheKey = ModEntry.ModrinthHash & PageVersionLeft.Version.Version.McName & GetTargetModLoaders().Join("")
-                If Cache.ContainsKey(CacheKey) Then
-                    ModEntry.FromJson(Cache(CacheKey))
-                    '如果缓存中的信息在 6 小时以内更新过,则无需重新获取
-                    If ModEntry.CompLoaded AndAlso Date.Now - Cache(CacheKey)("Comp")("CacheTime").ToObject(Of Date) < New TimeSpan(6, 0, 0) Then Continue For
-                End If
-                ModUpdateList.Add(ModEntry)
             Next
-            Loader.Progress = 0.99
-            Log($"[Mod] 共有 {ModList.Count} 个 Mod,其中 {ModUpdateList.Where(Function(m) m.Comp Is Nothing).Count} 个需要联网获取信息,{ModUpdateList.Where(Function(m) m.Comp IsNot Nothing).Count} 个需要更新信息")
+            Log($"[Mod] 共发现 {ModList.Count} 个 Mod")
 
             '排序
-            ModList = ModList.Sort(
-            Function(Left As McMod, Right As McMod) As Boolean
-                If (Left.State = McMod.McModState.Unavailable) <> (Right.State = McMod.McModState.Unavailable) Then
-                    Return Left.State = McMod.McModState.Unavailable
-                Else
-                    Return Not Right.FileName.CompareTo(Left.FileName)
-                End If
+            ModList = ModList.SortByComparison(
+            Function(Left, Right) As Boolean
+                Return Not Right.FileName.CompareTo(Left.FileName)
             End Function)
 
             '回设
@@ -916,10 +629,8 @@ Finished:
             Loader.Output = ModList
 
             '开始联网加载
-            If ModUpdateList.Any() Then
-                'TODO: 添加信息获取中提示
-                McModDetailLoader.Start(New KeyValuePair(Of List(Of McMod), JObject)(ModUpdateList, Cache), IsForceRestart:=True)
-            End If
+            'TODO: 添加信息获取中提示
+            McModDetailLoader.Start(New KeyValuePair(Of List(Of McMod), JObject)(ModList, Cache), IsForceRestart:=True)
 
         Catch ex As Exception
             Log(ex, "Mod 列表加载失败", LogLevel.Debug)
@@ -929,15 +640,31 @@ Finished:
     '联网加载 Mod 详情
     Public McModDetailLoader As New LoaderTask(Of KeyValuePair(Of List(Of McMod), JObject), Integer)("Mod List Detail Loader", AddressOf McModDetailLoad)
     Private Sub McModDetailLoad(Loader As LoaderTask(Of KeyValuePair(Of List(Of McMod), JObject), Integer))
-        Dim Mods As List(Of McMod) = Loader.Input.Key
+        Dim Mods As New List(Of McMod)
         Dim Cache As JObject = Loader.Input.Value
+        '读取 Comp 缓存,获取需要更新的 Mod 列表
+        For Each ModEntry As McMod In Loader.Input.Key
+            If Loader.IsAborted Then Return
+            Dim CacheKey = ModEntry.ModrinthHash & PageInstanceLeft.Instance.Version.VanillaName & GetTargetModLoaders().Join("")
+            If Cache.ContainsKey(CacheKey) Then
+                ModEntry.FromJson(Cache(CacheKey))
+                '如果缓存中的信息在 6 小时以内更新过,则无需重新获取
+                If ModEntry.CompLoaded AndAlso Date.Now - Cache(CacheKey)("Comp")("CacheTime").ToObject(Of Date) < New TimeSpan(6, 0, 0) Then Continue For
+            End If
+            Mods.Add(ModEntry)
+        Next
+        Log($"[Mod] 有 {Mods.Where(Function(m) m.Comp Is Nothing).Count} 个 Mod 需要联网获取信息,{Mods.Where(Function(m) m.Comp IsNot Nothing).Count} 个 Mod 需要更新信息")
+        If Not Mods.Any Then
+            Loader.Input.Key.Where(Function(m) m.Version Is Nothing).ForEach(Sub(m) m.LoadMetadataFromJar())  '从 JAR 中获取缺失的版本信息(下面有另一个分支)
+            Return
+        End If
         '获取作为检查目标的加载器和版本
         '此处不应向下扩展检查的 MC 小版本,例如 Mod 在更新 1.16.5 后,对早期的 1.16.2 版本发布了修补补丁,这会导致 PCL 将 1.16.5 版本的 Mod 降级到 1.16.2
-        Dim TargetMcVersion As McVersionInfo = PageVersionLeft.Version.Version
+        Dim TargetMcVersion As McVersion = PageInstanceLeft.Instance.Version
         Dim ModLoaders = GetTargetModLoaders()
-        Dim McVersion = TargetMcVersion.McName
+        Dim VanillaVersion = TargetMcVersion.VanillaName
         '开始网络获取
-        Log($"[Mod] 目标加载器:{ModLoaders.Join("/")},版本:{McVersion}")
+        Log($"[Mod] 目标加载器:{ModLoaders.Join("/")},版本:{VanillaVersion}")
         Dim EndedThreadCount As Integer = 0, IsFailed As Boolean = False
         Dim CurrentTaskThread As Thread = Thread.CurrentThread
         '从 Modrinth 获取信息
@@ -961,7 +688,11 @@ Finished:
                     ModrinthMapping(ProjectId).Add(Entry)
                     '记录对应的 CompFile
                     Dim File As New CompFile(ModrinthVersion(Entry.ModrinthHash), CompType.Mod)
-                    If Entry.CompFile Is Nothing OrElse Entry.CompFile.ReleaseDate < File.ReleaseDate Then Entry.CompFile = File
+                    If Entry.CompFile Is Nothing OrElse Entry.CompFile.ReleaseDate < File.ReleaseDate Then
+                        Entry.CompFile = File
+                    Else
+                        Entry.CompFile.Version = File.Version '使用来自 Modrinth 的版本号
+                    End If
                 Next
                 If Loader.IsAbortedWithThread(CurrentTaskThread) Then Return
                 Log($"[Mod] 需要从 Modrinth 获取 {ModrinthMapping.Count} 个本地 Mod 的工程信息")
@@ -979,7 +710,7 @@ Finished:
                 '步骤 4:获取更新信息
                 Dim ModrinthUpdate As JObject = DlModRequest("https://api.modrinth.com/v2/version_files/update", HttpMethod.Post,
                     $"{{""hashes"": [""{ModrinthMapping.SelectMany(Function(l) l.Value.Select(Function(m) m.ModrinthHash)).Join(""",""")}""], ""algorithm"": ""sha1"", 
-                    ""loaders"": [""{ModLoaders.Join(""",""").ToLower}""],""game_versions"": [""{McVersion}""]}}", "application/json")
+                    ""loaders"": [""{ModLoaders.Join(""",""").ToLower}""],""game_versions"": [""{VanillaVersion}""]}}", "application/json")
                 For Each Entry In Mods
                     If Not ModrinthUpdate.ContainsKey(Entry.ModrinthHash) OrElse Entry.CompFile Is Nothing Then Continue For
                     Dim UpdateFile As New CompFile(ModrinthUpdate(Entry.ModrinthHash), CompType.Mod)
@@ -988,11 +719,11 @@ Finished:
                     If Entry.CompFile.ReleaseDate >= UpdateFile.ReleaseDate OrElse Entry.CompFile.Hash = UpdateFile.Hash Then Continue For
                     '设置更新日志与更新文件
                     If Entry.UpdateFile IsNot Nothing AndAlso UpdateFile.Hash = Entry.UpdateFile.Hash Then '合并
-                        Entry.ChangelogUrls.Add($"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?g={McVersion}")
+                        Entry.ChangelogUrls.Add($"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?g={VanillaVersion}")
                         UpdateFile.DownloadUrls.AddRange(Entry.UpdateFile.DownloadUrls) '合并下载源
                         Entry.UpdateFile = UpdateFile '优先使用 Modrinth 的文件
                     ElseIf Entry.UpdateFile Is Nothing OrElse UpdateFile.ReleaseDate >= Entry.UpdateFile.ReleaseDate Then '替换
-                        Entry.ChangelogUrls = New List(Of String) From {$"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?g={McVersion}"}
+                        Entry.ChangelogUrls = New List(Of String) From {$"https://modrinth.com/mod/{ModrinthUpdate(Entry.ModrinthHash)("project_id")}/changelog?g={VanillaVersion}"}
                         Entry.UpdateFile = UpdateFile
                     End If
                 Next
@@ -1059,9 +790,9 @@ Finished:
                         For Each IndexEntry In ProjectJson("latestFilesIndexes")
                             If IndexEntry("modLoader") Is Nothing OrElse ModLoaders.Single <> IndexEntry("modLoader").ToObject(Of Integer) Then Continue For 'ModLoader 唯一且匹配
                             Dim IndexVersion As String = IndexEntry("gameVersion")
-                            If IndexVersion <> McVersion Then Continue For 'MC 版本匹配
+                            If IndexVersion <> VanillaVersion Then Continue For 'MC 版本匹配
                             '由于 latestFilesIndexes 是按时间从新到老排序的,所以只需取第一个;如果需要检查多个 releaseType 下的文件,将 > -1 改为 = 1,但这应当并不会获取到更新的文件
-                            If NewestVersion IsNot Nothing AndAlso VersionSortInteger(NewestVersion, IndexVersion) > -1 Then Continue For '只保留最新 MC 版本
+                            If NewestVersion IsNot Nothing AndAlso CompareVersion(NewestVersion, IndexVersion) > -1 Then Continue For '只保留最新 MC 版本
                             If NewestVersion <> IndexVersion Then
                                 NewestVersion = IndexVersion
                                 NewestFileIds.Clear()
@@ -1111,6 +842,8 @@ Finished:
                 EndedThreadCount += 1
             End Try
         End Sub, "Mod List Detail Loader CurseForge")
+        '从 JAR 中获取缺失的版本信息(上面有另一个分支)
+        Loader.Input.Key.Where(Function(m) m.Version Is Nothing).ForEach(Sub(m) m.LoadMetadataFromJar())
         '等待线程结束
         Do Until EndedThreadCount = 2
             Thread.Sleep(10)
@@ -1122,155 +855,25 @@ Finished:
         If Not Mods.Any() Then Return
         For Each Entry In Mods
             Entry.CompLoaded = Not IsFailed
-            Cache(Entry.ModrinthHash & McVersion & ModLoaders.Join("")) = Entry.ToJson()
+            Cache(Entry.ModrinthHash & VanillaVersion & ModLoaders.Join("")) = Entry.ToJson()
         Next
         WriteFile(PathTemp & "Cache\LocalMod.json", Cache.ToString(If(ModeDebug, Newtonsoft.Json.Formatting.Indented, Newtonsoft.Json.Formatting.None)))
         '刷新边栏
         If Loader.IsAborted Then Return
-        If FrmVersionMod?.Filter = PageVersionMod.FilterType.CanUpdate Then
-            RunInUi(Sub() FrmVersionMod?.RefreshUI()) '同步 “可更新” 列表 (#4677)
+        If FrmInstanceMod?.Filter = PageInstanceMod.FilterType.CanUpdate Then
+            RunInUi(Sub() FrmInstanceMod?.RefreshUI()) '同步 “可更新” 列表 (#4677)
         Else
-            RunInUi(Sub() FrmVersionMod?.RefreshBars())
+            RunInUi(Sub() FrmInstanceMod?.RefreshBars())
         End If
     End Sub
     Public Function GetTargetModLoaders() As List(Of CompModLoaderType)
         Dim ModLoaders As New List(Of CompModLoaderType)
-        If PageVersionLeft.Version.Version.HasForge Then ModLoaders.Add(CompModLoaderType.Forge)
-        If PageVersionLeft.Version.Version.HasNeoForge Then ModLoaders.Add(CompModLoaderType.NeoForge)
-        If PageVersionLeft.Version.Version.HasFabric Then ModLoaders.Add(CompModLoaderType.Fabric)
-        If PageVersionLeft.Version.Version.HasLiteLoader Then ModLoaders.Add(CompModLoaderType.LiteLoader)
+        If PageInstanceLeft.Instance.Version.HasForge Then ModLoaders.Add(CompModLoaderType.Forge)
+        If PageInstanceLeft.Instance.Version.HasNeoForge Then ModLoaders.Add(CompModLoaderType.NeoForge)
+        If PageInstanceLeft.Instance.Version.HasFabric Then ModLoaders.Add(CompModLoaderType.Fabric)
+        If PageInstanceLeft.Instance.Version.HasLiteLoader Then ModLoaders.Add(CompModLoaderType.LiteLoader)
         If Not ModLoaders.Any() Then ModLoaders.AddRange({CompModLoaderType.Forge, CompModLoaderType.NeoForge, CompModLoaderType.Fabric, CompModLoaderType.LiteLoader, CompModLoaderType.Quilt})
         Return ModLoaders
     End Function
 
-#If DEBUG Then
-    ''' <summary>
-    ''' 检查 Mod 列表中存在的错误,返回错误信息的集合。
-    ''' </summary>
-    Public Function McModCheck(Version As McVersion, Mods As List(Of McMod)) As List(Of String)
-        Dim Result As New List(Of String)
-        '令所有 Mod 进行基础检查,并归纳需要检查的 Mod
-        Dim CurrentModList As New List(Of McMod)
-        For Each ModEntity In Mods
-            If Not ModEntity.IsFileAvailable Then
-                Result.Add("无法读取的 Mod 文件。" & vbCrLf & " - " & ModEntity.Path)
-                Continue For
-            End If
-            If ModEntity.State = McMod.McModState.Fine AndAlso ModEntity.ModId IsNot Nothing Then CurrentModList.Add(ModEntity)
-        Next
-        '添加默认依赖
-        Dim CurrentDependencies As New Dictionary(Of String, String()) '{DependencyVersion, Path}
-        If Version.State = McVersionState.Forge Then CurrentDependencies.Add("forge", {Version.Version.ForgeVersion, "Forge"})
-        CurrentDependencies.Add("minecraft", {Version.Version.McName, "Minecraft"})
-        '检查重复的 Mod,并添加对应的依赖
-        For Each ModEntity In CurrentModList
-            For Each PossibleModId In ModEntity.PossibleModId
-                If CurrentDependencies.ContainsKey(PossibleModId) Then
-                    If CurrentDependencies(PossibleModId)(2) = 1 Then
-                        Result.Add("重复添加了相同的 Mod,请尝试删除其中一个(ModID:" & PossibleModId & ")。" & vbCrLf &
-                            " - " & ModEntity.FileName & vbCrLf &
-                            " - " & CurrentDependencies(PossibleModId)(1))
-                    Else
-                        Log("[Minecraft] 由于可能有多个 ModID,跳过疑似的重复项(ModID:" & PossibleModId & ")。" & vbCrLf &
-                            " - " & ModEntity.FileName & vbCrLf &
-                            " - " & CurrentDependencies(PossibleModId)(1), LogLevel.Developer)
-                    End If
-                Else
-                    CurrentDependencies.Add(PossibleModId, {ModEntity.Version, ModEntity.FileName, ModEntity.PossibleModId.Count})
-                End If
-            Next
-        Next
-        '检查依赖
-        For Each ModEntity In CurrentModList
-            Try
-                For Each Dependency In ModEntity.Dependencies
-                    Dim ReqId As String = Dependency.Key
-                    If ReqId.Count < 2 Then Continue For '确保正常
-                    If ReqId = ModEntity.ModId Then Continue For '跳过自体引用
-                    If ReqId = "forgemultipartcbe" Then Continue For '跳过莫名其妙的引用
-                    If Dependency.Value IsNot Nothing Then
-                        '获取分段后的详细版本信息
-                        Dim ReqVersion As String = Dependency.Value
-                        Dim ReqVersionHeadCanEqual As Boolean = ReqVersion.StartsWithF("[")
-                        Dim ReqVersionTailCanEqual As Boolean = ReqVersion.EndsWithF("]")
-                        Dim ReqVersionHead As String
-                        Dim ReqVersionTail As String
-                        If ReqVersion.Contains(",") Then
-                            ReqVersionHead = ReqVersion.Split(",")(0).Trim("([ ".ToCharArray())
-                            ReqVersionTail = ReqVersion.Split(",")(1).Trim("]) ".ToCharArray())
-                        Else
-                            ReqVersionHead = ReqVersion.Trim("([]) ".ToCharArray())
-                            ReqVersionTail = ReqVersionHead
-                            If ReqId = "minecraft" AndAlso ReqVersionHead.Split(".").Count = 2 Then
-                                ReqVersionTail = ReqVersionHead.Split(".")(0) & "." & (Val(ReqVersionHead.Split(".")(1)) + 1)
-                                ReqVersionTailCanEqual = False
-                            End If
-                        End If
-                        If ReqVersionHead.StartsWithF("1.") AndAlso ReqVersionHead.Contains("-") Then ReqVersionHead = ReqVersionHead.Substring(ReqVersionHead.LastIndexOfF("-") + 1)
-                        If ReqVersionTail.StartsWithF("1.") AndAlso ReqVersionTail.Contains("-") Then ReqVersionTail = ReqVersionTail.Substring(ReqVersionTail.LastIndexOfF("-") + 1)
-                        '获取报错描述文本
-                        Dim VersionRequire As String
-                        If ReqVersionHead = ReqVersionTail Then
-                            VersionRequire = "应为 " & ReqVersionHead
-                        ElseIf ReqVersionHead.Contains(".") AndAlso ReqVersionTail.Contains(".") Then
-                            VersionRequire = $"应为 {ReqVersionHead} 至 {ReqVersionTail}"
-                        ElseIf ReqVersionHead.Contains(".") Then
-                            If ReqVersionHeadCanEqual Then
-                                VersionRequire = "最低应为 " & ReqVersionHead
-                            Else
-                                VersionRequire = "应高于 " & ReqVersionHead
-                            End If
-                        ElseIf ReqVersionTail.Contains(".") Then
-                            If ReqVersionTailCanEqual Then
-                                VersionRequire = "最高应为 " & ReqVersionHead
-                            Else
-                                VersionRequire = "应低于 " & ReqVersionHead
-                            End If
-                        Else
-                            VersionRequire = ""
-                        End If
-                        '检查前置 Mod 是否存在,并获取其版本
-                        If Not CurrentDependencies.ContainsKey(ReqId) Then
-                            Result.Add($"缺少前置 Mod:{ReqId}{If(VersionRequire = "", "", ",其版本" & VersionRequire)}。{vbCrLf} - {ModEntity.FileName}")
-                            Continue For
-                        End If
-                        Dim CurrentVersion As String = If(CurrentDependencies(ReqId)(0), "0.0")
-                        If CurrentVersion.StartsWithF("1.") AndAlso CurrentVersion.Contains("-") Then CurrentVersion = CurrentVersion.Substring(CurrentVersion.LastIndexOfF("-") + 1)
-                        '对比前置 Mod 头部版本
-                        If ReqVersionHead.Contains(".") Then
-                            If VersionSortInteger(ReqVersionHead, CurrentVersion) > If(ReqVersionHeadCanEqual, 0, -1) Then
-                                Result.Add(ReqId.Substring(0, 1).ToUpper & ReqId.Substring(1) & " 版本过低,其版本" & VersionRequire & ",而当前版本为 " & CurrentVersion & "。" & vbCrLf &
-                                           " - " & ModEntity.FileName & If(ReqId <> "minecraft" AndAlso ReqId <> "forge", $"{vbCrLf} - 前置:{CurrentDependencies(ReqId)(1)}", ""))
-                                Continue For
-                            End If
-                        End If
-                        '对比前置 Mod 尾部版本
-                        If ReqVersionTail.Contains(".") Then
-                            If VersionSortInteger(CurrentVersion, ReqVersionTail) > If(ReqVersionTailCanEqual, 0, -1) Then
-                                Result.Add(ReqId.Substring(0, 1).ToUpper & ReqId.Substring(1) & " 版本过高,其版本" & VersionRequire & ",而当前版本为 " & CurrentVersion & "。" & vbCrLf &
-                                           " - " & ModEntity.FileName & If(ReqId <> "minecraft" AndAlso ReqId <> "forge", $"{vbCrLf} - 前置:{CurrentDependencies(ReqId)(1)}", ""))
-                                Continue For
-                            End If
-                        End If
-                    Else
-                        If Not CurrentDependencies.ContainsKey(Dependency.Key) Then
-                            Result.Add($"缺少前置 Mod:{Dependency.Key}。{vbCrLf} - {ModEntity.FileName}")
-                            Continue For
-                        End If
-                    End If
-                Next
-            Catch ex As Exception
-                Result.Add($"检查 Mod 时出错:{ex.GetBrief()}{vbCrLf} - {ModEntity.FileName}")
-                Log(ex, "检查 Mod 时出错")
-            End Try
-        Next
-        If Not Result.Any() Then
-            Log("[Minecraft] Mod 检查未发现异常")
-        Else
-            Log($"[Minecraft] Mod 检查异常结果:{vbCrLf}{Join(Result, vbCrLf)}")
-        End If
-        Return Result
-    End Function
-#End If
-
 End Module

+ 74 - 75
Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb

@@ -24,13 +24,13 @@ Public Module ModModpack
     ''' 必须在工作线程执行。
     ''' </summary>
     ''' <exception cref="CancelledException" />
-    Public Function ModpackInstall(File As String, Optional VersionName As String = Nothing, Optional Logo As String = Nothing) As LoaderCombo(Of String)
+    Public Function ModpackInstall(File As String, Optional InstanceName As String = Nothing, Optional Logo As String = Nothing) As LoaderCombo(Of String)
         Log("[ModPack] 整合包安装请求:" & If(File, "null"))
         Dim Archive As ZipArchive = Nothing
         Dim ArchiveBaseFolder As String = ""
         Try
             '字符校验
-            Dim TargetFolder As String = $"{PathMcFolder}versions\{VersionName}\"
+            Dim TargetFolder As String = $"{McFolderSelected}versions\{InstanceName}\"
             If TargetFolder.Contains("!") OrElse TargetFolder.Contains(";") Then Hint("游戏路径中不能含有感叹号或分号:" & TargetFolder, HintType.Red) : Throw New CancelledException
             '获取整合包种类与关键 Json
             Dim PackType As Integer = -1
@@ -84,7 +84,7 @@ Public Module ModModpack
             Select Case PackType
                 Case 0
                     Log("[ModPack] 整合包种类:CurseForge")
-                    Return InstallPackCurseForge(File, Archive, ArchiveBaseFolder, VersionName, Logo)
+                    Return InstallPackCurseForge(File, Archive, ArchiveBaseFolder, InstanceName, Logo)
                 Case 1
                     Log("[ModPack] 整合包种类:HMCL")
                     Return InstallPackHMCL(File, Archive, ArchiveBaseFolder)
@@ -93,10 +93,10 @@ Public Module ModModpack
                     Return InstallPackMMC(File, Archive, ArchiveBaseFolder)
                 Case 3
                     Log("[ModPack] 整合包种类:MCBBS")
-                    Return InstallPackMCBBS(File, Archive, ArchiveBaseFolder, VersionName)
+                    Return InstallPackMCBBS(File, Archive, ArchiveBaseFolder, InstanceName)
                 Case 4
                     Log("[ModPack] 整合包种类:Modrinth")
-                    Return InstallPackModrinth(File, Archive, ArchiveBaseFolder, VersionName, Logo)
+                    Return InstallPackModrinth(File, Archive, ArchiveBaseFolder, InstanceName, Logo)
                 Case 9
                     Log("[ModPack] 整合包种类:带启动器的压缩包")
                     Return InstallPackLauncherPack(File, Archive, ArchiveBaseFolder)
@@ -180,7 +180,7 @@ Retry:
 
     'CurseForge
     Private Function InstallPackCurseForge(FileAddress As String, Archive As Compression.ZipArchive, ArchiveBaseFolder As String,
-                                           Optional VersionName As String = Nothing, Optional Logo As String = Nothing) As LoaderCombo(Of String)
+                                           Optional InstanceName As String = Nothing, Optional Logo As String = Nothing) As LoaderCombo(Of String)
 
         '读取 Json 文件
         Dim Json As JObject
@@ -192,12 +192,12 @@ Retry:
         If Json("minecraft") Is Nothing OrElse Json("minecraft")("version") Is Nothing Then Throw New Exception("CurseForge 整合包未提供 Minecraft 版本信息")
 
         '获取版本名
-        If VersionName Is Nothing Then
-            VersionName = If(Json("name"), "")
-            Dim Validate As New ValidateFolderName(PathMcFolder & "versions")
-            If Validate.Validate(VersionName) <> "" Then VersionName = ""
-            If VersionName = "" Then VersionName = MyMsgBoxInput("输入版本名称", "", "", New ObjectModel.Collection(Of Validate) From {Validate})
-            If String.IsNullOrEmpty(VersionName) Then Throw New CancelledException
+        If InstanceName Is Nothing Then
+            InstanceName = If(Json("name"), "")
+            Dim Validate As New ValidateFolderName(McFolderSelected & "versions")
+            If Validate.Validate(InstanceName) <> "" Then InstanceName = ""
+            If InstanceName = "" Then InstanceName = MyMsgBoxInput("输入版本名称", "", "", New ObjectModel.Collection(Of Validate) From {Validate})
+            If String.IsNullOrEmpty(InstanceName) Then Throw New CancelledException
         End If
 
         '获取 Mod API 版本信息
@@ -234,7 +234,7 @@ Retry:
                 ExtractModpackFiles(InstallTemp, FileAddress, Task, 0.6)
                 CopyOverrideDirectory(
                     InstallTemp & ArchiveBaseFolder & If(OverrideHome = "." OrElse OverrideHome = "./", "", OverrideHome), '#5613
-                    $"{PathMcFolder}versions\{VersionName}",
+                    $"{McFolderSelected}versions\{InstanceName}",
                     Task, 0.4)
             End Sub) With {
             .ProgressWeight = New FileInfo(FileAddress).Length / 1024 / 1024 / 6, .Block = False}) '每 6M 需要 1s
@@ -292,7 +292,7 @@ Retry:
                     Dim File As New CompFile(ModJson, Type)
                     If Not File.Available Then Continue For
                     '实际的添加
-                    FileList.Add(Id, File.ToNetFile($"{PathMcFolder}versions\{VersionName}\{TargetFolder}\"))
+                    FileList.Add(Id, File.ToNetFile($"{McFolderSelected}versions\{InstanceName}\{TargetFolder}\"))
                     Task.Progress += 1 / (1 + ModList.Count)
                 Next
                 Task.Output = FileList.Values.ToList
@@ -306,8 +306,8 @@ Retry:
 
         '构造加载器
         Dim Request As New McInstallRequest With {
-            .TargetVersionName = VersionName,
-            .TargetVersionFolder = $"{PathMcFolder}versions\{VersionName}\",
+            .NewInstanceName = InstanceName,
+            .VersionFolder = $"{McFolderSelected}versions\{InstanceName}\",
             .MinecraftName = Json("minecraft")("version").ToString,
             .ForgeVersion = ForgeVersion,
             .NeoForgeVersion = NeoForgeVersion,
@@ -321,7 +321,7 @@ Retry:
         Loaders.Add(New LoaderTask(Of String, String)("最终整理文件",
         Sub(Task As LoaderTask(Of String, String))
             '设置图标
-            Dim VersionFolder As String = $"{PathMcFolder}versions\{VersionName}\"
+            Dim VersionFolder As String = $"{McFolderSelected}versions\{InstanceName}\"
             If Logo IsNot Nothing AndAlso File.Exists(Logo) Then
                 File.Copy(Logo, VersionFolder & "PCL\Logo.png", True)
                 WriteIni(VersionFolder & "PCL\Setup.ini", "Logo", "PCL\Logo.png")
@@ -342,7 +342,7 @@ Retry:
         End Sub) With {.ProgressWeight = 0.1, .Show = False})
 
         '重复任务检查
-        Dim LoaderName As String = "CurseForge 整合包安装:" & VersionName & " "
+        Dim LoaderName As String = "CurseForge 整合包安装:" & InstanceName & " "
         If LoaderTaskbar.Any(Function(l) l.Name = LoaderName) Then
             Hint("该整合包正在安装中!", HintType.Red)
             Throw New CancelledException
@@ -350,7 +350,7 @@ Retry:
 
         '启动
         Dim Loader As New LoaderCombo(Of String)(LoaderName, Loaders) With {.OnStateChanged = AddressOf McInstallState}
-        Loader.Start(Request.TargetVersionFolder)
+        Loader.Start(Request.VersionFolder)
         LoaderTaskbarAdd(Loader)
         FrmMain.BtnExtraDownload.ShowRefresh()
         RunInUi(Sub() FrmMain.PageChange(FormMain.PageType.DownloadManager))
@@ -358,7 +358,7 @@ Retry:
     End Function
 
     'Modrinth
-    Private Function InstallPackModrinth(FileAddress As String, Archive As Compression.ZipArchive, ArchiveBaseFolder As String, Optional VersionName As String = Nothing, Optional Logo As String = Nothing) As LoaderCombo(Of String)
+    Private Function InstallPackModrinth(FileAddress As String, Archive As Compression.ZipArchive, ArchiveBaseFolder As String, Optional InstanceName As String = Nothing, Optional Logo As String = Nothing) As LoaderCombo(Of String)
 
         '读取 Json 文件
         Dim Json As JObject
@@ -392,12 +392,12 @@ Retry:
             End Select
         Next
         '获取版本名
-        If VersionName Is Nothing Then
-            VersionName = If(Json("name"), "")
-            Dim Validate As New ValidateFolderName(PathMcFolder & "versions")
-            If Validate.Validate(VersionName) <> "" Then VersionName = ""
-            If VersionName = "" Then VersionName = MyMsgBoxInput("输入版本名称", "", "", New ObjectModel.Collection(Of Validate) From {Validate})
-            If String.IsNullOrEmpty(VersionName) Then Throw New CancelledException
+        If InstanceName Is Nothing Then
+            InstanceName = If(Json("name"), "")
+            Dim Validate As New ValidateFolderName(McFolderSelected & "versions")
+            If Validate.Validate(InstanceName) <> "" Then InstanceName = ""
+            If InstanceName = "" Then InstanceName = MyMsgBoxInput("输入版本名称", "", "", New ObjectModel.Collection(Of Validate) From {Validate})
+            If String.IsNullOrEmpty(InstanceName) Then Throw New CancelledException
         End If
         '解压
         Dim InstallTemp As String = RequestTaskTempFolder()
@@ -407,11 +407,11 @@ Retry:
             ExtractModpackFiles(InstallTemp, FileAddress, Task, 0.5)
             CopyOverrideDirectory(
                 InstallTemp & ArchiveBaseFolder & "overrides",
-                PathMcFolder & "versions\" & VersionName,
+                McFolderSelected & "versions\" & InstanceName,
                 Task, 0.4)
             CopyOverrideDirectory(
                 InstallTemp & ArchiveBaseFolder & "client-overrides",
-                PathMcFolder & "versions\" & VersionName,
+                McFolderSelected & "versions\" & InstanceName,
                 Task, 0.1)
         End Sub) With {.ProgressWeight = New FileInfo(FileAddress).Length / 1024 / 1024 / 6, .Block = False}) '每 6M 需要 1s
         '获取下载文件列表
@@ -433,8 +433,8 @@ Retry:
             Dim Urls = File("downloads").SelectMany(Function(t) CompFile.HandleCurseForgeDownloadUrls(t.ToString)).ToList
             Urls.AddRange(Urls.Select(Function(u) DlSourceModGet(u)).ToList)
             Urls = Urls.Distinct.ToList()
-            Dim TargetPath As String = $"{PathMcFolder}versions\{VersionName}\{File("path")}"
-            If Not IO.Path.GetFullPath(TargetPath).StartsWithF($"{PathMcFolder}versions\{VersionName}\", True) Then
+            Dim TargetPath As String = $"{McFolderSelected}versions\{InstanceName}\{File("path")}"
+            If Not IO.Path.GetFullPath(TargetPath).StartsWithF($"{McFolderSelected}versions\{InstanceName}\", True) Then
                 MyMsgBox($"整合包的文件路径超出了版本文件夹,请向整合包作者反馈此问题!" & vbCrLf & "错误的文件:" & TargetPath, "文件路径校验失败", IsWarn:=True)
                 Throw New CancelledException
             End If
@@ -447,8 +447,8 @@ Retry:
 
         '构造加载器
         Dim Request As New McInstallRequest With {
-            .TargetVersionName = VersionName,
-            .TargetVersionFolder = $"{PathMcFolder}versions\{VersionName}\",
+            .NewInstanceName = InstanceName,
+            .VersionFolder = $"{McFolderSelected}versions\{InstanceName}\",
             .MinecraftName = MinecraftVersion,
             .ForgeVersion = ForgeVersion,
             .NeoForgeVersion = NeoForgeVersion,
@@ -462,7 +462,7 @@ Retry:
         Loaders.Add(New LoaderTask(Of String, String)("最终整理文件",
         Sub(Task As LoaderTask(Of String, String))
             '设置图标
-            Dim VersionFolder As String = $"{PathMcFolder}versions\{VersionName}\"
+            Dim VersionFolder As String = $"{McFolderSelected}versions\{InstanceName}\"
             If Logo IsNot Nothing AndAlso File.Exists(Logo) Then
                 File.Copy(Logo, VersionFolder & "PCL\Logo.png", True)
                 WriteIni(VersionFolder & "PCL\Setup.ini", "Logo", "PCL\Logo.png")
@@ -483,7 +483,7 @@ Retry:
         End Sub) With {.ProgressWeight = 0.1, .Show = False})
 
         '重复任务检查
-        Dim LoaderName As String = $"Modrinth 整合包安装:{VersionName} "
+        Dim LoaderName As String = $"Modrinth 整合包安装:{InstanceName} "
         If LoaderTaskbar.Any(Function(l) l.Name = LoaderName) Then
             Hint("该整合包正在安装中!", HintType.Red)
             Throw New CancelledException
@@ -491,7 +491,7 @@ Retry:
 
         '启动
         Dim Loader As New LoaderCombo(Of String)(LoaderName, Loaders) With {.OnStateChanged = AddressOf McInstallState}
-        Loader.Start(Request.TargetVersionFolder)
+        Loader.Start(Request.VersionFolder)
         LoaderTaskbarAdd(Loader)
         FrmMain.BtnExtraDownload.ShowRefresh()
         RunInUi(Sub() FrmMain.PageChange(FormMain.PageType.DownloadManager))
@@ -508,11 +508,11 @@ Retry:
             Throw New Exception("HMCL 整合包安装信息存在问题", ex)
         End Try
         '获取版本名
-        Dim VersionName As String = If(Json("name"), "")
-        Dim Validate As New ValidateFolderName(PathMcFolder & "versions")
-        If Validate.Validate(VersionName) <> "" Then VersionName = ""
-        If VersionName = "" Then VersionName = MyMsgBoxInput("输入版本名称", "", "", New ObjectModel.Collection(Of Validate) From {Validate})
-        If String.IsNullOrEmpty(VersionName) Then Throw New CancelledException
+        Dim InstanceName As String = If(Json("name"), "")
+        Dim Validate As New ValidateFolderName(McFolderSelected & "versions")
+        If Validate.Validate(InstanceName) <> "" Then InstanceName = ""
+        If InstanceName = "" Then InstanceName = MyMsgBoxInput("输入版本名称", "", "", New ObjectModel.Collection(Of Validate) From {Validate})
+        If String.IsNullOrEmpty(InstanceName) Then Throw New CancelledException
         '解压
         Dim InstallTemp As String = RequestTaskTempFolder()
         Dim InstallLoaders As New List(Of LoaderBase)
@@ -521,14 +521,14 @@ Retry:
             ExtractModpackFiles(InstallTemp, FileAddress, Task, 0.6)
             CopyOverrideDirectory(
                 InstallTemp & ArchiveBaseFolder & "minecraft",
-                PathMcFolder & "versions\" & VersionName,
+                McFolderSelected & "versions\" & InstanceName,
                 Task, 0.4)
         End Sub) With {.ProgressWeight = New FileInfo(FileAddress).Length / 1024 / 1024 / 6, .Block = False}) '每 6M 需要 1s
         '构造游戏本体安装加载器
         If Json("gameVersion") Is Nothing Then Throw New Exception("该 HMCL 整合包未提供游戏版本信息,无法安装!")
         Dim Request As New McInstallRequest With {
-            .TargetVersionName = VersionName,
-            .TargetVersionFolder = $"{PathMcFolder}versions\{VersionName}\",
+            .NewInstanceName = InstanceName,
+            .VersionFolder = $"{McFolderSelected}versions\{InstanceName}\",
             .MinecraftName = Json("gameVersion").ToString
         }
         Dim MergeLoaders As List(Of LoaderBase) = McInstallLoader(Request)
@@ -538,14 +538,14 @@ Retry:
             New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .ProgressWeight = MergeLoaders.Sum(Function(l) l.ProgressWeight)}
         }
         '重复任务检查
-        Dim LoaderName As String = "HMCL 整合包安装:" & VersionName & " "
+        Dim LoaderName As String = "HMCL 整合包安装:" & InstanceName & " "
         If LoaderTaskbar.Any(Function(l) l.Name = LoaderName) Then
             Hint("该整合包正在安装中!", HintType.Red)
             Throw New CancelledException
         End If
         '启动
         Dim Loader As New LoaderCombo(Of String)(LoaderName, Loaders) With {.OnStateChanged = AddressOf McInstallState}
-        Loader.Start(Request.TargetVersionFolder)
+        Loader.Start(Request.VersionFolder)
         LoaderTaskbarAdd(Loader)
         FrmMain.BtnExtraDownload.ShowRefresh()
         RunInUi(Sub() FrmMain.PageChange(FormMain.PageType.DownloadManager))
@@ -563,21 +563,21 @@ Retry:
             Throw New Exception("MMC 整合包安装信息存在问题", ex)
         End Try
         '获取版本名
-        Dim VersionName As String = If(RegexSeek(PackInstance, "(?<=\nname\=)[^\n]+"), "")
-        Dim Validate As New ValidateFolderName(PathMcFolder & "versions")
-        If Validate.Validate(VersionName) <> "" Then VersionName = ""
-        If VersionName = "" Then VersionName = MyMsgBoxInput("输入版本名称", "", "", New ObjectModel.Collection(Of Validate) From {Validate})
-        If String.IsNullOrEmpty(VersionName) Then Throw New CancelledException
+        Dim InstanceName As String = If(RegexSeek(PackInstance, "(?<=\nname\=)[^\n]+"), "")
+        Dim Validate As New ValidateFolderName(McFolderSelected & "versions")
+        If Validate.Validate(InstanceName) <> "" Then InstanceName = ""
+        If InstanceName = "" Then InstanceName = MyMsgBoxInput("输入版本名称", "", "", New ObjectModel.Collection(Of Validate) From {Validate})
+        If String.IsNullOrEmpty(InstanceName) Then Throw New CancelledException
         '解压
         Dim InstallTemp As String = RequestTaskTempFolder()
-        Dim SetupFile As String = $"{PathMcFolder}versions\{VersionName}\PCL\Setup.ini"
+        Dim SetupFile As String = $"{McFolderSelected}versions\{InstanceName}\PCL\Setup.ini"
         Dim InstallLoaders As New List(Of LoaderBase)
         InstallLoaders.Add(New LoaderTask(Of String, Integer)("解压整合包文件",
         Sub(Task As LoaderTask(Of String, Integer))
             ExtractModpackFiles(InstallTemp, FileAddress, Task, 0.55)
             CopyOverrideDirectory(
                 InstallTemp & ArchiveBaseFolder & ".minecraft",
-                PathMcFolder & "versions\" & VersionName,
+                McFolderSelected & "versions\" & InstanceName,
                 Task, 0.4)
             '读取 MMC 设置文件(#2655)
             Try
@@ -616,7 +616,7 @@ Retry:
                     If Logo <> "" AndAlso File.Exists($"{InstallTemp}{ArchiveBaseFolder}{Logo}.png") Then
                         WriteIni(SetupFile, "LogoCustom", True)
                         WriteIni(SetupFile, "Logo", "PCL\Logo.png")
-                        CopyFile($"{InstallTemp}{ArchiveBaseFolder}{Logo}.png", $"{PathMcFolder}versions\{VersionName}\PCL\Logo.png")
+                        CopyFile($"{InstallTemp}{ArchiveBaseFolder}{Logo}.png", $"{McFolderSelected}versions\{InstanceName}\PCL\Logo.png")
                         Log($"[ModPack] 迁移 MultiMC 版本独立设置:版本图标({Logo}.png)")
                     End If
                     'JVM 参数
@@ -638,7 +638,7 @@ Retry:
         End Sub) With {.ProgressWeight = New FileInfo(FileAddress).Length / 1024 / 1024 / 6, .Block = False}) '每 6M 需要 1s
         '构造版本安装请求
         If PackJson("components") Is Nothing Then Throw New Exception("该 MMC 整合包未提供游戏版本信息,无法安装!")
-        Dim Request As New McInstallRequest With {.TargetVersionName = VersionName, .TargetVersionFolder = $"{PathMcFolder}versions\{VersionName}\"}
+        Dim Request As New McInstallRequest With {.NewInstanceName = InstanceName, .VersionFolder = $"{McFolderSelected}versions\{InstanceName}\"}
         For Each Component As JObject In PackJson("components")
             If Not Component.ContainsKey("uid") Then Continue For
             Select Case Component("uid").ToString
@@ -665,7 +665,7 @@ Retry:
         Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .ProgressWeight = MergeLoaders.Sum(Function(l) l.ProgressWeight)})
 
         '重复任务检查
-        Dim LoaderName As String = "MMC 整合包安装:" & VersionName & " "
+        Dim LoaderName As String = "MMC 整合包安装:" & InstanceName & " "
         If LoaderTaskbar.Any(Function(l) l.Name = LoaderName) Then
             Hint("该整合包正在安装中!", HintType.Red)
             Throw New CancelledException
@@ -673,7 +673,7 @@ Retry:
 
         '启动
         Dim Loader As New LoaderCombo(Of String)(LoaderName, Loaders) With {.OnStateChanged = AddressOf McInstallState}
-        Loader.Start(Request.TargetVersionFolder)
+        Loader.Start(Request.VersionFolder)
         LoaderTaskbarAdd(Loader)
         FrmMain.BtnExtraDownload.ShowRefresh()
         RunInUi(Sub() FrmMain.PageChange(FormMain.PageType.DownloadManager))
@@ -682,7 +682,7 @@ Retry:
 
     'MCBBS
     Private Function InstallPackMCBBS(FileAddress As String, Archive As Compression.ZipArchive, ArchiveBaseFolder As String,
-                                      Optional VersionName As String = Nothing) As LoaderCombo(Of String)
+                                      Optional InstanceName As String = Nothing) As LoaderCombo(Of String)
         '读取 Json 文件
         Dim Json As JObject
         Try
@@ -692,23 +692,23 @@ Retry:
             Throw New Exception("MCBBS 整合包安装信息存在问题", ex)
         End Try
         '获取版本名
-        If VersionName Is Nothing Then
-            VersionName = If(Json("name"), "")
-            Dim Validate As New ValidateFolderName(PathMcFolder & "versions")
-            If Validate.Validate(VersionName) <> "" Then VersionName = ""
-            If VersionName = "" Then VersionName = MyMsgBoxInput("输入版本名称", "", "", New ObjectModel.Collection(Of Validate) From {Validate})
-            If String.IsNullOrEmpty(VersionName) Then Throw New CancelledException
+        If InstanceName Is Nothing Then
+            InstanceName = If(Json("name"), "")
+            Dim Validate As New ValidateFolderName(McFolderSelected & "versions")
+            If Validate.Validate(InstanceName) <> "" Then InstanceName = ""
+            If InstanceName = "" Then InstanceName = MyMsgBoxInput("输入版本名称", "", "", New ObjectModel.Collection(Of Validate) From {Validate})
+            If String.IsNullOrEmpty(InstanceName) Then Throw New CancelledException
         End If
         '解压
         Dim InstallTemp As String = RequestTaskTempFolder()
-        Dim SetupFile As String = $"{PathMcFolder}versions\{VersionName}\PCL\Setup.ini"
+        Dim SetupFile As String = $"{McFolderSelected}versions\{InstanceName}\PCL\Setup.ini"
         Dim InstallLoaders As New List(Of LoaderBase)
         InstallLoaders.Add(New LoaderTask(Of String, Integer)("解压整合包文件",
         Sub(Task As LoaderTask(Of String, Integer))
             ExtractModpackFiles(InstallTemp, FileAddress, Task, 0.6)
             CopyOverrideDirectory(
                 InstallTemp & ArchiveBaseFolder & "overrides",
-                PathMcFolder & "versions\" & VersionName,
+                McFolderSelected & "versions\" & InstanceName,
                 Task, 0.4)
             'JVM 参数
             If Json("launchInfo") IsNot Nothing Then
@@ -729,8 +729,8 @@ Retry:
             Throw New CancelledException
         End If
         Dim Request As New McInstallRequest With {
-            .TargetVersionName = VersionName,
-            .TargetVersionFolder = $"{PathMcFolder}versions\{VersionName}\",
+            .NewInstanceName = InstanceName,
+            .VersionFolder = $"{McFolderSelected}versions\{InstanceName}\",
             .MinecraftName = Addons("game"),
             .OptiFineVersion = If(Addons.ContainsKey("optifine"), Addons("optifine"), Nothing),
             .ForgeVersion = If(Addons.ContainsKey("forge"), Addons("forge"), Nothing),
@@ -744,7 +744,7 @@ Retry:
         Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .ProgressWeight = MergeLoaders.Sum(Function(l) l.ProgressWeight)})
 
         '重复任务检查
-        Dim LoaderName As String = "MCBBS 整合包安装:" & VersionName & " "
+        Dim LoaderName As String = "MCBBS 整合包安装:" & InstanceName & " "
         If LoaderTaskbar.Any(Function(l) l.Name = LoaderName) Then
             Hint("该整合包正在安装中!", HintType.Red)
             Throw New CancelledException
@@ -753,7 +753,7 @@ Retry:
         '启动
         Dim Loader As New LoaderCombo(Of String)(LoaderName, Loaders) With {.OnStateChanged = AddressOf McInstallState}
         'If Archive IsNot Nothing Then Archive.Dispose() '解除占用,以免在加载器中触发 “正由另一进程使用,因此该进程无法访问此文件”
-        Loader.Start(Request.TargetVersionFolder)
+        Loader.Start(Request.VersionFolder)
         LoaderTaskbarAdd(Loader)
         FrmMain.BtnExtraDownload.ShowRefresh()
         RunInUi(Sub() FrmMain.PageChange(FormMain.PageType.DownloadManager))
@@ -805,11 +805,11 @@ Retry:
                 End If
                 OpenExplorer(TargetFolder)
                 '加入文件夹列表
-                Dim VersionName As String = GetFolderNameFromPath(TargetFolder)
+                Dim InstanceName As String = GetFolderNameFromPath(TargetFolder)
                 Directory.CreateDirectory(TargetFolder & ".minecraft\")
                 PageSelectLeft.AddFolder(
                     TargetFolder & ".minecraft\" & ArchiveBaseFolder.Replace("/", "\").TrimStart("\"), '格式例如:包裹文件夹\.minecraft\(最短为空字符串)
-                    VersionName, False)
+                    InstanceName, False)
                 '调用 modpack 文件进行安装
                 Dim ModpackFile = Directory.GetFiles(TargetFolder, "modpack.*", SearchOption.AllDirectories).First
                 Log("[Modpack] 调用 modpack 文件继续安装:" & ModpackFile)
@@ -835,10 +835,9 @@ Retry:
                 Exit For
             End If
         Next
-        If Match Is Nothing Then Throw New Exception("未能找到适合的文件结构,这可能不是一个 MC 压缩包") '没有匹配
+        If Match Is Nothing Then Throw New Exception("文件结构不匹配,这可能不是 Minecraft 客户端压缩包?") '没有匹配
         Dim ArchiveBaseFolder As String = Match.Value.Replace("/", "\").TrimStart("\") '格式例如:包裹文件夹\.minecraft\(最短为空字符串)
-        Dim VersionName As String = Match.Groups(1).Value
-        Log("[ModPack] 检测到压缩包的 .minecraft 根目录:" & ArchiveBaseFolder & ",命中的版本名:" & VersionName)
+        Log("[ModPack] 检测到压缩包的 .minecraft 根目录:" & ArchiveBaseFolder & ",命中的版本名:" & Match.Groups(1).Value)
         '获取解压路径
         MyMsgBox("接下来请选择一个空文件夹,它会被安装到这个文件夹里。", "安装", "继续", ForceWait:=True)
         Dim TargetFolder As String = SelectFolder("选择安装目标(必须是一个空文件夹)")
@@ -853,7 +852,7 @@ Retry:
                 '加入文件夹列表
                 PageSelectLeft.AddFolder(TargetFolder & ArchiveBaseFolder, GetFolderNameFromPath(TargetFolder), False)
                 Thread.Sleep(400) '避免文件争用
-                RunInUi(Sub() FrmMain.PageChange(FormMain.PageType.VersionSelect))
+                RunInUi(Sub() FrmMain.PageChange(FormMain.PageType.InstanceSelect))
             End Sub)
         }) With {.OnStateChanged = AddressOf McInstallState}
         Loader.Start(TargetFolder)

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

@@ -58,13 +58,13 @@
 
         '初始化
         Public GameProcess As Process
-        Public Version As McVersion
+        Public Instance As McInstance
         Private WindowTitle As String = ""
         Private PID As Integer
         Public Loader As LoaderTask(Of Process, Integer)
-        Public Sub New(Loader As LoaderTask(Of Process, Integer), Version As McVersion, WindowTitle As String)
+        Public Sub New(Loader As LoaderTask(Of Process, Integer), Instance As McInstance, WindowTitle As String)
             Me.Loader = Loader
-            Me.Version = Version
+            Me.Instance = Instance
             Me.WindowTitle = WindowTitle
             Me.PID = Loader.Input.Id
             WatcherLog("开始 Minecraft 日志监控")
@@ -97,7 +97,7 @@
                         '设置窗口标题
                         For i = 1 To 3
                             If IsWindowFinished AndAlso IsWindowAppeared AndAlso WindowTitle <> "" AndAlso State = MinecraftState.Running AndAlso Not GameProcess.HasExited Then
-                                Dim RealTitle As String = WindowTitle.Replace("{date}", Date.Now.ToString("yyyy/M/d")).Replace("{time}", Date.Now.ToString("HH:mm:ss"))
+                                Dim RealTitle As String = WindowTitle.Replace("{date}", Date.Now.ToString("yyyy'/'M'/'d")).Replace("{time}", Date.Now.ToString("HH':'mm':'ss"))
                                 SetWindowText(WindowHandle, RealTitle.ToCharArray)
                             End If
                             Thread.Sleep(64)
@@ -164,7 +164,7 @@
                         '窗口未出现
                         WatcherLog("Minecraft 尚未加载完成,可能已崩溃")
                         Crashed()
-                    ElseIf GameProcess.ExitCode <> 0 AndAlso State = MinecraftState.Running AndAlso Version.ReleaseTime.Year >= 2012 Then
+                    ElseIf GameProcess.ExitCode <> 0 AndAlso State = MinecraftState.Running AndAlso Instance.ReleaseTime.Year >= 2012 Then
                         '返回值不为 0 且未结束
                         WatcherLog("Minecraft 返回值异常,可能已崩溃")
                         Crashed()
@@ -356,12 +356,12 @@
                 Try
                     Thread.Sleep(2000)
                     WatcherLog("崩溃分析开始")
-                    Dim Analyzer As New CrashAnalyzer(Version)
-                    Analyzer.Collect(Version.PathIndie, LatestLog.ToList)
+                    Dim Analyzer As New CrashAnalyzer(Instance)
+                    Analyzer.Collect(Instance.PathIndie, LatestLog.ToList)
                     Analyzer.Prepare()
-                    Analyzer.Analyze(Version)
+                    Analyzer.Analyze()
                     Analyzer.Output(False, New List(Of String) From
-                        {Version.Path & Version.Name & ".json", Path & "PCL\Log1.txt", Path & "PCL\LatestLaunch.bat"})
+                        {Instance.PathVersion & Instance.Name & ".json", Path & "PCL\Log1.txt", Path & "PCL\LatestLaunch.bat"})
                 Catch ex As Exception
                     Log(ex, "崩溃分析失败", LogLevel.Feedback)
                 End Try

+ 31 - 6
Plain Craft Launcher 2/Modules/ModEvent.vb

@@ -96,11 +96,36 @@ End Module
 ''' 自定义事件。
 ''' </summary>
 Public Class CustomEvent
+    Inherits DependencyObject
 
 #Region "属性与触发"
 
-    Public Property Type As EventType = EventType.None
-    Public Property Data As String = Nothing
+    Public Property Type As EventType
+        Get
+            Dim Value As EventType = EventType.None
+            RunInUiWait(Sub() Value = GetValue(TypeProperty))
+            Return Value
+        End Get
+        Set(value As EventType)
+            SetValue(TypeProperty, value)
+        End Set
+    End Property
+    Public Shared ReadOnly TypeProperty As DependencyProperty =
+        DependencyProperty.Register("Type", GetType(EventType), GetType(CustomEvent), New PropertyMetadata(EventType.None))
+
+    Public Property Data As String
+        Get
+            Dim Value As String = Nothing
+            RunInUiWait(Sub() Value = GetValue(DataProperty))
+            Return Value
+        End Get
+        Set(value As String)
+            SetValue(DataProperty, value)
+        End Set
+    End Property
+    Public Shared ReadOnly DataProperty As DependencyProperty =
+        DependencyProperty.Register("Data", GetType(String), GetType(CustomEvent), New PropertyMetadata(Nothing))
+
     Public Sub New()
     End Sub
     Public Sub New(Type As EventType, Data As String)
@@ -190,17 +215,17 @@ Public Class CustomEvent
 
                 Case EventType.启动游戏
                     If Args(0) = "\current" Then
-                        If McVersionCurrent Is Nothing Then
+                        If McInstanceSelected Is Nothing Then
                             Hint("请先选择一个 Minecraft 版本!", HintType.Red)
                             Return
                         Else
-                            Args(0) = McVersionCurrent.Name
+                            Args(0) = McInstanceSelected.Name
                         End If
                     End If
                     RunInUi(
                     Sub()
                         If McLaunchStart(New McLaunchOptions With
-                                {.ServerIp = If(Args.Length >= 2, Args(1), Nothing), .Version = New McVersion(Args(0))}) Then
+                                {.ServerIp = If(Args.Length >= 2, Args(1), Nothing), .Instance = New McInstance(Args(0))}) Then
                             Hint($"正在启动 {Args(0)}……")
                         End If
                     End Sub)
@@ -276,7 +301,7 @@ Public Class CustomEvent
 
                 Case EventType.修改设置, EventType.写入设置
                     If Args.Length = 1 Then Throw New Exception($"EventType {Type} 需要至少 2 个以 | 分割的参数,例如 UiLauncherTransparent|400")
-                    Setup.SetSafe(Args(0), Args(1), Version:=McVersionCurrent)
+                    Setup.SetSafe(Args(0), Args(1), Instance:=McInstanceSelected)
                     If Args.Length = 2 Then Hint($"已写入设置:{Args(0)} → {Args(1)}", HintType.Green)
 
                 Case EventType.修改变量, EventType.写入变量

+ 17 - 17
Plain Craft Launcher 2/Modules/ModMain.vb

@@ -410,12 +410,12 @@ EndHint:
     Public FrmLoginMsSkin As PageLoginMsSkin
 
     '版本设置页面声明
-    Public FrmVersionLeft As PageVersionLeft
-    Public FrmVersionOverall As PageVersionOverall
-    Public FrmVersionMod As PageVersionMod
-    Public FrmVersionModDisabled As PageVersionModDisabled
-    Public FrmVersionSetup As PageVersionSetup
-    Public FrmVersionExport As PageVersionExport
+    Public FrmInstanceLeft As PageInstanceLeft
+    Public FrmInstanceOverall As PageInstanceOverall
+    Public FrmInstanceMod As PageInstanceMod
+    Public FrmInstanceModDisabled As PageInstanceModDisabled
+    Public FrmInstanceSetup As PageInstanceSetup
+    Public FrmInstanceExport As PageInstanceExport
 
     '资源信息分页声明
     Public FrmDownloadCompDetail As PageDownloadCompDetail
@@ -834,20 +834,20 @@ NextFile:
         Text = Text.Replace("{path_temp}", Replacer(PathTemp))
         '时间
         If ReplaceTime Then '在窗口标题中,时间会被后续动态替换,所以此时不应该替换
-            Text = Text.Replace("{date}", Replacer(Date.Now.ToString("yyyy/M/d")))
-            Text = Text.Replace("{time}", Replacer(Date.Now.ToString("HH:mm:ss")))
+            Text = Text.Replace("{date}", Replacer(Date.Now.ToString("yyyy'/'M'/'d")))
+            Text = Text.Replace("{time}", Replacer(Date.Now.ToString("HH':'mm':'ss")))
         End If
         'Minecraft
         Text = Text.Replace("{java}", Replacer(McLaunchJavaSelected?.PathFolder))
-        Text = Text.Replace("{minecraft}", Replacer(PathMcFolder))
-        If McVersionCurrent IsNot Nothing Then
-            Text = Text.Replace("{version_path}", Replacer(McVersionCurrent.Path)) : Text = Text.Replace("{verpath}", Replacer(McVersionCurrent.Path))
-            Text = Text.Replace("{version_indie}", Replacer(McVersionCurrent.PathIndie)) : Text = Text.Replace("{verindie}", Replacer(McVersionCurrent.PathIndie))
-            Text = Text.Replace("{name}", Replacer(McVersionCurrent.Name))
-            If {"unknown", "old", "pending"}.Contains(McVersionCurrent.Version.McName.ToLower) Then
-                Text = Text.Replace("{version}", Replacer(McVersionCurrent.Name))
+        Text = Text.Replace("{minecraft}", Replacer(McFolderSelected))
+        If McInstanceSelected?.IsLoaded Then
+            Text = Text.Replace("{version_path}", Replacer(McInstanceSelected.PathVersion)) : Text = Text.Replace("{verpath}", Replacer(McInstanceSelected.PathVersion))
+            Text = Text.Replace("{version_indie}", Replacer(McInstanceSelected.PathIndie)) : Text = Text.Replace("{verindie}", Replacer(McInstanceSelected.PathIndie))
+            Text = Text.Replace("{name}", Replacer(McInstanceSelected.Name))
+            If {"unknown", "old", "pending"}.Contains(McInstanceSelected.Version.VanillaName.ToLower) Then
+                Text = Text.Replace("{version}", Replacer(McInstanceSelected.Name))
             Else
-                Text = Text.Replace("{version}", Replacer(McVersionCurrent.Version.McName))
+                Text = Text.Replace("{version}", Replacer(McInstanceSelected.Version.VanillaName))
             End If
         Else
             Text = Text.Replace("{version_path}", Replacer(Nothing)) : Text = Text.Replace("{verpath}", Replacer(Nothing))
@@ -877,7 +877,7 @@ NextFile:
         '高级
         Text = Text.RegexReplaceEach("\{hint\}", Function() Replacer(PageOtherTest.GetRandomHint()))
         Text = Text.RegexReplaceEach("\{cave\}", Function() Replacer(PageOtherTest.GetRandomCave()))
-        Text = Text.RegexReplaceEach("\{setup:([a-zA-Z0-9]+)\}", Function(m) Replacer(Setup.GetSafe(m.Groups(1).Value, McVersionCurrent)))
+        Text = Text.RegexReplaceEach("\{setup:([a-zA-Z0-9]+)\}", Function(m) Replacer(Setup.GetSafe(m.Groups(1).Value, McInstanceSelected)))
         Text = Text.RegexReplaceEach("\{varible:([^:\}]+)(?::([^\}]+))?\}", Function(m) Replacer(ReadReg("CustomEvent" & m.Groups(1).Value, m.Groups(2).Value)))
         Text = Text.RegexReplaceEach("\{variable:([^:\}]+)(?::([^\}]+))?\}", Function(m) Replacer(ReadReg("CustomEvent" & m.Groups(1).Value, m.Groups(2).Value)))
         Return Text

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

@@ -63,11 +63,11 @@ Friend Module ModSecret
     End Function
 
     Friend Sub SecretLaunchJvmArgs(ByRef DataList As List(Of String))
-        Dim DataJvmCustom As String = Setup.Get("VersionAdvanceJvm", Version:=McVersionCurrent)
+        Dim DataJvmCustom As String = Setup.Get("VersionAdvanceJvm", Version:=McInstanceSelected)
         DataList.Insert(0, ArgumentReplace(If(DataJvmCustom = "", Setup.Get("LaunchAdvanceJvm"), DataJvmCustom))) '可变 JVM 参数
         McLaunchLog("当前剩余内存:" & Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10 & "G")
-        DataList.Add("-Xmn" & Math.Floor(PageVersionSetup.GetRam(McVersionCurrent) * 1024 * 0.15) & "m")
-        DataList.Add("-Xmx" & Math.Floor(PageVersionSetup.GetRam(McVersionCurrent) * 1024) & "m")
+        DataList.Add("-Xmn" & Math.Floor(PageInstanceSetup.GetRam(McInstanceSelected) * 1024 * 0.15) & "m")
+        DataList.Add("-Xmx" & Math.Floor(PageInstanceSetup.GetRam(McInstanceSelected) * 1024) & "m")
         If Not DataList.Any(Function(d) d.Contains("-Dlog4j2.formatMsgNoLookups=true")) Then DataList.Add("-Dlog4j2.formatMsgNoLookups=true")
     End Sub
 

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

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

+ 10 - 0
Plain Craft Launcher 2/My Project/Resources.Designer.vb

@@ -200,6 +200,16 @@ Namespace My.Resources
             End Get
         End Property
         
+        '''<summary>
+        '''  查找 System.Byte[] 类型的本地化资源。
+        '''</summary>
+        Friend ReadOnly Property System_ValueTuple() As Byte()
+            Get
+                Dim obj As Object = ResourceManager.GetObject("System.ValueTuple", resourceCulture)
+                Return CType(obj,Byte())
+            End Get
+        End Property
+        
         '''<summary>
         '''  查找 System.Byte[] 类型的本地化资源。
         '''</summary>

+ 3 - 0
Plain Craft Launcher 2/My Project/Resources.resx

@@ -160,6 +160,9 @@
   <data name="System.Net.Http.Formatting" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\System.Net.Http.Formatting.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>
+  <data name="System.ValueTuple" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\System.ValueTuple.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
   <data name="Transformer" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\transformer.jar;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </data>

+ 18 - 28
Plain Craft Launcher 2/Pages/PageDownload/Comp/MyCompItem.xaml.vb

@@ -3,16 +3,6 @@
 #Region "基础属性"
     Public Uuid As Integer = GetUuid()
 
-    'Logo
-    Public Property Logo As String
-        Get
-            Return PathLogo.Source
-        End Get
-        Set(value As String)
-            PathLogo.Source = value
-        End Set
-    End Property
-
     '标题
     Public Property Title As String
         Get
@@ -64,17 +54,17 @@
 
     'Tag
     Public WriteOnly Property Tags As List(Of String)
-        Set(value As List(Of String))
+        Set(Tags As List(Of String))
             PanTags.Children.Clear()
-            PanTags.Visibility = If(value.Any(), Visibility.Visible, Visibility.Collapsed)
-            For Each TagText In value
-                Dim NewTag = GetObjectFromXML(
-                "<Border xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
-                         Background=""#11000000"" Padding=""3,1"" CornerRadius=""3"" Margin=""0,0,3,0"" 
-                         SnapsToDevicePixels=""True"" UseLayoutRounding=""False"">
-                   <TextBlock Text=""" & TagText & """ Foreground=""#868686"" FontSize=""11"" />
-                </Border>")
-                PanTags.Children.Add(NewTag)
+            PanTags.Visibility = If(Tags.Any(), Visibility.Visible, Visibility.Collapsed)
+            For Each TagText In Tags
+                Dim BorderTag As New Border With {
+                    .Background = New MyColor("#11000000"), .Padding = New Thickness(3, 1, 3, 1), .CornerRadius = New CornerRadius(3),
+                    .Margin = New Thickness(0, 0, 3, 0), .SnapsToDevicePixels = True, .UseLayoutRounding = False}
+                Dim LabTag As New TextBlock With {
+                    .Text = TagText, .Foreground = New MyColor("#868686"), .FontSize = 11}
+                BorderTag.Child = LabTag
+                PanTags.Children.Add(BorderTag)
             Next
         End Set
     End Property
@@ -208,9 +198,9 @@
             Dim Ani As New List(Of AniData)
             If IsMouseOver Then
                 Ani.AddRange({
-                             AaColor(RectBack, Border.BackgroundProperty, If(IsMouseDown, "ColorBrush6", "ColorBrushBg1"), Time),
-                             AaOpacity(RectBack, 1 - RectBack.Opacity, Time,, New AniEaseOutFluent)
-                         })
+                    AaColor(RectBack, Border.BackgroundProperty, If(IsMouseDown, "ColorBrush6", "ColorBrushBg1"), Time),
+                    AaOpacity(RectBack, 1 - RectBack.Opacity, Time,, New AniEaseOutFluent)
+                })
                 If IsMouseDown Then
                     Ani.Add(AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time * 1.2,, New AniEaseOutFluent))
                 Else
@@ -218,11 +208,11 @@
                 End If
             Else
                 Ani.AddRange({
-                             AaOpacity(RectBack, -RectBack.Opacity, Time),
-                             AaColor(RectBack, Border.BackgroundProperty, If(IsMouseDown, "ColorBrush6", "ColorBrush7"), Time),
-                             AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time,, New AniEaseOutFluent),
-                             AaScaleTransform(RectBack, -0.196, 1,,, True)
-                         })
+                    AaOpacity(RectBack, -RectBack.Opacity, Time),
+                    AaColor(RectBack, Border.BackgroundProperty, If(IsMouseDown, "ColorBrush6", "ColorBrush7"), Time),
+                    AaScaleTransform(RectBack, 0.996 - CType(RectBack.RenderTransform, ScaleTransform).ScaleX, Time,, New AniEaseOutFluent),
+                    AaScaleTransform(RectBack, -0.196, 1,,, True)
+                })
             End If
             AniStart(Ani, "CompItem Color " & Uuid)
         Else

+ 1 - 3
Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml

@@ -34,16 +34,14 @@
                     <TextBlock VerticalAlignment="Center" Grid.Row="2" HorizontalAlignment="Left" Text="版本" Margin="0,0,18,0" />
                     <local:MyComboBox x:Name="TextSearchVersion" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" IsEditable="True" MaxDropDownHeight="320">
                         <local:MyComboBoxItem Content="全部 (也可自行输入)" IsSelected="True" />
-                        <local:MyComboBoxItem Content="1.21.10" />
+                        <local:MyComboBoxItem Content="1.21.11" />
                         <local:MyComboBoxItem Content="1.21.1" />
                         <local:MyComboBoxItem Content="1.20.6" />
                         <local:MyComboBoxItem Content="1.20.1" />
                         <local:MyComboBoxItem Content="1.19.4" />
-                        <local:MyComboBoxItem Content="1.19.2" />
                         <local:MyComboBoxItem Content="1.18.2" />
                         <local:MyComboBoxItem Content="1.16.5" />
                         <local:MyComboBoxItem Content="1.12.2" />
-                        <local:MyComboBoxItem Content="1.10.2" />
                         <local:MyComboBoxItem Content="1.8.9" />
                         <local:MyComboBoxItem Content="1.7.10" />
                     </local:MyComboBox>

+ 25 - 18
Plain Craft Launcher 2/Pages/PageDownload/Comp/PageComp.xaml.vb

@@ -67,7 +67,7 @@ Public Class PageComp
     ''' <summary>
     ''' 在切换到页面时,应自动将筛选项设置为与该目标 MC 版本和加载器相同。
     ''' </summary>
-    Public Shared TargetVersion As McVersion = Nothing
+    Public Shared TargetInstance As McInstance = Nothing
     ''' <summary>
     ''' 在切换到该页面时自动设置的搜索框内的内容。
     ''' </summary>
@@ -76,13 +76,13 @@ Public Class PageComp
     '在点击 MyCompItem 时会获取 Loader 的输入,以使资源详情页面可以应用相同的筛选项
     Public Loader As New LoaderTask(Of CompProjectRequest, Integer)("社区资源获取:XXX", AddressOf CompProjectsGet, AddressOf LoaderInput) With {.ReloadTimeout = 60 * 1000}
 
-    Private IsLoaderInited As Boolean = False
     Private Sub PageCompControls_Inited(sender As Object, e As EventArgs) Handles Me.Loaded
+        Static IsFirstLoaded As Boolean = False
         '不知道从 Initialized 改成 Loaded 会不会有问题,但用 Initialized 会导致初始的筛选器修改被覆盖回默认值
-        If TargetVersion IsNot Nothing Then
+        If TargetInstance IsNot Nothing Then
             '设置目标
             ResetFilter() '重置筛选器
-            TextSearchVersion.Text = TargetVersion.Version.McName
+            TextSearchVersion.Text = TargetInstance.Version.VanillaName
             Dim GetTargetItemByName =
             Function(Name As String) As MyComboBoxItem
                 For Each Item As MyComboBoxItem In ComboSearchLoader.Items
@@ -90,32 +90,38 @@ Public Class PageComp
                 Next
                 Return ComboSearchLoader.Items(0)
             End Function
-            If TargetVersion.Version.HasForge Then
+            If TargetInstance.Version.HasForge Then
                 ComboSearchLoader.SelectedItem = GetTargetItemByName("Forge")
-            ElseIf TargetVersion.Version.HasFabric Then
+            ElseIf TargetInstance.Version.HasFabric Then
                 ComboSearchLoader.SelectedItem = GetTargetItemByName("Fabric")
-            ElseIf TargetVersion.Version.HasNeoForge Then
+            ElseIf TargetInstance.Version.HasNeoForge Then
                 ComboSearchLoader.SelectedItem = GetTargetItemByName("NeoForge")
             End If
-            TargetVersion = Nothing
+            TargetInstance = Nothing
             If TargetName IsNot Nothing Then
                 TextSearchName.Text = TargetName
                 TargetName = Nothing
             End If
             '如果已经完成请求,则重新开始
-            If IsLoaderInited Then StartNewSearch()
+            If IsFirstLoaded Then StartNewSearch()
             ScrollToHome()
         End If
         '加载器初始化
-        If IsLoaderInited Then Return
-        IsLoaderInited = True
+        If IsFirstLoaded Then Return
+        IsFirstLoaded = True
         CType(Parent, MyPageRight).PageLoaderInit(Load, PanLoad, PanContent, PanAlways, Loader, AddressOf Load_OnFinish, AddressOf LoaderInput)
-        If McVersionHighest = -1 Then McVersionHighest = Math.Max(McVersionHighest, Integer.Parse(CType(TextSearchVersion.Items(1), MyComboBoxItem).Content.ToString.Split(".")(1)))
+        '将最高 Drop 加入筛选
+        If AllDrops?.Any AndAlso AllDrops.First > 250 Then
+            Dim HighestVersion As String = McVersion.DropToVersion(AllDrops.First)
+            If CType(TextSearchVersion.Items(1), MyComboBoxItem).Content.ToString <> HighestVersion Then '0 是全部
+                TextSearchVersion.Items.Insert(1, New MyComboBoxItem With {.Content = HighestVersion})
+            End If
+        End If
     End Sub
     Private Function LoaderInput() As CompProjectRequest
-        Dim Request As New CompProjectRequest(PageType, Storage, (Page + 1) * PageSize)
+        Dim Request As New CompProjectRequest(PageType, Storage, (Page + 1) * PAGE_SIZE)
         Dim GameVersion As String = If(TextSearchVersion.Text = "全部 (也可自行输入)", Nothing,
-                If(TextSearchVersion.Text.Contains(".") OrElse TextSearchVersion.Text.Contains("w"), TextSearchVersion.Text, Nothing))
+            If(TextSearchVersion.Text.Contains(".") OrElse TextSearchVersion.Text.Contains("w"), TextSearchVersion.Text, Nothing))
         With Request
             .SearchText = TextSearchName.Text
             .GameVersion = GameVersion
@@ -132,7 +138,7 @@ Public Class PageComp
     ''' <summary>
     ''' 每页展示的结果数量。
     ''' </summary>
-    Public Const PageSize = 40
+    Public Const PAGE_SIZE = 40
     Public Page As Integer = 0
 
     '结果 UI 化
@@ -141,8 +147,9 @@ Public Class PageComp
             Log($"[Comp] 开始可视化{TypeNameSpaced}列表,已储藏 {Storage.Results.Count} 个结果,当前在第 {Page + 1} 页")
             '列表项
             PanProjects.Children.Clear()
-            For i = Math.Min(Page * PageSize, Storage.Results.Count - 1) To Math.Min((Page + 1) * PageSize - 1, Storage.Results.Count - 1)
-                PanProjects.Children.Add(Storage.Results(i).ToCompItem(
+            Dim Index As Integer = Math.Min(Page * PAGE_SIZE, Storage.Results.Count - 1)
+            For Each Result In Storage.Results.GetRange(Index, Math.Min(Storage.Results.Count - Index, PAGE_SIZE))
+                PanProjects.Children.Add(Result.ToCompItem(
                     ShowMcVersionDesc:=Loader.Input.GameVersion Is Nothing,
                     ShowLoaderDesc:=Loader.Input.ModLoader = CompModLoaderType.Any AndAlso (PageType = CompType.Mod OrElse PageType = CompType.ModPack)))
             Next
@@ -156,7 +163,7 @@ Public Class PageComp
             BtnPageLeft.IsEnabled = Page > 0
             BtnPageLeft.Opacity = If(Page > 0, 1, 0.2)
             Dim IsRightEnabled As Boolean = '由于 WPF 的未知 bug,读取到的 IsEnabled 可能是错误的值(#3319)
-                Storage.Results.Count > PageSize * (Page + 1) OrElse
+                Storage.Results.Count > PAGE_SIZE * (Page + 1) OrElse
                 Storage.CurseForgeOffset < Storage.CurseForgeTotal OrElse Storage.ModrinthOffset < Storage.ModrinthTotal
             BtnPageRight.IsEnabled = IsRightEnabled
             BtnPageRight.Opacity = If(IsRightEnabled, 1, 0.2)

+ 80 - 67
Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadCompDetail.xaml.vb

@@ -19,12 +19,12 @@
     End Sub
     Public Sub LoadTargetFromAdditional() Handles Me.Loaded
         Project = FrmMain.PageCurrent.Additional(0)
-        TargetVersion = FrmMain.PageCurrent.Additional(2)
+        TargetInstance = FrmMain.PageCurrent.Additional(2)
         TargetLoader = FrmMain.PageCurrent.Additional(3)
         PageType = FrmMain.PageCurrent.Additional(4)
     End Sub
     Private Project As CompProject
-    Private TargetVersion As String, TargetLoader As CompModLoaderType
+    Private TargetInstance As String, TargetLoader As CompModLoaderType
     ''' <summary>
     ''' 当前页面应展示的内容类别。可能为 Any。
     ''' </summary>
@@ -52,16 +52,16 @@
             If x = Topmost Then Return -1
             If y = Topmost Then Return 1
             '特殊版本
-            Dim IsXSpecial As Boolean = x.EndsWithF("版本")
-            Dim IsYSpecial As Boolean = y.EndsWithF("版本")
+            Dim IsXSpecial As Boolean = Not x.Contains(".")
+            Dim IsYSpecial As Boolean = Not y.Contains(".")
             If IsXSpecial AndAlso IsYSpecial Then Return x.CompareTo(y)
             If IsXSpecial Then Return 1
             If IsYSpecial Then Return -1
             '比较版本号
-            Dim VersionCodeSort = -VersionSortInteger(x.Replace(x.BeforeFirst(" ") & " ", ""), y.Replace(y.BeforeFirst(" ") & " ", ""))
+            Dim VersionCodeSort = -CompareVersion(x.Replace(x.BeforeFirst(" ") & " ", ""), y.Replace(y.BeforeFirst(" ") & " ", ""))
             If VersionCodeSort <> 0 Then Return VersionCodeSort
             '比较全部
-            Return -VersionSortInteger(x, y)
+            Return -CompareVersion(x, y)
         End Function
         Public Sub New(Optional Topmost As String = "")
             Me.Topmost = If(Topmost, "")
@@ -69,7 +69,8 @@
     End Class
 
     Private VersionFilter As String
-    Private IsMajorVersionFilter As Boolean '是否按大版本号筛选(1.21 / 1.20 / 1.19 / ...)而非小版本号(1.21.1 / 1.21 / 1.20.4 / ...)
+    Private GroupedDrop As Boolean '是否按 Drop 筛选(1.21 / 1.20 / 1.19 / ...)而非小版本号(1.21.1 / 1.21 / 1.20.4 / ...)
+    Private GroupedOld As Boolean '是否折叠远古版本为一个选项
     '筛选类型相同的结果(Modrinth 会返回 Mod、服务端插件、数据包混合的列表)
     Private Function GetResults() As List(Of CompFile)
         Dim Results As List(Of CompFile) = CompFileLoader.Output
@@ -87,32 +88,40 @@
         Dim Results = GetResults()
 
         '初始化筛选器
-        Dim VersionFilters As List(Of String)
-
-        '按小版本号筛选?
-        IsMajorVersionFilter = False
-        VersionFilters = Results.SelectMany(Function(v) v.GameVersions).Select(Function(v) GetGroupedVersionName(v, IsMajorVersionFilter, True)).
-            Distinct.OrderByDescending(Function(s) s, New VersionComparer).ToList
-        '按大版本号筛选?
-        If VersionFilters.Count >= 9 Then
-            IsMajorVersionFilter = True
-            VersionFilters = Results.SelectMany(Function(v) v.GameVersions).Select(Function(v) GetGroupedVersionName(v, IsMajorVersionFilter, True)).
+        Dim Filters As List(Of String) = Nothing
+        Dim UpdateFilters =
+        Sub()
+            Filters = Results.SelectMany(Function(v) v.GameVersions).Select(Function(v) GetGroupedVersionName(v, GroupedDrop, GroupedOld)).
                 Distinct.OrderByDescending(Function(s) s, New VersionComparer).ToList
-        End If
+        End Sub
+
+        '确定分组方式
+        GroupedDrop = False : GroupedOld = False
+        UpdateFilters()
+        If Filters.Count < 9 Then GoTo GroupDone
+        GroupedDrop = True : GroupedOld = False
+        UpdateFilters()
+        If Filters.Count < 9 Then GoTo GroupDone
+        GroupedDrop = False : GroupedOld = True
+        UpdateFilters()
+        If Filters.Count < 9 Then GoTo GroupDone
+        GroupedDrop = True : GroupedOld = True
+        UpdateFilters()
+GroupDone:
 
         'UI 化筛选器
         PanFilter.Children.Clear()
-        If VersionFilters.Count < 2 Then
+        If Filters.Count < 2 Then
             CardFilter.Visibility = Visibility.Collapsed
             VersionFilter = Nothing
         Else
             CardFilter.Visibility = Visibility.Visible
-            VersionFilters.Insert(0, "全部")
+            Filters.Insert(0, "全部")
             '转化为按钮
-            For Each Version As String In VersionFilters
+            For Each Version As String In Filters
                 Dim NewButton As New MyRadioButton With {
                     .Text = Version, .Margin = New Thickness(2, 0, 2, 0), .ColorType = MyRadioButton.ColorState.Highlight}
-                NewButton.LabText.Margin = New Thickness(-2, 0, 8, 0)
+                NewButton.LabText.Margin = New Thickness(-2, 0, 10, 0)
                 AddHandler NewButton.Check,
                 Sub(sender As MyRadioButton, raiseByMouse As Boolean)
                     VersionFilter = If(sender.Text = "全部", Nothing, sender.Text)
@@ -122,10 +131,10 @@
             Next
             '自动选择
             Dim ToCheck As MyRadioButton = Nothing
-            If TargetVersion <> "" Then
-                Dim TargetFile = Results.FirstOrDefault(Function(v) v.GameVersions.Contains(TargetVersion))
+            If TargetInstance <> "" Then
+                Dim TargetFile = Results.FirstOrDefault(Function(v) v.GameVersions.Contains(TargetInstance))
                 If TargetFile IsNot Nothing Then
-                    Dim TargetGroup = GetGroupedVersionName(TargetVersion, IsMajorVersionFilter, True)
+                    Dim TargetGroup = GetGroupedVersionName(TargetInstance, GroupedDrop, GroupedOld)
                     For Each Button As MyRadioButton In PanFilter.Children
                         If Button.Text <> TargetGroup Then Continue For
                         ToCheck = Button
@@ -143,24 +152,24 @@
     Private Sub UpdateFilterResult()
         Dim Results = GetResults()
 
-        Dim TargetCardName As String = If(TargetVersion <> "" OrElse TargetLoader <> CompModLoaderType.Any,
-            $"所选版本:{If(TargetLoader <> CompModLoaderType.Any, TargetLoader.ToString & " ", "")}{TargetVersion}", "")
+        Dim TargetCardName As String = If(TargetInstance <> "" OrElse TargetLoader <> CompModLoaderType.Any,
+            $"{If(TargetLoader <> CompModLoaderType.Any, TargetLoader.ToString & " ", "")}{TargetInstance}(所选版本)", "")
         '归类到卡片下
         Dim Dict As New SortedDictionary(Of String, List(Of CompFile))(New CardSorter(TargetCardName))
-        Dict.Add("其他版本", New List(Of CompFile))
+        Dict.Add("其他", New List(Of CompFile))
         Dim SupportedLoaders As New List(Of Integer)([Enum].GetValues(GetType(CompModLoaderType)))
         For Each Version As CompFile In Results
             For Each GameVersion In Version.GameVersions
                 '检查是否符合版本筛选器
                 If VersionFilter IsNot Nothing AndAlso
-                    GetGroupedVersionName(GameVersion, IsMajorVersionFilter, True) <> VersionFilter Then Continue For
+                    GetGroupedVersionName(GameVersion, GroupedDrop, GroupedOld) <> VersionFilter Then Continue For
                 '决定添加到哪个卡片
                 Dim VerName As String = GetGroupedVersionName(GameVersion, False, False)
                 '遍历加入的加载器列表
                 Dim Loaders As New List(Of String)
                 If Project.ModLoaders.Count > 1 AndAlso '工程至少有两个加载器
                     Version.Type = CompType.Mod AndAlso '是 Mod
-                    VerName.StartsWith("1.") Then '不是 “快照版本” 之类的
+                    McVersion.IsFormatFit(VerName) Then '不是 “快照版本” 之类的
                     For Each Loader In Version.ModLoaders
                         If Loader = CompModLoaderType.Quilt AndAlso Setup.Get("ToolDownloadIgnoreQuilt") Then Continue For
                         If SupportedLoaders.Contains(Loader) Then Loaders.Add(Loader.ToString & " ")
@@ -176,14 +185,14 @@
             Next
         Next
         '添加筛选的版本的卡片
-        If TargetCardName <> "" AndAlso (VersionFilter Is Nothing OrElse GetGroupedVersionName(TargetVersion, IsMajorVersionFilter, True).StartsWithF(VersionFilter)) Then
+        If TargetCardName <> "" AndAlso (VersionFilter Is Nothing OrElse GetGroupedVersionName(TargetInstance, GroupedDrop, GroupedOld).StartsWithF(VersionFilter)) Then
             Dict.Add(TargetCardName, New List(Of CompFile))
             For Each Version As CompFile In Results
-                If Version.GameVersions.Contains(TargetVersion) AndAlso
+                If Version.GameVersions.Contains(TargetInstance) AndAlso
                    (TargetLoader = CompModLoaderType.Any OrElse Version.ModLoaders.Contains(TargetLoader)) Then
                     '检查是否符合版本筛选器
                     If VersionFilter IsNot Nothing AndAlso
-                        Not Version.GameVersions.Any(Function(v) GetGroupedVersionName(v, IsMajorVersionFilter, True) = VersionFilter) Then Continue For
+                        Not Version.GameVersions.Any(Function(v) GetGroupedVersionName(v, GroupedDrop, GroupedOld) = VersionFilter) Then Continue For
                     If Not Dict(TargetCardName).Contains(Version) Then Dict(TargetCardName).Add(Version)
                 End If
             Next
@@ -193,6 +202,7 @@
             PanResults.Children.Clear()
             For Each Pair As KeyValuePair(Of String, List(Of CompFile)) In Dict
                 If Not Pair.Value.Any() Then Continue For
+                If Pair.Key = TargetCardName.Replace("(所选版本)", "") Then Continue For
                 '增加卡片
                 Dim NewCard As New MyCard With {.Title = Pair.Key, .Margin = New Thickness(0, 0, 0, 15), .SwapType = If(PageType = CompType.ModPack, 9, 8)} '9 是安装,8 是另存为
                 Dim NewStack As New StackPanel With {.Margin = New Thickness(20, MyCard.SwapedHeight, 18, 0), .VerticalAlignment = VerticalAlignment.Top, .RenderTransform = New TranslateTransform(0, 0), .Tag = Pair.Value}
@@ -208,7 +218,7 @@
                     NewCard.IsSwapped = True
                 End If
                 '增加提示
-                If Pair.Key = "其他版本" Then
+                If Pair.Key = "其他" Then
                     NewStack.Children.Add(New MyHint With {.Text = "由于版本信息更新缓慢,可能无法识别刚更新的 MC 版本。几天后即可正常识别。", .Theme = MyHint.Themes.Yellow, .Margin = New Thickness(5, 0, 0, 8)})
                 End If
             Next
@@ -220,15 +230,17 @@
             Log(ex, "可视化工程下载列表出错", LogLevel.Feedback)
         End Try
     End Sub
-    Private Function GetGroupedVersionName(Name As String, MajorOnly As Boolean, FoldOldRelease As Boolean) As String
+    Private Function GetGroupedVersionName(Name As String, GroupedByDrop As Boolean, FoldOld As Boolean) As String
         If Name Is Nothing Then
-            Return "其他版本"
+            Return "其他"
         ElseIf Name.Contains("w") Then
-            Return "快照版本"
-        ElseIf Name.StartsWith("1.0") OrElse Not Name.StartsWith("1.") OrElse (FoldOldRelease AndAlso Val(Name.Split(".")(1)) < 10) Then
-            Return "远古版本"
+            Return "快照版"
+        ElseIf Not McVersion.IsFormatFit(Name) OrElse (FoldOld AndAlso McVersion.VersionToDrop(Name, True) < 120) Then
+            Return "远古版"
+        ElseIf GroupedByDrop Then
+            Return McVersion.DropToVersion(McVersion.VersionToDrop(Name, True))
         Else
-            Return If(MajorOnly, "1." & Name.Split(".")(1).BeforeFirst(" "), Name)
+            Return Name
         End If
     End Function
 
@@ -250,7 +262,7 @@
 
         '放置当前工程
         If CompItem IsNot Nothing Then PanIntro.Children.Remove(CompItem)
-        CompItem = Project.ToCompItem(True, True)
+        CompItem = Project.ToCompItem(True, True).Init()
         CompItem.CanInteraction = False
         CompItem.Margin = New Thickness(-7, -7, 0, 8)
         PanIntro.Children.Insert(0, CompItem)
@@ -272,18 +284,18 @@
 
             '获取版本名
             Dim PackName As String = Project.TranslatedName.Replace(".zip", "").Replace(".rar", "").Replace(".mrpack", "").Replace("\", "\").Replace("/", "/").Replace("|", "|").Replace(":", ":").Replace("<", "<").Replace(">", ">").Replace("*", "*").Replace("?", "?").Replace("""", "").Replace(": ", ":")
-            Dim Validate As New ValidateFolderName(PathMcFolder & "versions")
+            Dim Validate As New ValidateFolderName(McFolderSelected & "versions")
             If Validate.Validate(PackName) <> "" Then PackName = ""
-            Dim VersionName As String = MyMsgBoxInput("输入版本名称", "", PackName, New ObjectModel.Collection(Of Validate) From {Validate})
-            If String.IsNullOrEmpty(VersionName) Then Return
+            Dim InstanceName As String = MyMsgBoxInput("输入版本名称", "", PackName, New ObjectModel.Collection(Of Validate) From {Validate})
+            If String.IsNullOrEmpty(InstanceName) Then Return
 
             '构造步骤加载器
             Dim Loaders As New List(Of LoaderBase)
-            Dim Target As String = $"{PathMcFolder}versions\{VersionName}\原始整合包.{If(Project.FromCurseForge, "zip", "mrpack")}"
-            Dim LogoFileAddress As String = MyImage.GetTempPath(CompItem.Logo)
+            Dim Target As String = $"{McFolderSelected}versions\{InstanceName}\原始整合包.{If(Project.FromCurseForge, "zip", "mrpack")}"
+            Dim LogoFileAddress As String = CompItem.PathLogo.ActualSource
             Loaders.Add(New LoaderDownload("下载整合包文件", New List(Of NetFile) From {File.ToNetFile(Target)}) With {.ProgressWeight = 10, .Block = True})
             Loaders.Add(New LoaderTask(Of Integer, Integer)("准备安装整合包",
-            Sub() ModpackInstall(Target, VersionName, If(IO.File.Exists(LogoFileAddress), LogoFileAddress, Nothing))) With {.ProgressWeight = 0.1})
+            Sub() ModpackInstall(Target, InstanceName, If(IO.File.Exists(LogoFileAddress), LogoFileAddress, Nothing))) With {.ProgressWeight = 0.1})
 
             '启动
             Dim Loader As New LoaderCombo(Of String)(LoaderName, Loaders) With {.OnStateChanged =
@@ -298,7 +310,7 @@
                 End Select
                 McInstallFailedClearFolder(MyLoader)
             End Sub}
-            Loader.Start(PathMcFolder & "versions\" & VersionName & "\")
+            Loader.Start(McFolderSelected & "versions\" & InstanceName & "\")
             LoaderTaskbarAdd(Loader)
             FrmMain.BtnExtraDownload.ShowRefresh()
             FrmMain.BtnExtraDownload.Ribble()
@@ -332,7 +344,7 @@
                         Case CompType.Shader : SubFolder = "shaderpacks\"
                         Case CompType.DataPack : SubFolder = "" '导航到版本根目录
                     End Select
-                    Dim IsVersionSuitable As Func(Of McVersion, Boolean) = Nothing
+                    Dim IsInstanceSuitable As Func(Of McInstance, Boolean) = Nothing
                     '获取资源所需的加载器
                     Dim AllowedLoaders As New List(Of CompModLoaderType)
                     If File.ModLoaders.Any Then
@@ -342,51 +354,51 @@
                     End If
                     Log($"[Comp] {Desc}要求的加载器种类:" & If(AllowedLoaders.Any(), AllowedLoaders.Join(" / "), "无要求"))
                     '判断某个版本是否符合资源要求
-                    IsVersionSuitable =
-                    Function(Version)
-                        If Not Version.IsLoaded Then Version.Load()
+                    IsInstanceSuitable =
+                    Function(Instance As McInstance)
+                        If Not Instance.IsLoaded Then Instance.Load()
                         '只对 Mod 和数据包进行版本检测
                         If File.Type = CompType.Mod OrElse File.Type = CompType.DataPack Then
                             If File.GameVersions.Any(Function(v) v.Contains(".")) AndAlso
-                               Not File.GameVersions.Any(Function(v) v.Contains(".") AndAlso v = Version.Version.McName) Then Return False
+                               Not File.GameVersions.Any(Function(v) v.Contains(".") AndAlso v = Instance.Version.VanillaName) Then Return False
                         End If
                         '加载器
                         If Not AllowedLoaders.Any() Then Return True '无要求
-                        If AllowedLoaders.Contains(CompModLoaderType.Forge) AndAlso Version.Version.HasForge Then Return True
-                        If AllowedLoaders.Contains(CompModLoaderType.Fabric) AndAlso Version.Version.HasFabric Then Return True
-                        If AllowedLoaders.Contains(CompModLoaderType.NeoForge) AndAlso Version.Version.HasNeoForge Then Return True
-                        If AllowedLoaders.Contains(CompModLoaderType.LiteLoader) AndAlso Version.Version.HasLiteLoader Then Return True
+                        If AllowedLoaders.Contains(CompModLoaderType.Forge) AndAlso Instance.Version.HasForge Then Return True
+                        If AllowedLoaders.Contains(CompModLoaderType.Fabric) AndAlso Instance.Version.HasFabric Then Return True
+                        If AllowedLoaders.Contains(CompModLoaderType.NeoForge) AndAlso Instance.Version.HasNeoForge Then Return True
+                        If AllowedLoaders.Contains(CompModLoaderType.LiteLoader) AndAlso Instance.Version.HasLiteLoader Then Return True
                         Return False
                     End Function
                     '获取常规资源默认下载位置
                     If CachedFolder.ContainsKey(File.Type) Then
                         DefaultFolder = CachedFolder(File.Type)
                         Log($"[Comp] 使用上次下载时的文件夹作为默认下载位置:{DefaultFolder}")
-                    ElseIf McVersionCurrent IsNot Nothing AndAlso IsVersionSuitable(McVersionCurrent) Then
-                        DefaultFolder = $"{McVersionCurrent.PathIndie}{SubFolder}"
+                    ElseIf McInstanceSelected IsNot Nothing AndAlso IsInstanceSuitable(McInstanceSelected) Then
+                        DefaultFolder = $"{McInstanceSelected.PathIndie}{SubFolder}"
                         Directory.CreateDirectory(DefaultFolder)
                         Log($"[Comp] 使用当前版本作为默认下载位置:{DefaultFolder}")
                     Else
                         '查找所有可能的版本
-                        Dim NeedLoad As Boolean = McVersionListLoader.State <> LoadState.Finished
+                        Dim NeedLoad As Boolean = McInstanceListLoader.State <> LoadState.Finished
                         If NeedLoad Then
                             Hint("正在查找适合的游戏版本……")
-                            LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True)
+                            LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True)
                         End If
-                        Dim SuitableVersions = McVersionList.Values.SelectMany(Function(l) l).Where(Function(v) IsVersionSuitable(v)).
+                        Dim SuitableInstanceList = McInstanceList.Values.SelectMany(Function(l) l).Where(Function(v) IsInstanceSuitable(v)).
                             Select(Function(v) New DirectoryInfo($"{v.PathIndie}{SubFolder}"))
-                        If SuitableVersions.Any Then
-                            Dim SelectedVersion = SuitableVersions.
+                        If SuitableInstanceList.Any Then
+                            Dim SelectedInstance = SuitableInstanceList.
                                 OrderByDescending(Function(Dir) If(Dir.Exists, Dir.LastWriteTimeUtc, Date.MinValue)). '先按文件夹更改时间降序
                                 ThenByDescending(Function(Dir) If(Dir.Exists, Dir.GetFiles().Length, -1)). '再按文件夹中的文件数量降序
                                 First()
-                            DefaultFolder = SelectedVersion.FullName
+                            DefaultFolder = SelectedInstance.FullName
                             Directory.CreateDirectory(DefaultFolder)
                             Log($"[Comp] 使用适合的游戏版本作为默认下载位置:{DefaultFolder}")
                         Else
-                            DefaultFolder = PathMcFolder
+                            DefaultFolder = McFolderSelected
                             If NeedLoad Then
-                                Hint("当前 MC 文件夹中没有找到适合此资源的版本!")
+                                Hint($"当前 MC 文件夹中没有找到合适的版本!")
                             Else
                                 Log("[Comp] 由于当前版本不兼容,使用当前的 MC 文件夹作为默认下载位置")
                             End If
@@ -413,6 +425,7 @@
                             FileName = File.FileName
                     End Select
                 End If
+                If File.Type = CompType.Mod Then FileName = FileName.Replace("~", "-") '~ 会导致 Mixin 加载失败
                 RunInUi(
                 Sub()
                     '弹窗要求选择保存位置

+ 2 - 1
Plain Craft Launcher 2/Pages/PageDownload/Comp/PageDownloadMod.xaml

@@ -27,7 +27,8 @@
         <local:MyComboBoxItem Content="生物" Tag="411/mobs" />
         <local:MyComboBoxItem Content="实用" Tag="5191/utility" />
         <local:MyComboBoxItem Content="装备与工具" Tag="434/equipment" />
-        <local:MyComboBoxItem Content="性能优化" Tag="/optimization" />
+        <local:MyComboBoxItem Content="创造模式" Tag="9026/" />
+        <local:MyComboBoxItem Content="性能优化" Tag="6814/optimization" />
         <local:MyComboBoxItem Content="信息显示" Tag="423/" />
         <local:MyComboBoxItem Content="服务器" Tag="435/social" />
         <local:MyComboBoxItem Content="支持库" Tag="421/library" />

Dosya farkı çok büyük olduğundan ihmal edildi
+ 267 - 260
Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb


Dosya farkı çok büyük olduğundan ihmal edildi
+ 200 - 331
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadInstall.xaml.vb


+ 1 - 1
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml.vb

@@ -11,7 +11,7 @@
     ''' <summary>
     ''' 勾选事件改变页面。
     ''' </summary>
-    Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemInstall.Check, ItemMod.Check, ItemPack.Check, ItemResourcePack.Check, ItemShader.Check, ItemDataPack.Check
+    Private Sub PageCheck(sender As FrameworkElement, e As RouteEventArgs) Handles ItemInstall.Check, ItemMod.Check, ItemPack.Check, ItemResourcePack.Check, ItemShader.Check, ItemDataPack.Check
         '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0
         '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False)
         If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag))

+ 0 - 0
Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml → Plain Craft Launcher 2/Pages/PageInstance/MyLocalModItem.xaml


+ 108 - 110
Plain Craft Launcher 2/Pages/PageVersion/MyLocalModItem.xaml.vb → Plain Craft Launcher 2/Pages/PageInstance/MyLocalModItem.xaml.vb

@@ -5,16 +5,6 @@ Public Class MyLocalModItem
 #Region "基础属性"
     Public Uuid As Integer = GetUuid()
 
-    'Logo
-    Public Property Logo As String
-        Get
-            Return PathLogo.Source
-        End Get
-        Set(value As String)
-            PathLogo.Source = value
-        End Set
-    End Property
-
     '标题
     Private _Title As String
     Public Property Title As String
@@ -28,9 +18,6 @@ Public Class MyLocalModItem
                     LabTitle.TextDecorations = Nothing
                 Case McMod.McModState.Disabled
                     LabTitle.TextDecorations = TextDecorations.Strikethrough
-                Case McMod.McModState.Unavailable
-                    LabTitle.TextDecorations = TextDecorations.Strikethrough
-                    value &= " [错误]"
             End Select
             If LabTitle.Text = value Then Return
             LabTitle.Text = value
@@ -63,17 +50,17 @@ Public Class MyLocalModItem
 
     'Tag
     Public WriteOnly Property Tags As List(Of String)
-        Set(value As List(Of String))
+        Set(Tags As List(Of String))
             PanTags.Children.Clear()
-            PanTags.Visibility = If(value.Any(), Visibility.Visible, Visibility.Collapsed)
-            For Each TagText In value
-                Dim NewTag = GetObjectFromXML(
-                "<Border xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
-                         Background=""#0C000000"" Padding=""3,1"" CornerRadius=""3"" Margin=""0,0,3,0"" 
-                         SnapsToDevicePixels=""True"" UseLayoutRounding=""False"">
-                   <TextBlock Text=""" & TagText & """ Foreground=""#88000000"" FontSize=""11"" />
-                </Border>")
-                PanTags.Children.Add(NewTag)
+            PanTags.Visibility = If(Tags.Any(), Visibility.Visible, Visibility.Collapsed)
+            For Each TagText In Tags
+                Dim BorderTag As New Border With {
+                    .Background = New MyColor("#0A000000"), .Padding = New Thickness(3, 1, 3, 1), .CornerRadius = New CornerRadius(3),
+                    .Margin = New Thickness(0, 0, 3, 0), .SnapsToDevicePixels = True, .UseLayoutRounding = False}
+                Dim LabTag As New TextBlock With {
+                    .Text = TagText, .Foreground = New MyColor("#B0B0B0"), .FontSize = 11}
+                BorderTag.Child = LabTag
+                PanTags.Children.Add(BorderTag)
             Next
         End Set
     End Property
@@ -123,7 +110,7 @@ Public Class MyLocalModItem
         End Get
         Set(value As Boolean)
             _Swiping = value
-            FrmVersionMod.CardSelect.IsHitTestVisible = Not value
+            FrmInstanceMod.CardSelect.IsHitTestVisible = Not value
         End Set
     End Property
     Private Shared SwipToState As Boolean '被滑动到的目标应将 Checked 改为此值
@@ -313,11 +300,11 @@ Public Class MyLocalModItem
 #End Region
 
     Private Function GetUpdateCompareDescription() As String
-        Dim CurrentName = Entry.CompFile.FileName.Replace(".jar", "")
-        Dim NewestName = Entry.UpdateFile.FileName.Replace(".jar", "")
+        Dim CurrentName = If(Entry.CompFile.Version, Entry.CompFile.DisplayName).Replace(".jar", "")
+        Dim NewestName = If(Entry.UpdateFile.Version, Entry.UpdateFile.DisplayName).Replace(".jar", "")
         '简化名称对比
-        Dim CurrentSegs = CurrentName.Split("-"c).ToList()
-        Dim NewestSegs = NewestName.Split("-"c).ToList()
+        Dim CurrentSegs = CurrentName.Split("-_+ ".ToCharArray).ToList()
+        Dim NewestSegs = NewestName.Split("-_+ ".ToCharArray).ToList()
         Dim Shortened As Boolean = False
         For Each Seg In CurrentSegs.ToList()
             If Not NewestSegs.Contains(Seg) Then Continue For
@@ -332,92 +319,103 @@ Public Class MyLocalModItem
         End If
         Return $"当前版本:{CurrentName}({GetTimeSpanString(Entry.CompFile.ReleaseDate - Date.Now, False)}){vbCrLf}最新版本:{NewestName}({GetTimeSpanString(Entry.UpdateFile.ReleaseDate - Date.Now, False)})"
     End Function
-    Public Sub Refresh() Handles Me.Loaded
-        RunInUi(
-        Sub()
-            '更新
-            If Entry.CanUpdate Then
-                BtnUpdate.Visibility = Visibility.Visible
-                BtnUpdate.ToolTip = $"{GetUpdateCompareDescription()}{vbCrLf}点击以更新,右键查看更新日志。"
-            Else
-                BtnUpdate.Visibility = Visibility.Collapsed
-            End If
-            '标题与描述
-            Dim DescFileName As String
-            If Entry.State = McMod.McModState.Fine OrElse Entry.State = McMod.McModState.Disabled Then
-                DescFileName = IO.Path.GetFileNameWithoutExtension(Entry.Path)
+
+    '懒加载
+    Public Sub New()
+        InitializeComponent()
+        OnFirstEnterScrollViewerViewport(AddressOf FirstEnterScrollViewerViewport)
+    End Sub
+    Private HasEnteredViewport As Boolean = False
+    Private Sub FirstEnterScrollViewerViewport()
+        HasEnteredViewport = True
+        Refresh()
+    End Sub
+    Public Sub Refresh()
+        If Not HasEnteredViewport Then Return '避免在未显示时因为 Comp 更新而加载内容
+        '更新
+        If Entry.CanUpdate Then
+            BtnUpdate.Visibility = Visibility.Visible
+            BtnUpdate.ToolTip = $"{GetUpdateCompareDescription()}{vbCrLf}点击以更新,右键查看更新日志。"
+        Else
+            BtnUpdate.Visibility = Visibility.Collapsed
+        End If
+        '标题与描述
+        Dim DescFileName As String
+        If Entry.State = McMod.McModState.Fine OrElse Entry.State = McMod.McModState.Disabled Then
+            DescFileName = IO.Path.GetFileNameWithoutExtension(Entry.Path)
+        Else
+            DescFileName = GetFileNameFromPath(Entry.Path)
+        End If
+        Dim NewDescription As String
+        If Setup.Get("ToolModLocalNameStyle") = 1 Then
+            '标题显示文件名,详情显示译名
+            '标题
+            Title = DescFileName
+            SubTitle = ""
+            '描述
+            If Entry.Comp Is Nothing Then
+                NewDescription = Entry.DisplayName
             Else
-                DescFileName = GetFileNameFromPath(Entry.Path)
+                Dim Titles = Entry.Comp.GetControlTitle(False)
+                NewDescription = Titles.Key & Titles.Value
             End If
-            Dim NewDescription As String
-            If Setup.Get("ToolModLocalNameStyle") = 1 Then
-                '标题显示文件名,详情显示译名
-                '标题
-                Title = DescFileName
-                SubTitle = ""
-                '描述
-                If Entry.Comp Is Nothing Then
-                    NewDescription = Entry.Name
-                Else
-                    Dim Titles = Entry.Comp.GetControlTitle(False)
-                    NewDescription = Titles.Key & Titles.Value
-                End If
-                NewDescription = NewDescription.Replace("  |  ", " / ")
-                If Entry.Version IsNot Nothing Then NewDescription &= $" ({Entry.Version})"
+            NewDescription = NewDescription.Replace("  |  ", " / ")
+            If Entry.Version IsNot Nothing Then NewDescription &= $" ({Entry.Version})"
+        Else
+            '标题显示译名,详情显示文件名
+            '标题
+            If Entry.Comp Is Nothing Then
+                Title = Entry.DisplayName
+                SubTitle = If(Entry.Version Is Nothing, "", "  |  " & Entry.Version)
             Else
-                '标题显示译名,详情显示文件名
-                '标题
-                If Entry.Comp Is Nothing Then
-                    Title = Entry.Name
-                    SubTitle = If(Entry.Version Is Nothing, "", "  |  " & Entry.Version)
-                Else
-                    Dim Titles = Entry.Comp.GetControlTitle(False)
-                    Title = Titles.Key
-                    SubTitle = Titles.Value & If(Entry.Version Is Nothing, "", "  |  " & Entry.Version)
-                End If
-                '描述
-                NewDescription = DescFileName
+                Dim Titles = Entry.Comp.GetControlTitle(False)
+                Title = Titles.Key
+                SubTitle = Titles.Value & If(Entry.Version Is Nothing, "", "  |  " & Entry.Version)
             End If
-            If Entry.Comp IsNot Nothing Then
-                NewDescription += ": " & Entry.Comp.Description.Replace(vbCr, "").Replace(vbLf, "")
-            ElseIf Entry.Description IsNot Nothing Then
-                NewDescription += ": " & Entry.Description.Replace(vbCr, "").Replace(vbLf, "")
-            ElseIf Not Entry.IsFileAvailable Then
-                NewDescription += ": " & "存在错误,无法获取信息"
-            End If
-            Description = NewDescription
-            If Checked Then
-                LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5"))
-            Else
-                LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush1", "ColorBrushGray4"))
+            '描述
+            NewDescription = DescFileName
+        End If
+        If Entry.Comp IsNot Nothing Then
+            NewDescription += ": " & Entry.Comp.Description.Replace(vbCr, "").Replace(vbLf, "")
+        ElseIf Entry.Description IsNot Nothing Then
+            NewDescription += ": " & Entry.Description.Replace(vbCr, "").Replace(vbLf, "")
+        End If
+        Description = NewDescription
+        If Checked Then
+            LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush2", "ColorBrush5"))
+        Else
+            LabTitle.SetResourceReference(TextBlock.ForegroundProperty, If(Entry.State = McMod.McModState.Fine, "ColorBrush1", "ColorBrushGray4"))
+        End If
+        '主 Logo
+        If Entry.Comp IsNot Nothing Then
+            Entry.Comp.ApplyLogoToMyImage(PathLogo)
+        Else
+            PathLogo.Source = PathImage & "Icons/NoIcon.png"
+        End If
+        '图标右下角的 Logo
+        If Entry.State = McMod.McModState.Fine Then
+            If ImgState IsNot Nothing Then
+                Children.Remove(ImgState)
+                ImgState = Nothing
             End If
-            '主 Logo
-            Logo = If(Entry.Comp Is Nothing, PathImage & "Icons/NoIcon.png", Entry.Comp.GetControlLogo())
-            '图标右下角的 Logo
-            If Entry.State = McMod.McModState.Fine Then
-                If ImgState IsNot Nothing Then
-                    Children.Remove(ImgState)
-                    ImgState = Nothing
-                End If
-            Else
-                If ImgState Is Nothing Then
-                    ImgState = New Image With {
-                        .Width = 20, .Height = 20, .Margin = New Thickness(0, 0, -5, -3), .IsHitTestVisible = False,
-                        .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Bottom
-                    }
-                    RenderOptions.SetBitmapScalingMode(ImgState, BitmapScalingMode.HighQuality)
-                    SetColumn(ImgState, 1) : SetRow(ImgState, 1) : SetRowSpan(ImgState, 2)
-                    Children.Add(ImgState)
-                    '<Image x:Name="ImgState" RenderOptions.BitmapScalingMode="HighQuality" Width="16" Height="16" Margin="0,0,-3,-1"
-                    '       Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" IsHitTestVisible="False"
-                    '       HorizontalAlignment="Right" VerticalAlignment="Bottom"
-                    '       Source="/Images/Icons/Unavailable.png" />
-                End If
-                ImgState.Source = New MyBitmap(PathImage & $"Icons/{Entry.State}.png")
+        Else
+            If ImgState Is Nothing Then
+                ImgState = New Image With {
+                    .Width = 20, .Height = 20, .Margin = New Thickness(0, 0, -5, -3), .IsHitTestVisible = False,
+                    .HorizontalAlignment = HorizontalAlignment.Right, .VerticalAlignment = VerticalAlignment.Bottom
+                }
+                RenderOptions.SetBitmapScalingMode(ImgState, BitmapScalingMode.HighQuality)
+                SetColumn(ImgState, 1) : SetRow(ImgState, 1) : SetRowSpan(ImgState, 2)
+                Children.Add(ImgState)
+                '<Image x:Name="ImgState" RenderOptions.BitmapScalingMode="HighQuality" Width="16" Height="16" Margin="0,0,-3,-1"
+                '       Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" IsHitTestVisible="False"
+                '       HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                '       Source="/Images/Icons/Unavailable.png" />
             End If
-            '标签
-            If Entry.Comp IsNot Nothing Then Tags = Entry.Comp.Tags
-        End Sub)
+            ImgState.Source = New MyBitmap(PathImage & $"Icons/{Entry.State}.png")
+        End If
+        '标签
+        If Entry.Comp IsNot Nothing Then Tags = Entry.Comp.Tags
     End Sub
 
     Public Sub RefreshColor(sender As Object, e As EventArgs) Handles Me.MouseEnter, Me.MouseLeave, Me.MouseLeftButtonDown, Me.MouseLeftButtonUp, Me.Changed
@@ -488,9 +486,9 @@ Public Class MyLocalModItem
 
     '触发更新
     Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles BtnUpdate.Click
-        Select Case MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "Mod 更新确认", "更新", "查看更新日志", "取消")
+        Select Case MyMsgBox($"是否要更新 {Entry.DisplayName}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "Mod 更新确认", "更新", "查看更新日志", "取消")
             Case 1 '更新
-                FrmVersionMod.UpdateMods({Entry})
+                FrmInstanceMod.UpdateMods({Entry})
             Case 2 '查看更新日志
                 ShowUpdateLog()
             Case 3 '取消

+ 3 - 3
Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml

@@ -3,7 +3,7 @@
     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" 
     xmlns:System="clr-namespace:System;assembly=mscorlib" 
-    mc:Ignorable="d" x:Class="PageVersionExport"
+    mc:Ignorable="d" x:Class="PageInstanceExport"
     PanScroll="PanBack">
     <Grid x:Name="PanAllBack">
         <Grid.Resources>
@@ -249,8 +249,8 @@
                                       Theme="Yellow" Margin="0,2,0,8" Visibility="{Binding Checked, ElementName=CheckAdvancedInclude, Converter={StaticResource BooleanToVisibilityConverter}}" />
                         <local:MyCheckBox Text="打包资源文件,以避免在导入时下载" x:Name="CheckAdvancedInclude"
                                           ToolTip="将 Mod、资源包、光影包的文件直接放入整合包中,这样在导入时就无需联网下载它们。&#xa;建议仅在无法稳定连接 CurseForge 或 Modrinth 时才考虑勾选。" />
-                        <local:MyCheckBox Text="Modrinth 上传模式" x:Name="CheckAdvancedModrinth"
-                                          ToolTip="如果你想要打包上传到 Modrinth,勾选此项会生成完全符合 Modrinth 要求的整合包文件。&#xa;由于 Modrinth 要求,只能从 CurseForge 下载的资源将无法联网下载,会被直接放入整合包中。&#xa;此外,勾选后也不能在整合包中包含 PCL 启动器文件。" />
+                        <local:MyCheckBox Text="仅从 Modrinth 下载资源文件" x:Name="CheckAdvancedModrinth"
+                                          ToolTip="若资源未在 Modrinth 上托管,则将其原始文件直接放入整合包中。&#xa;如果你想将整合包上传到 Modrinth,这能帮助你分辨哪些文件未在 Modrinth 上托管。" />
                         <local:MyHint Theme="Blue" RelativeSetup="HintExportConfig" CanClose="True" Margin="0,20,0,2"
                                       Text="配置文件中含有更多高级选项,例如精准控制导出的文件、设置整合包存放位置等。&#xa;要修改这些选项,请先点击 “保存配置”,在编辑配置文件后再导入。" />
                         <Grid Height="35" Margin="0,12,0,0">

+ 26 - 32
Plain Craft Launcher 2/Pages/PageVersion/PageVersionExport.xaml.vb → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceExport.xaml.vb

@@ -15,28 +15,28 @@ Public Class ExportOption
     Public Property RequireModLoaderOrOptiFine As Boolean = False
 End Class
 
-Public Class PageVersionExport
+Public Class PageInstanceExport
     Implements IRefreshable
 
-    Private CurrentVersion As String = ""
-    Private Sub PageVersionExport_Loaded() Handles Me.Loaded
+    Private CurrentInstance As String = ""
+    Private Sub PageInstanceExport_Loaded() Handles Me.Loaded
         AniControlEnabled += 1
-        If CurrentVersion <> PageVersionLeft.Version.Path Then RefreshAll() '切换到了另一个版本,重置页面
+        If CurrentInstance <> PageInstanceLeft.Instance.PathVersion Then RefreshAll() '切换到了另一个版本,重置页面
         CustomEventService.SetEventData(BtnAdvancedHelp,
             If(VersionBranchName = "Release", "指南/整合包制作 - Public.json", "指南/整合包制作 - Snapshot.json"))
         AniControlEnabled -= 1
     End Sub
     Public Sub RefreshAll() Implements IRefreshable.Refresh
         Log($"[Export] 刷新导出页面")
-        HintOptiFine.Visibility = If(PageVersionLeft.Version.Version.HasOptiFine, Visibility.Visible, Visibility.Collapsed)
-        CurrentVersion = PageVersionLeft.Version.Path
+        HintOptiFine.Visibility = If(PageInstanceLeft.Instance.Version.HasOptiFine, Visibility.Visible, Visibility.Collapsed)
+        CurrentInstance = PageInstanceLeft.Instance.PathVersion
         TextExportName.Text = ""
-        TextExportName.HintText = PageVersionLeft.Version.Name
+        TextExportName.HintText = PageInstanceLeft.Instance.Name
         TextExportVersion.Text = ""
         TextExportVersion.HintText = "1.0.0"
         CheckAdvancedInclude.Checked = False
         CheckAdvancedModrinth.Checked = False
-        GetExportOption(CheckOptionsBasic).Description = PageVersionLeft.Version.GetVersionDescription()
+        GetExportOption(CheckOptionsBasic).Description = PageInstanceLeft.Instance.VersionDisplayName()
         ResetConfigOverrides()
         ReloadAllSubOptions()
         RefreshAllOptionsUI()
@@ -58,7 +58,7 @@ Public Class PageVersionExport
     Private Sub ReloadSubOptions(Panel As StackPanel, AcceptCompressedFile As Boolean, AcceptFolder As Boolean, ParamArray Folders As String())
         Panel.Children.Clear()
         For Each Folder In Folders
-            Dim TargetFolder As New DirectoryInfo(PageVersionLeft.Version.PathIndie & Folder)
+            Dim TargetFolder As New DirectoryInfo(PageInstanceLeft.Instance.PathIndie & Folder)
             If Not TargetFolder.Exists() Then Continue For
             '查找文件夹下的对应项
             If AcceptCompressedFile Then
@@ -100,7 +100,7 @@ Public Class PageVersionExport
                 Return False
             End Try
         End Function
-        Dim PathInfo As New DirectoryInfo(PageVersionLeft.Version.PathIndie)
+        Dim PathInfo As New DirectoryInfo(PageInstanceLeft.Instance.PathIndie)
         AllEntries.AddRange(PathInfo.EnumerateFiles().Select(Function(f) f.Name))
         For Each SubFolder In PathInfo.EnumerateDirectories().Where(IsValidDirectory)
             AllEntries.Add($"{SubFolder.Name}\")
@@ -112,9 +112,9 @@ Public Class PageVersionExport
         Dim IsVisible =
         Function(TargetOption As ExportOption) As Boolean
             '检查需要 OptiFine 或 Mod 加载器
-            If TargetOption.RequireOptiFine AndAlso Not PageVersionLeft.Version.Version.HasOptiFine Then Return False
-            If TargetOption.RequireModLoader AndAlso Not PageVersionLeft.Version.Modable Then Return False
-            If TargetOption.RequireModLoaderOrOptiFine AndAlso Not PageVersionLeft.Version.Version.HasOptiFine AndAlso Not PageVersionLeft.Version.Modable Then Return False
+            If TargetOption.RequireOptiFine AndAlso Not PageInstanceLeft.Instance.Version.HasOptiFine Then Return False
+            If TargetOption.RequireModLoader AndAlso Not PageInstanceLeft.Instance.Modable Then Return False
+            If TargetOption.RequireModLoaderOrOptiFine AndAlso Not PageInstanceLeft.Instance.Version.HasOptiFine AndAlso Not PageInstanceLeft.Instance.Modable Then Return False
             '粗略检查是否可能有符合规则的文件/文件夹
             Return StandardizeLines(If(TargetOption.Rules, TargetOption.ShowRules).Split("|"c), True).Any(
             Function(Rule As String)
@@ -130,9 +130,9 @@ Public Class PageVersionExport
                 Rule = Rule.Trim("*?".ToCharArray)
                 If Rule.Split({"\"c}, StringSplitOptions.RemoveEmptyEntries).Count >= 3 Then
                     If Rule.EndsWithF("\") Then
-                        Return IsValidDirectory(New DirectoryInfo(PageVersionLeft.Version.PathIndie & Rule)) '文件夹有效
+                        Return IsValidDirectory(New DirectoryInfo(PageInstanceLeft.Instance.PathIndie & Rule)) '文件夹有效
                     Else
-                        Return File.Exists(PageVersionLeft.Version.PathIndie & Rule) '文件有效
+                        Return File.Exists(PageInstanceLeft.Instance.PathIndie & Rule) '文件有效
                     End If
                 Else
                     Return False
@@ -324,9 +324,9 @@ Public Class PageVersionExport
             ConfigLines.Add("# 二次分发可能违反使用协议,请尽量不要公开发布包含资源文件的整合包!")
             ConfigLines.Add("DontCheckHostedAssets:" & CheckAdvancedInclude.Checked)
             ConfigLines.Add("")
-            ConfigLines.Add("# 如果你想要打包上传到 Modrinth,启用此项会生成完全符合 Modrinth 要求的整合包文件。")
-            ConfigLines.Add("# 由于 Modrinth 要求,只能从 CurseForge 下载的资源将无法联网下载,会被直接放入整合包中。")
-            ConfigLines.Add("# 此选项与 IncludeLauncher、IncludeLauncherCustom、DontCheckHostedAssets 冲突。")
+            ConfigLines.Add("# 若资源未在 Modrinth 上托管,则将其原始文件直接放入整合包中。")
+            ConfigLines.Add("# 如果你想将整合包上传到 Modrinth,这能帮助你分辨哪些文件未在 Modrinth 上托管。")
+            ConfigLines.Add("# 此选项与 DontCheckHostedAssets 冲突。")
             ConfigLines.Add("ModrinthUploadMode:" & CheckAdvancedModrinth.Checked)
             ConfigLines.Add("")
             ConfigLines.Add("# 导出的文件的存放位置。")
@@ -435,7 +435,7 @@ Public Class PageVersionExport
         '缓存所需参数
         Dim CacheFolder = RequestTaskTempFolder()
         Dim OverridesFolder = CacheFolder & "modpack\overrides\"
-        Dim McVersion = PageVersionLeft.Version
+        Dim McVersion = PageInstanceLeft.Instance
         Dim PathIndie As String = McVersion.PathIndie
         Dim CheckHostedAssets As Boolean = Not CheckAdvancedInclude.Checked
         Dim ModrinthUploadMode As Boolean = CheckAdvancedModrinth.Checked
@@ -530,7 +530,7 @@ Public Class PageVersionExport
             Next
             Loader.Progress = 0.97
             '复制 PCL 版本设置
-            CopyDirectory(McVersion.Path & "PCL\", OverridesFolder & "PCL\")
+            CopyDirectory(McVersion.PathVersion & "PCL\", OverridesFolder & "PCL\")
             WriteIni(OverridesFolder & "PCL\Setup.ini", "IsStar", False)
 #If BETA Then
             '复制 PCL 本体
@@ -589,7 +589,7 @@ Public Class PageVersionExport
             RunInNewThread(
             Sub()
                 Try
-                    If ModrinthUploadMode Then Return 'Modrinth 上传模式下,不能从 CurseForge 获取信息
+                    If ModrinthUploadMode Then Return 'Modrinth 上传模式下,不从 CurseForge 获取信息
                     Dim CurseForgeHashes = Loader.Input.Select(Function(m) m.CurseForgeHash)
                     Dim CurseForgeRaw As JContainer = DlModRequest("https://api.curseforge.com/v1/fingerprints/432/", HttpMethod.Post,
                         $"{{""fingerprints"": [{CurseForgeHashes.Join(",")}]}}", "application/json")("data")("exactMatches")
@@ -648,17 +648,17 @@ Public Class PageVersionExport
                 Files.Add(New JObject From {
                     {"path", ModFile.Path.AfterFirst(OverridesFolder).Replace("\", "/")},
                     {"hashes", New JObject From {{"sha1", ModFile.ModrinthHash}, {"sha512", GetFileSHA512(ModFile.Path)}}},
-                    {"downloads", New JArray(Pair.Value.OrderByDescending(Function(u) u.Contains("modrinth.com")))},
+                    {"downloads", New JArray(Pair.Value.OrderBy(Function(u) u.Contains("modrinth.com")))}, '不优先选择 Modrinth
                     {"fileSize", New FileInfo(ModFile.Path).Length}
                 })
                 File.Delete(ModFile.Path)
             Next
             Loader.Progress = 0.2
             '导出最终 JSON 文件
-            Dim Dependencies As New JObject From {{"minecraft", McVersion.Version.McName}}
-            If McVersion.Version.HasForge Then Dependencies.Add("forge", McVersion.Version.ForgeVersion)
-            If McVersion.Version.HasFabric Then Dependencies.Add("fabric-loader", McVersion.Version.FabricVersion)
-            If McVersion.Version.HasNeoForge Then Dependencies.Add("neoforge", McVersion.Version.NeoForgeVersion)
+            Dim Dependencies As New JObject From {{"minecraft", McVersion.Version.VanillaName}}
+            If McVersion.Version.HasForge Then Dependencies.Add("forge", McVersion.Version.Forge)
+            If McVersion.Version.HasFabric Then Dependencies.Add("fabric-loader", McVersion.Version.Fabric)
+            If McVersion.Version.HasNeoForge Then Dependencies.Add("neoforge", McVersion.Version.NeoForge)
             Dim ResultJson As New JObject From {
                 {"game", "minecraft"},
                 {"formatVersion", 1},
@@ -711,12 +711,6 @@ Public Class PageVersionExport
         End If
     End Sub
 
-    '勾选 Modrinth 上传模式时,禁止打包 PCL
-    Private Sub CheckAdvancedModrinth_Change(sender As Object, user As Boolean) Handles CheckAdvancedModrinth.Change
-        If CheckAdvancedModrinth.Checked Then CheckOptionsPcl.Checked = False
-        CheckOptionsPcl.IsEnabled = Not CheckAdvancedModrinth.Checked
-    End Sub
-
     '勾选打包资源文件时,禁止开启 Modrinth 上传模式
     Private Sub CheckAdvancedInclude_Change(sender As Object, user As Boolean) Handles CheckAdvancedInclude.Change
         If CheckAdvancedInclude.Checked Then CheckAdvancedModrinth.Checked = False

+ 1 - 1
Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceLeft.xaml

@@ -1,4 +1,4 @@
-<local:MyPageLeft x:Class="PageVersionLeft"
+<local:MyPageLeft x:Class="PageInstanceLeft"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:local="clr-namespace:PCL" AnimatedControl="PanItem">

+ 25 - 25
Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceLeft.xaml.vb

@@ -1,13 +1,13 @@
-Public Class PageVersionLeft
+Public Class PageInstanceLeft
     Implements IRefreshable
 
     ''' <summary>
     ''' 当前显示设置的 MC 版本。
     ''' </summary>
-    Public Shared Version As McVersion = Nothing
+    Public Shared Instance As McInstance = Nothing
 
     Public Sub RefreshModDisabled() Handles Me.Loaded
-        If Version IsNot Nothing AndAlso Version.Modable Then
+        If Instance IsNot Nothing AndAlso Instance.Modable Then
             ItemMod.Visibility = Visibility.Visible
             ItemModDisabled.Visibility = Visibility.Collapsed
         Else
@@ -26,7 +26,7 @@
     ''' <summary>
     ''' 勾选事件改变页面。
     ''' </summary>
-    Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemExport.Check
+    Private Sub PageCheck(sender As FrameworkElement, e As RouteEventArgs) Handles ItemOverall.Check, ItemMod.Check, ItemModDisabled.Check, ItemSetup.Check, ItemExport.Check
         '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0
         '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False)
         If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag))
@@ -35,21 +35,21 @@
     Public Function PageGet(Optional ID As FormMain.PageSubType = -1)
         If ID = -1 Then ID = PageID
         Select Case ID
-            Case FormMain.PageSubType.VersionOverall
-                If FrmVersionOverall Is Nothing Then FrmVersionOverall = New PageVersionOverall
-                Return FrmVersionOverall
-            Case FormMain.PageSubType.VersionMod
-                If FrmVersionMod Is Nothing Then FrmVersionMod = New PageVersionMod
-                Return FrmVersionMod
-            Case FormMain.PageSubType.VersionModDisabled
-                If FrmVersionModDisabled Is Nothing Then FrmVersionModDisabled = New PageVersionModDisabled
-                Return FrmVersionModDisabled
-            Case FormMain.PageSubType.VersionSetup
-                If IsNothing(FrmVersionSetup) Then FrmVersionSetup = New PageVersionSetup
-                Return FrmVersionSetup
-            Case FormMain.PageSubType.VersionExport
-                If FrmVersionExport Is Nothing Then FrmVersionExport = New PageVersionExport
-                Return FrmVersionExport
+            Case FormMain.PageSubType.InstanceOverall
+                If FrmInstanceOverall Is Nothing Then FrmInstanceOverall = New PageInstanceOverall
+                Return FrmInstanceOverall
+            Case FormMain.PageSubType.InstanceMod
+                If FrmInstanceMod Is Nothing Then FrmInstanceMod = New PageInstanceMod
+                Return FrmInstanceMod
+            Case FormMain.PageSubType.InstanceModDisabled
+                If FrmInstanceModDisabled Is Nothing Then FrmInstanceModDisabled = New PageInstanceModDisabled
+                Return FrmInstanceModDisabled
+            Case FormMain.PageSubType.InstanceSetup
+                If IsNothing(FrmInstanceSetup) Then FrmInstanceSetup = New PageInstanceSetup
+                Return FrmInstanceSetup
+            Case FormMain.PageSubType.InstanceExport
+                If FrmInstanceExport Is Nothing Then FrmInstanceExport = New PageInstanceExport
+                Return FrmInstanceExport
             Case Else
                 Throw New Exception("未知的版本设置子页面种类:" & ID)
         End Select
@@ -99,19 +99,19 @@
     End Sub
     Public Sub Refresh(SubType As FormMain.PageSubType)
         Select Case SubType
-            Case FormMain.PageSubType.VersionMod
-                PageVersionMod.Refresh()
+            Case FormMain.PageSubType.InstanceMod
+                PageInstanceMod.Refresh()
                 ItemMod.Checked = True
-            Case FormMain.PageSubType.VersionExport
-                If FrmVersionExport IsNot Nothing Then FrmVersionExport.RefreshAll()
+            Case FormMain.PageSubType.InstanceExport
+                If FrmInstanceExport IsNot Nothing Then FrmInstanceExport.RefreshAll()
                 ItemExport.Checked = True
         End Select
     End Sub
 
     Public Sub Reset(sender As Object, e As EventArgs)
         If MyMsgBox("是否要初始化该版本的版本独立设置?该操作不可撤销。", "初始化确认",, "取消", IsWarn:=True) = 1 Then
-            If IsNothing(FrmVersionSetup) Then FrmVersionSetup = New PageVersionSetup
-            FrmVersionSetup.Reset()
+            If IsNothing(FrmInstanceSetup) Then FrmInstanceSetup = New PageInstanceSetup
+            FrmInstanceSetup.Reset()
             ItemSetup.Checked = True
         End If
     End Sub

+ 1 - 3
Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceMod.xaml

@@ -2,7 +2,7 @@
     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="PageVersionMod"
+    mc:Ignorable="d" x:Class="PageInstanceMod"
     PanScroll="PanBack">
     <Grid>
         <Grid x:Name="PanAllBack">
@@ -22,7 +22,6 @@
                             <local:MyButton x:Name="BtnManageInstall" Grid.Column="1" MinWidth="110" Text="从文件安装" Padding="13,0" Margin="0,0,15,0" HorizontalAlignment="Left" />
                             <local:MyButton x:Name="BtnManageDownload" Grid.Column="2" MinWidth="110" Text="下载新 Mod" Padding="13,0" Margin="0,0,15,0" HorizontalAlignment="Left" />
                             <local:MyButton x:Name="BtnManageSelectAll" Grid.Column="3" MinWidth="110" Text="全选" Padding="13,0" Margin="0,0,15,0" HorizontalAlignment="Left" />
-                            <local:MyButton x:Name="BtnManageCheck" Grid.Column="4" MinWidth="110" Text="检查 Mod" Padding="13,0" Margin="0,0,15,0" HorizontalAlignment="Left" ToolTip="快速检查 Mod 的版本要求、重复、前置缺失等问题。&#xa;结果仅供参考,由于部分 Mod 标注的信息有误,可能并不准确。" Visibility="Collapsed" />
                         </Grid>
                     </local:MyCard>
                     <local:MyCard x:Name="PanListBack" VerticalAlignment="Top" Opacity="0" Margin="0,0,0,14" Title=" " MinHeight="55">
@@ -31,7 +30,6 @@
                             <local:MyRadioButton Tag="1" ColorType="Highlight" VerticalAlignment="Center" Margin="2,0" Text="已启用" x:Name="BtnFilterEnabled" />
                             <local:MyRadioButton Tag="2" ColorType="Highlight" VerticalAlignment="Center" Margin="2,0" Text="已禁用" x:Name="BtnFilterDisabled" />
                             <local:MyRadioButton Tag="3" ColorType="Highlight" VerticalAlignment="Center" Margin="2,0" Text="可更新" x:Name="BtnFilterCanUpdate" />
-                            <local:MyRadioButton Tag="4" ColorType="Highlight" VerticalAlignment="Center" Margin="2,0" Text="错误" x:Name="BtnFilterError" />
                         </StackPanel>
                         <StackPanel Margin="20,48,18,22" Name="PanList" VerticalAlignment="Top" />
                     </local:MyCard>

+ 39 - 100
Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceMod.xaml.vb

@@ -1,4 +1,4 @@
-Public Class PageVersionMod
+Public Class PageInstanceMod
     Implements IRefreshable
 
 #Region "初始化"
@@ -23,28 +23,22 @@
             Btn.LabText.Margin = New Thickness(-2, 0, 8, 0)
         Next
 
-#If DEBUG Then
-        BtnManageCheck.Visibility = Visibility.Visible
-#End If
-
     End Sub
     ''' <summary>
     ''' 刷新 Mod 列表。
     ''' </summary>
     Public Sub ReloadModList(Optional ForceReload As Boolean = False)
-        If LoaderRun(If(ForceReload, LoaderFolderRunType.ForceRun, LoaderFolderRunType.RunOnUpdated)) Then
-            Log("[System] 已刷新 Mod 列表")
-            Filter = FilterType.All
-            PanBack.ScrollToHome()
-            SearchBox.Text = ""
-        End If
+        If Not LoaderRun(If(ForceReload, LoaderFolderRunType.ForceRun, LoaderFolderRunType.RunOnUpdated)) Then Return
+        Log("[System] 已刷新 Mod 列表")
+        Filter = FilterType.All
+        PanBack.ScrollToHome()
+        SearchBox.Text = ""
     End Sub
     '强制刷新
     Private Sub RefreshSelf() Implements IRefreshable.Refresh
         Refresh()
     End Sub
     Public Shared Sub Refresh()
-        '强制刷新
         Try
             CompProjectCache.Clear()
             CompFilesCache.Clear()
@@ -53,8 +47,8 @@
         Catch ex As Exception
             Log(ex, "强制刷新时清理本地 Mod 信息缓存失败")
         End Try
-        If FrmVersionMod IsNot Nothing Then FrmVersionMod.ReloadModList(True) '无需 Else,还没加载刷个鬼的新
-        FrmVersionLeft.ItemMod.Checked = True
+        If FrmInstanceMod IsNot Nothing Then FrmInstanceMod.ReloadModList(True) '无需 Else,还没加载刷个鬼的新
+        FrmInstanceLeft.ItemMod.Checked = True
         Hint("正在刷新……", Log:=False)
     End Sub
 
@@ -67,7 +61,7 @@
         End If
     End Sub
     Public Function LoaderRun(Type As LoaderFolderRunType) As Boolean
-        Return LoaderFolderRun(McModLoader, PageVersionLeft.Version.PathIndie & "mods\", Type)
+        Return LoaderFolderRun(McModLoader, PageInstanceLeft.Instance.PathIndie & "mods\", Type)
     End Function
 
 #End Region
@@ -109,8 +103,7 @@
         AniControlEnabled += 1
         Dim NewItem As New MyLocalModItem With {.SnapsToDevicePixels = True, .Entry = Entry,
             .ButtonHandler = AddressOf McModContent, .Checked = SelectedMods.Contains(Entry.RawFileName)}
-        AddHandler Entry.OnCompUpdate, AddressOf NewItem.Refresh
-        NewItem.Refresh()
+        AddHandler Entry.OnUpdate, Sub() RunInUi(AddressOf NewItem.Refresh)
         AniControlEnabled -= 1
         Return NewItem
     End Function
@@ -144,11 +137,7 @@
         ToolTipService.SetVerticalOffset(BtnED, 30)
         ToolTipService.SetHorizontalOffset(BtnED, 2)
         AddHandler BtnED.Click, AddressOf ED_Click
-        If sender.Entry.State = McMod.McModState.Unavailable Then
-            sender.Buttons = {BtnCont, BtnOpen, BtnDelete}
-        Else
-            sender.Buttons = {BtnCont, BtnOpen, BtnED, BtnDelete}
-        End If
+        sender.Buttons = {BtnCont, BtnOpen, BtnED, BtnDelete}
     End Sub
 
     ''' <summary>
@@ -188,13 +177,11 @@
         Dim EnabledCount As Integer = 0
         Dim DisabledCount As Integer = 0
         Dim UpdateCount As Integer = 0
-        Dim UnavalialeCount As Integer = 0
         For Each ModItem In If(IsSearching, SearchResult, If(McModLoader.Output, New List(Of McMod)))
             AnyCount += 1
             If ModItem.CanUpdate Then UpdateCount += 1
             If ModItem.State.Equals(McMod.McModState.Fine) Then EnabledCount += 1
             If ModItem.State.Equals(McMod.McModState.Disabled) Then DisabledCount += 1
-            If ModItem.State.Equals(McMod.McModState.Unavailable) Then UnavalialeCount += 1
         Next
         '显示
         BtnFilterAll.Text = If(IsSearching, "搜索结果", "全部") & $" ({AnyCount})"
@@ -204,8 +191,6 @@
         BtnFilterEnabled.Visibility = If(Filter = FilterType.Enabled OrElse (EnabledCount > 0 AndAlso EnabledCount < AnyCount), Visibility.Visible, Visibility.Collapsed)
         BtnFilterDisabled.Text = $"禁用 ({DisabledCount})"
         BtnFilterDisabled.Visibility = If(Filter = FilterType.Disabled OrElse DisabledCount > 0, Visibility.Visible, Visibility.Collapsed)
-        BtnFilterError.Text = $"错误 ({UnavalialeCount})"
-        BtnFilterError.Visibility = If(Filter = FilterType.Unavailable OrElse UnavalialeCount > 0, Visibility.Visible, Visibility.Collapsed)
 
         '-----------------
         ' 底部栏
@@ -289,31 +274,13 @@
     ''' </summary>
     Private Sub BtnManageOpen_Click(sender As Object, e As EventArgs) Handles BtnManageOpen.Click, BtnHintOpen.Click
         Try
-            Directory.CreateDirectory(PageVersionLeft.Version.PathIndie & "mods\")
-            OpenExplorer(PageVersionLeft.Version.PathIndie & "mods\")
+            Directory.CreateDirectory(PageInstanceLeft.Instance.PathIndie & "mods\")
+            OpenExplorer(PageInstanceLeft.Instance.PathIndie & "mods\")
         Catch ex As Exception
             Log(ex, "打开 Mods 文件夹失败", LogLevel.Msgbox)
         End Try
     End Sub
 
-#If DEBUG Then
-    ''' <summary>
-    ''' 检查 Mod。
-    ''' </summary>
-    Private Sub BtnManageCheck_Click(sender As Object, e As EventArgs) Handles BtnManageCheck.Click
-        Try
-            Dim Result = McModCheck(PageVersionLeft.Version, McModLoader.Output)
-            If Result.Any Then
-                MyMsgBox(Join(Result, vbCrLf & vbCrLf), "Mod 检查结果")
-            Else
-                Hint("Mod 检查完成,未发现任何问题!", HintType.Green)
-            End If
-        Catch ex As Exception
-            Log(ex, "进行 Mod 检查时出错", LogLevel.Feedback)
-        End Try
-    End Sub
-#End If
-
     ''' <summary>
     ''' 全选。
     ''' </summary>
@@ -344,14 +311,14 @@
             Return True
         End If
         '获取并检查目标版本
-        Dim TargetVersion As McVersion = McVersionCurrent
-        If FrmMain.PageCurrent = FormMain.PageType.VersionSetup Then TargetVersion = PageVersionLeft.Version
-        If FrmMain.PageCurrent = FormMain.PageType.VersionSelect OrElse TargetVersion Is Nothing OrElse Not TargetVersion.Modable Then
+        Dim Instance As McInstance = McInstanceSelected
+        If FrmMain.PageCurrent = FormMain.PageType.InstanceSetup Then Instance = PageInstanceLeft.Instance
+        If FrmMain.PageCurrent = FormMain.PageType.InstanceSelect OrElse Instance Is Nothing OrElse Not Instance.Modable Then
             '正在选择版本,或当前版本不能安装 Mod
             Hint("若要安装 Mod,请先选择一个可以安装 Mod 的版本!")
-        ElseIf Not (FrmMain.PageCurrent = FormMain.PageType.VersionSetup AndAlso FrmMain.PageCurrentSub = FormMain.PageSubType.VersionMod) Then
+        ElseIf Not (FrmMain.PageCurrent = FormMain.PageType.InstanceSetup AndAlso FrmMain.PageCurrentSub = FormMain.PageSubType.InstanceMod) Then
             '未处于 Mod 管理页面
-            If MyMsgBox($"是否要将这{If(FilePathList.Count = 1, "个", "些")}文件作为 Mod 安装到 {TargetVersion.Name}?", "Mod 安装确认", "确定", "取消") = 1 Then GoTo Install
+            If MyMsgBox($"是否要将这{If(FilePathList.Count = 1, "个", "些")}文件作为 Mod 安装到 {Instance.Name}?", "Mod 安装确认", "确定", "取消") = 1 Then GoTo Install
         Else
             '处于 Mod 管理页面
 Install:
@@ -359,7 +326,7 @@ Install:
                 For Each ModFile In FilePathList
                     Dim NewFileName = GetFileNameFromPath(ModFile).Replace(".disabled", "").Replace(".old", "")
                     If Not NewFileName.Contains(".") Then NewFileName += ".jar" '#4227
-                    CopyFile(ModFile, TargetVersion.PathIndie & "mods\" & NewFileName)
+                    CopyFile(ModFile, Instance.PathIndie & "mods\" & NewFileName)
                 Next
                 If FilePathList.Count = 1 Then
                     Hint($"已安装 {GetFileNameFromPath(FilePathList.First).Replace(".disabled", "").Replace(".old", "")}!", HintType.Green)
@@ -367,8 +334,8 @@ Install:
                     Hint($"已安装 {FilePathList.Count} 个 Mod!", HintType.Green)
                 End If
                 '刷新列表
-                If FrmMain.PageCurrent = FormMain.PageType.VersionSetup AndAlso FrmMain.PageCurrentSub = FormMain.PageSubType.VersionMod Then
-                    LoaderFolderRun(McModLoader, TargetVersion.PathIndie & "mods\", LoaderFolderRunType.ForceRun)
+                If FrmMain.PageCurrent = FormMain.PageType.InstanceSetup AndAlso FrmMain.PageCurrentSub = FormMain.PageSubType.InstanceMod Then
+                    LoaderFolderRun(McModLoader, Instance.PathIndie & "mods\", LoaderFolderRunType.ForceRun)
                 End If
             Catch ex As Exception
                 Log(ex, "复制 Mod 文件失败", LogLevel.Msgbox)
@@ -382,7 +349,7 @@ Install:
     ''' </summary>
     Private Sub BtnManageDownload_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnManageDownload.Click, BtnHintDownload.Click
         '预设置当前版本和搜索框内容
-        PageComp.TargetVersion = PageVersionLeft.Version
+        PageComp.TargetInstance = PageInstanceLeft.Instance
         PageComp.TargetName = SearchBox.Text
         FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadMod)
     End Sub
@@ -455,10 +422,8 @@ Install:
                     BtnFilterEnabled.Checked = True
                 Case FilterType.Disabled
                     BtnFilterDisabled.Checked = True
-                Case FilterType.CanUpdate
-                    BtnFilterCanUpdate.Checked = True
                 Case Else
-                    BtnFilterError.Checked = True
+                    BtnFilterCanUpdate.Checked = True
             End Select
             RefreshUI()
         End Set
@@ -468,7 +433,6 @@ Install:
         Enabled = 1
         Disabled = 2
         CanUpdate = 3
-        Unavailable = 4
     End Enum
 
     ''' <summary>
@@ -484,15 +448,13 @@ Install:
                 Return CheckingMod.State = McMod.McModState.Disabled
             Case FilterType.CanUpdate
                 Return CheckingMod.CanUpdate
-            Case FilterType.Unavailable
-                Return CheckingMod.State = McMod.McModState.Unavailable
             Case Else
                 Return False
         End Select
     End Function
 
     '点击筛选项触发的改变
-    Private Sub ChangeFilter(sender As MyRadioButton, raiseByMouse As Boolean) Handles BtnFilterAll.Check, BtnFilterCanUpdate.Check, BtnFilterDisabled.Check, BtnFilterEnabled.Check, BtnFilterError.Check
+    Private Sub ChangeFilter(sender As MyRadioButton, raiseByMouse As Boolean) Handles BtnFilterAll.Check, BtnFilterCanUpdate.Check, BtnFilterDisabled.Check, BtnFilterEnabled.Check
         Filter = sender.Tag
         RefreshUI()
     End Sub
@@ -586,7 +548,7 @@ Install:
     ''' <summary>
     ''' 记录正在进行 Mod 更新的 mods 文件夹路径。
     ''' </summary>
-    Public Shared UpdatingVersions As New List(Of String)
+    Public Shared UpdatingInstanceModFolders As New List(Of String)
     Public Sub UpdateMods(ModList As IEnumerable(Of McMod))
         '更新前警告
         If Not Setup.Get("HintUpdateMod") OrElse ModList.Count >= 15 Then
@@ -665,8 +627,8 @@ Install:
                 End Try
             End Sub))
             '结束处理
-            Dim Loader As New LoaderCombo(Of IEnumerable(Of McMod))("Mod 更新:" & PageVersionLeft.Version.Name, InstallLoaders)
-            Dim PathMods As String = PageVersionLeft.Version.PathIndie & "mods\"
+            Dim Loader As New LoaderCombo(Of IEnumerable(Of McMod))("Mod 更新:" & PageInstanceLeft.Instance.Name, InstallLoaders)
+            Dim PathMods As String = PageInstanceLeft.Instance.PathIndie & "mods\"
             Loader.OnStateChanged =
             Sub()
                 '结果提示
@@ -688,7 +650,7 @@ Install:
                         Return
                 End Select
                 Log($"[Mod] 已从正在进行 Mod 更新的文件夹列表移除:{PathMods}")
-                UpdatingVersions.Remove(PathMods)
+                UpdatingInstanceModFolders.Remove(PathMods)
                 '清理缓存
                 RunInNewThread(
                 Sub()
@@ -703,7 +665,7 @@ Install:
             End Sub
             '启动加载器
             Log($"[Mod] 开始更新 {ModList.Count} 个 Mod:{PathMods}")
-            UpdatingVersions.Add(PathMods)
+            UpdatingInstanceModFolders.Add(PathMods)
             Loader.Start()
             LoaderTaskbarAdd(Loader)
             FrmMain.BtnExtraDownload.ShowRefresh()
@@ -807,41 +769,27 @@ Install:
 
             Dim ModEntry As McMod = CType(If(TypeOf sender Is MyIconButton, sender.Tag, sender), MyLocalModItem).Entry
             '加载失败信息
-            If ModEntry.State = McMod.McModState.Unavailable Then
-                MyMsgBox("无法读取此 Mod 的信息。" & vbCrLf & vbCrLf & "详细的错误信息:" & ModEntry.FileUnavailableReason.GetDetail(), "Mod 读取失败")
-                Return
-            End If
             If ModEntry.Comp IsNot Nothing Then
                 '跳转到 Mod 下载页面
                 FrmMain.PageChange(New FormMain.PageStackData With {.Page = FormMain.PageType.CompDetail,
-                    .Additional = {ModEntry.Comp, New List(Of String), PageVersionLeft.Version.Version.McName,
-                        If(PageVersionLeft.Version.Version.HasForge, CompModLoaderType.Forge,
-                        If(PageVersionLeft.Version.Version.HasNeoForge, CompModLoaderType.NeoForge,
-                        If(PageVersionLeft.Version.Version.HasFabric, CompModLoaderType.Fabric, CompModLoaderType.Any))),
+                    .Additional = {ModEntry.Comp, New List(Of String), PageInstanceLeft.Instance.Version.VanillaName,
+                        If(PageInstanceLeft.Instance.Version.HasForge, CompModLoaderType.Forge,
+                        If(PageInstanceLeft.Instance.Version.HasNeoForge, CompModLoaderType.NeoForge,
+                        If(PageInstanceLeft.Instance.Version.HasFabric, CompModLoaderType.Fabric, CompModLoaderType.Any))),
                         CompType.Mod}})
             Else
                 '获取信息
                 Dim ContentLines As New List(Of String)
                 If ModEntry.Description IsNot Nothing Then ContentLines.Add(ModEntry.Description & vbCrLf)
-                If ModEntry.Authors IsNot Nothing Then ContentLines.Add("作者:" & ModEntry.Authors)
                 ContentLines.Add("文件:" & ModEntry.FileName & "(" & GetString(New FileInfo(ModEntry.Path).Length) & ")")
                 If ModEntry.Version IsNot Nothing Then ContentLines.Add("版本:" & ModEntry.Version)
                 Dim DebugInfo As New List(Of String)
-                If ModEntry.ModId IsNot Nothing Then
-                    DebugInfo.Add("Mod ID:" & ModEntry.ModId)
-                End If
-                If ModEntry.Dependencies.Any Then
-                    DebugInfo.Add("依赖于:")
-                    For Each Dep In ModEntry.Dependencies
-                        DebugInfo.Add(" - " & Dep.Key & If(Dep.Value Is Nothing, "", ",版本:" & Dep.Value))
-                    Next
-                End If
                 If DebugInfo.Any Then
                     ContentLines.Add("")
                     ContentLines.AddRange(DebugInfo)
                 End If
                 '获取用于搜索的 Mod 名称
-                Dim ModOriginalName As String = ModEntry.Name.Replace(" ", "+")
+                Dim ModOriginalName As String = ModEntry.DisplayName.Replace(" ", "+")
                 Dim ModSearchName As String = ModOriginalName.Substring(0, 1)
                 For i = 1 To ModOriginalName.Count - 1
                     Dim IsLastLower As Boolean = ModOriginalName(i - 1).ToString.ToLower.Equals(ModOriginalName(i - 1).ToString)
@@ -853,18 +801,9 @@ Install:
                     ModSearchName += ModOriginalName(i)
                 Next
                 ModSearchName = ModSearchName.Replace("++", "+").Replace("pti+Fine", "ptiFine")
-                '显示
-                If ModEntry.Url Is Nothing Then
-                    If MyMsgBox(Join(ContentLines, vbCrLf), ModEntry.Name, "百科搜索", "返回") = 1 Then
-                        OpenWebsite("https://www.mcmod.cn/s?key=" & ModSearchName & "&site=all&filter=0")
-                    End If
-                Else
-                    Select Case MyMsgBox(Join(ContentLines, vbCrLf), ModEntry.Name, "打开官网", "百科搜索", "返回")
-                        Case 1
-                            OpenWebsite(ModEntry.Url)
-                        Case 2
-                            OpenWebsite("https://www.mcmod.cn/s?key=" & ModSearchName & "&site=all&filter=0")
-                    End Select
+                '百科搜索链接
+                If MyMsgBox(Join(ContentLines, vbCrLf), ModEntry.DisplayName, "百科搜索", "返回") = 1 Then
+                    OpenWebsite("https://www.mcmod.cn/s?key=" & ModSearchName & "&site=all&filter=0")
                 End If
             End If
         Catch ex As Exception
@@ -907,7 +846,7 @@ Install:
             Dim QueryList As New List(Of SearchEntry(Of McMod))
             For Each Entry As McMod In McModLoader.Output
                 Dim SearchSource As New List(Of KeyValuePair(Of String, Double))
-                SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Name, 1))
+                SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.DisplayName, 1))
                 SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.FileName, 1))
                 If Entry.Version IsNot Nothing Then
                     SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Version, 0.2))
@@ -916,7 +855,7 @@ Install:
                     SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Description, 0.4))
                 End If
                 If Entry.Comp IsNot Nothing Then
-                    If Entry.Comp.RawName <> Entry.Name Then SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Comp.RawName, 1))
+                    If Entry.Comp.RawName <> Entry.DisplayName Then SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Comp.RawName, 1))
                     If Entry.Comp.TranslatedName <> Entry.Comp.RawName Then SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Comp.TranslatedName, 1))
                     If Entry.Comp.Description <> Entry.Description Then SearchSource.Add(New KeyValuePair(Of String, Double)(Entry.Comp.Description, 0.4))
                     SearchSource.Add(New KeyValuePair(Of String, Double)(String.Join("", Entry.Comp.Tags), 0.2))

+ 1 - 1
Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceModDisabled.xaml

@@ -1,4 +1,4 @@
-<local:MyPageRight x:Class="PageVersionModDisabled"
+<local:MyPageRight x:Class="PageInstanceModDisabled"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

+ 2 - 2
Plain Craft Launcher 2/Pages/PageVersion/PageVersionModDisabled.xaml.vb → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceModDisabled.xaml.vb

@@ -1,11 +1,11 @@
-Class PageVersionModDisabled
+Class PageInstanceModDisabled
 
     Private Sub BtnDownload_Click(sender As Object, e As EventArgs) Handles BtnDownload.Click
         FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadInstall)
     End Sub
     Private Sub BtnVersion_Click(sender As Object, e As EventArgs) Handles BtnVersion.Click
         FrmMain.PageChange(FormMain.PageType.Launch) '在版本选择页面选定版本的时候只会返回一层,因此如果不先锚定 Launch,在选择版本后会回退到版本设置的这个页面
-        FrmMain.PageChange(FormMain.PageType.VersionSelect)
+        FrmMain.PageChange(FormMain.PageType.InstanceSelect)
     End Sub
 
     Public Sub BtnDownload_Loaded() Handles BtnDownload.Loaded

+ 2 - 2
Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceOverall.xaml

@@ -3,7 +3,7 @@
     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" 
     xmlns:System="clr-namespace:System;assembly=mscorlib" 
-    mc:Ignorable="d" x:Class="PageVersionOverall"
+    mc:Ignorable="d" x:Class="PageInstanceOverall"
     PanScroll="PanBack" Grid.IsSharedSizeScope="True">
     <local:MyScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" x:Name="PanBack">
         <StackPanel x:Name="PanMain" Margin="25,10">
@@ -25,7 +25,7 @@
                         <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text="图标" Margin="0,0,25,0" />
                         <local:MyComboBox Grid.Column="1" x:Name="ComboDisplayLogo">
                             <local:MyComboBoxItem Content="自动" IsSelected="True" Tag="" />
-                            <local:MyComboBoxItem Content="自定义..." x:Name="ItemDisplayLogoCustom" />
+                            <local:MyComboBoxItem Content="自定义..." x:Name="ItemDisplayLogoCustom" Tag="PCL\Logo.png" />
                             <local:MyComboBoxItem Content="圆石" Tag="pack://application:,,,/images/Blocks/CobbleStone.png" />
                             <local:MyComboBoxItem Content="命令方块" Tag="pack://application:,,,/images/Blocks/CommandBlock.png" />
                             <local:MyComboBoxItem Content="金块" Tag="pack://application:,,,/images/Blocks/GoldBlock.png" />

+ 76 - 78
Plain Craft Launcher 2/Pages/PageVersion/PageVersionOverall.xaml.vb → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceOverall.xaml.vb

@@ -1,4 +1,4 @@
-Public Class PageVersionOverall
+Public Class PageInstanceOverall
 
     Private IsLoad As Boolean = False
     Private Sub PageSetupLaunch_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
@@ -7,7 +7,6 @@
         PanBack.ScrollToHome()
 
         '更新设置
-        ItemDisplayLogoCustom.Tag = "PCL\Logo.png"
         Reload()
 
         '非重复加载部分
@@ -17,7 +16,7 @@
 
     End Sub
 
-    Public ItemVersion As MyListItem
+    Public InstanceHeaderItem As MyListItem
     ''' <summary>
     ''' 确保当前页面上的信息已正确显示。
     ''' </summary>
@@ -25,19 +24,19 @@
         AniControlEnabled += 1
 
         '刷新设置项目
-        ComboDisplayType.SelectedIndex = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Auto)
-        BtnDisplayStar.Text = If(PageVersionLeft.Version.IsStar, "从收藏夹中移除", "加入收藏夹")
-        BtnFolderMods.Visibility = If(PageVersionLeft.Version.Modable, Visibility.Visible, Visibility.Collapsed)
+        ComboDisplayType.SelectedIndex = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "DisplayType", McInstanceCardType.Auto)
+        BtnDisplayStar.Text = If(PageInstanceLeft.Instance.IsStar, "从收藏夹中移除", "加入收藏夹")
+        BtnFolderMods.Visibility = If(PageInstanceLeft.Instance.Modable, Visibility.Visible, Visibility.Collapsed)
         '刷新版本显示
         PanDisplayItem.Children.Clear()
-        ItemVersion = PageVersionLeft.Version.ToListItem
-        ItemVersion.IsHitTestVisible = False
-        PanDisplayItem.Children.Add(ItemVersion)
+        InstanceHeaderItem = PageInstanceLeft.Instance.ToListItem().Init()
+        InstanceHeaderItem.IsHitTestVisible = False
+        PanDisplayItem.Children.Add(InstanceHeaderItem)
         FrmMain.PageNameRefresh()
         '刷新版本图标
         ComboDisplayLogo.SelectedIndex = 0
-        Dim Logo As String = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "Logo", "")
-        Dim LogoCustom As Boolean = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "LogoCustom", "False")
+        Dim Logo As String = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "Logo", "")
+        Dim LogoCustom As Boolean = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "LogoCustom", "False")
         If LogoCustom Then
             For Each Selection As MyComboBoxItem In ComboDisplayLogo.Items
                 If Selection.Tag = Logo OrElse (Selection.Tag = "PCL\Logo.png" AndAlso Logo.EndsWith("PCL\Logo.png")) Then
@@ -59,14 +58,14 @@
             '改为不隐藏
             Try
                 '若设置分类为可安装 Mod,则显示正常的 Mod 管理页面
-                WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", ComboDisplayType.SelectedIndex)
-                PageVersionLeft.Version.DisplayType = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Auto)
-                FrmVersionLeft.RefreshModDisabled()
+                WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "DisplayType", ComboDisplayType.SelectedIndex)
+                PageInstanceLeft.Instance.DisplayType = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "DisplayType", McInstanceCardType.Auto)
+                FrmInstanceLeft.RefreshModDisabled()
 
-                WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
-                LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+                WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") '要求刷新缓存
+                LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
             Catch ex As Exception
-                Log(ex, "修改版本分类失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
+                Log(ex, "修改版本分类失败(" & PageInstanceLeft.Instance.Name & ")", LogLevel.Feedback)
             End Try
             Reload() '更新 “打开 Mod 文件夹” 按钮
         Else
@@ -79,11 +78,11 @@
                     End If
                     Setup.Set("HintHide", True)
                 End If
-                WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "DisplayType", McVersionCardType.Hidden)
-                WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
-                LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+                WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "DisplayType", McInstanceCardType.Hidden)
+                WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") '要求刷新缓存
+                LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
             Catch ex As Exception
-                Log(ex, "隐藏版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Feedback)
+                Log(ex, "隐藏版本 " & PageInstanceLeft.Instance.Name & " 失败", LogLevel.Feedback)
             End Try
         End If
     End Sub
@@ -91,14 +90,14 @@
     '更改描述
     Private Sub BtnDisplayDesc_Click(sender As Object, e As EventArgs) Handles BtnDisplayDesc.Click
         Try
-            Dim OldInfo As String = ReadIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "CustomInfo")
+            Dim OldInfo As String = ReadIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "CustomInfo")
             Dim NewInfo As String = MyMsgBoxInput("更改描述", "修改版本的描述文本,留空则使用 PCL 的默认描述。", OldInfo, New ObjectModel.Collection(Of Validate), "默认描述")
-            If NewInfo IsNot Nothing AndAlso OldInfo <> NewInfo Then WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "CustomInfo", NewInfo)
-            PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
+            If NewInfo IsNot Nothing AndAlso OldInfo <> NewInfo Then WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "CustomInfo", NewInfo)
+            PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load()
             Reload()
-            LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+            LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
         Catch ex As Exception
-            Log(ex, "版本 " & PageVersionLeft.Version.Name & " 描述更改失败", LogLevel.Msgbox)
+            Log(ex, "版本 " & PageInstanceLeft.Instance.Name & " 描述更改失败", LogLevel.Msgbox)
         End Try
     End Sub
 
@@ -106,32 +105,32 @@
     Private Sub BtnDisplayRename_Click(sender As Object, e As EventArgs) Handles BtnDisplayRename.Click
         Try
             '确认输入的新名称
-            Dim OldName As String = PageVersionLeft.Version.Name
-            Dim OldPath As String = PageVersionLeft.Version.Path
+            Dim OldName As String = PageInstanceLeft.Instance.Name
+            Dim OldPath As String = PageInstanceLeft.Instance.PathVersion
             '修改此部分的同时修改快速安装的版本名检测*
             Dim NewName As String = MyMsgBoxInput("重命名版本", "", OldName, New ObjectModel.Collection(Of Validate) From {
-                New ValidateFolderName(PathMcFolder & "versions", IgnoreCase:=False), New ValidateExceptSame(OldName & "_temp", "不能使用该名称!")})
+                New ValidateFolderName(McFolderSelected & "versions", IgnoreCase:=False), New ValidateExceptSame(OldName & "_temp", "不能使用该名称!")})
             If String.IsNullOrWhiteSpace(NewName) Then Return
-            Dim NewPath As String = PathMcFolder & "versions\" & NewName & "\"
+            Dim NewPath As String = McFolderSelected & "versions\" & NewName & "\"
             '获取临时中间名,以防止仅修改大小写的重命名失败
             Dim TempName As String = NewName & "_temp"
-            Dim TempPath As String = PathMcFolder & "versions\" & TempName & "\"
+            Dim TempPath As String = McFolderSelected & "versions\" & TempName & "\"
             Dim OnlyChangedCase As Boolean = NewName.ToLower = OldName.ToLower
             '重新读取版本 JSON 信息,避免 JsonObject 中已被合并的项被重新存储
             Dim JsonObject As JObject
-            Dim OldJsonPath As String = PageVersionLeft.Version.GetJsonPath()
+            Dim OldJsonPath As String = PageInstanceLeft.Instance.GetJsonPath()
             Try
                 JsonObject = GetJson(ReadFile(OldJsonPath))
             Catch ex As Exception
                 Log(ex, "在重命名读取 json 时失败")
-                JsonObject = PageVersionLeft.Version.JsonObject
+                JsonObject = PageInstanceLeft.Instance.JsonObject
             End Try
             '重命名主文件夹
             My.Computer.FileSystem.RenameDirectory(OldPath, TempName)
             My.Computer.FileSystem.RenameDirectory(TempPath, NewName)
             '清理 ini 缓存
-            IniClearCache(PageVersionLeft.Version.PathIndie & "options.txt")
-            IniClearCache(PageVersionLeft.Version.Path & "PCL\Setup.ini")
+            IniClearCache(PageInstanceLeft.Instance.PathIndie & "options.txt")
+            IniClearCache(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini")
             '重命名 jar 文件与 natives 文件夹
             '不能进行遍历重命名,否则在版本名很短的时候容易误伤其他文件(#6443)
             If Directory.Exists($"{NewPath}{OldName}-natives") Then
@@ -157,8 +156,8 @@
                 WriteFile(NewPath & "PCL\Setup.ini", ReadFile(NewPath & "PCL\Setup.ini").Replace(OldPath, NewPath))
             End If
             '更改已选中的版本
-            If ReadIni(PathMcFolder & "PCL.ini", "Version") = OldName Then
-                WriteIni(PathMcFolder & "PCL.ini", "Version", NewName)
+            If ReadIni(McFolderSelected & "PCL.ini", "Version") = OldName Then
+                WriteIni(McFolderSelected & "PCL.ini", "Version", NewName)
             End If
             '更新版本 Json
             Try
@@ -170,10 +169,10 @@
             End Try
             '刷新与提示
             Hint("重命名成功!", HintType.Green)
-            PageVersionLeft.Version = New McVersion(NewName).Load()
-            If Not IsNothing(McVersionCurrent) AndAlso McVersionCurrent.Equals(PageVersionLeft.Version) Then WriteIni(PathMcFolder & "PCL.ini", "Version", NewName)
+            PageInstanceLeft.Instance = New McInstance(NewName).Load()
+            If Not IsNothing(McInstanceSelected) AndAlso McInstanceSelected.Equals(PageInstanceLeft.Instance) Then WriteIni(McFolderSelected & "PCL.ini", "Version", NewName)
             Reload()
-            LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+            LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
         Catch ex As Exception
             Log(ex, "重命名版本失败", LogLevel.Msgbox)
         End Try
@@ -190,38 +189,38 @@
                     Reload() '还原选项
                     Return
                 End If
-                CopyFile(FileName, PageVersionLeft.Version.Path & "PCL\Logo.png")
+                CopyFile(FileName, PageInstanceLeft.Instance.PathVersion & "PCL\Logo.png")
             Else
-                File.Delete(PageVersionLeft.Version.Path & "PCL\Logo.png")
+                File.Delete(PageInstanceLeft.Instance.PathVersion & "PCL\Logo.png")
             End If
         Catch ex As Exception
-            Log(ex, "更改自定义版本图标失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
+            Log(ex, "更改自定义版本图标失败(" & PageInstanceLeft.Instance.Name & ")", LogLevel.Feedback)
         End Try
         '进行更改
         Try
             Dim NewLogo As String = ComboDisplayLogo.SelectedItem.Tag
-            WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "Logo", NewLogo)
-            WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "LogoCustom", Not NewLogo = "")
+            WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "Logo", NewLogo)
+            WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "LogoCustom", Not NewLogo = "")
             '刷新显示
-            WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "") '要求刷新缓存
-            PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
+            WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "") '要求刷新缓存
+            PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load()
             Reload()
-            LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+            LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
         Catch ex As Exception
-            Log(ex, "更改版本图标失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Feedback)
+            Log(ex, "更改版本图标失败(" & PageInstanceLeft.Instance.Name & ")", LogLevel.Feedback)
         End Try
     End Sub
 
     '收藏夹
     Private Sub BtnDisplayStar_Click(sender As Object, e As EventArgs) Handles BtnDisplayStar.Click
         Try
-            WriteIni(PageVersionLeft.Version.Path & "PCL\Setup.ini", "IsStar", Not PageVersionLeft.Version.IsStar)
-            PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
+            WriteIni(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini", "IsStar", Not PageInstanceLeft.Instance.IsStar)
+            PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load()
             Reload()
-            McVersionListForceRefresh = True
-            LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+            McInstanceListForceRefresh = True
+            LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
         Catch ex As Exception
-            Log(ex, "版本 " & PageVersionLeft.Version.Name & " 收藏状态更改失败", LogLevel.Msgbox)
+            Log(ex, "版本 " & PageInstanceLeft.Instance.Name & " 收藏状态更改失败", LogLevel.Msgbox)
         End Try
     End Sub
 
@@ -231,22 +230,22 @@
 
     '版本文件夹
     Private Sub BtnFolderVersion_Click() Handles BtnFolderVersion.Click
-        OpenVersionFolder(PageVersionLeft.Version)
+        OpenInstanceFolder(PageInstanceLeft.Instance)
     End Sub
-    Public Shared Sub OpenVersionFolder(Version As McVersion)
-        OpenExplorer(Version.Path)
+    Public Shared Sub OpenInstanceFolder(Instance As McInstance)
+        OpenExplorer(Instance.PathVersion)
     End Sub
 
     '存档文件夹
     Private Sub BtnFolderSaves_Click() Handles BtnFolderSaves.Click
-        Dim FolderPath As String = PageVersionLeft.Version.PathIndie & "saves\"
+        Dim FolderPath As String = PageInstanceLeft.Instance.PathIndie & "saves\"
         Directory.CreateDirectory(FolderPath)
         OpenExplorer(FolderPath)
     End Sub
 
     'Mod 文件夹
     Private Sub BtnFolderMods_Click() Handles BtnFolderMods.Click
-        Dim FolderPath As String = PageVersionLeft.Version.PathIndie & "mods\"
+        Dim FolderPath As String = PageInstanceLeft.Instance.PathIndie & "mods\"
         Directory.CreateDirectory(FolderPath)
         OpenExplorer(FolderPath)
     End Sub
@@ -259,7 +258,7 @@
     Private Sub BtnManageScript_Click() Handles BtnManageScript.Click
         Try
             '弹窗要求指定脚本的保存位置
-            Dim SavePath As String = SelectSaveFile("选择脚本保存位置", "启动 " & PageVersionLeft.Version.Name & ".bat", "批处理文件(*.bat)|*.bat")
+            Dim SavePath As String = SelectSaveFile("选择脚本保存位置", "启动 " & PageInstanceLeft.Instance.Name & ".bat", "批处理文件(*.bat)|*.bat")
             If SavePath = "" Then Return
             '检查中断(等玩家选完弹窗指不定任务就结束了呢……)
             If McLaunchLoader.State = LoadState.Loading Then
@@ -267,7 +266,7 @@
                 Return
             End If
             '生成脚本
-            If McLaunchStart(New McLaunchOptions With {.SaveBatch = SavePath, .Version = PageVersionLeft.Version}) Then
+            If McLaunchStart(New McLaunchOptions With {.SaveBatch = SavePath, .Instance = PageInstanceLeft.Instance}) Then
                 If Setup.Get("LoginType") = McLoginType.Legacy Then
                     Hint("正在导出启动脚本……")
                 Else
@@ -275,7 +274,7 @@
                 End If
             End If
         Catch ex As Exception
-            Log(ex, "导出启动脚本失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Msgbox)
+            Log(ex, "导出启动脚本失败(" & PageInstanceLeft.Instance.Name & ")", LogLevel.Msgbox)
         End Try
     End Sub
 
@@ -283,18 +282,18 @@
     Private Sub BtnManageCheck_Click(sender As Object, e As EventArgs) Handles BtnManageCheck.Click
         Try
             '忽略文件检查提示
-            If ShouldIgnoreFileCheck(PageVersionLeft.Version) Then
+            If ShouldIgnoreFileCheck(PageInstanceLeft.Instance) Then
                 Hint("请先关闭 [版本设置 → 设置 → 高级启动选项 → 关闭文件校验],然后再尝试补全文件!", HintType.Blue)
                 Return
             End If
             '重复任务检查
             For Each OngoingLoader In LoaderTaskbar
-                If OngoingLoader.Name <> PageVersionLeft.Version.Name & " 文件补全" Then Continue For
+                If OngoingLoader.Name <> PageInstanceLeft.Instance.Name & " 文件补全" Then Continue For
                 Hint("正在处理中,请稍候!", HintType.Red)
                 Return
             Next
             '启动
-            Dim Loader As New LoaderCombo(Of String)(PageVersionLeft.Version.Name & " 文件补全", DlClientFix(PageVersionLeft.Version, True, AssetsIndexExistsBehaviour.AlwaysDownload))
+            Dim Loader As New LoaderCombo(Of String)(PageInstanceLeft.Instance.Name & " 文件补全", DlClientFix(PageInstanceLeft.Instance, True, AssetsIndexExistsBehaviour.AlwaysDownload))
             Loader.OnStateChanged =
             Sub()
                 Select Case Loader.State
@@ -306,12 +305,12 @@
                         Hint(Loader.Name & "已取消!", HintType.Blue)
                 End Select
             End Sub
-            Loader.Start(PageVersionLeft.Version.Name)
+            Loader.Start(PageInstanceLeft.Instance.Name)
             LoaderTaskbarAdd(Loader)
             FrmMain.BtnExtraDownload.ShowRefresh()
             FrmMain.BtnExtraDownload.Ribble()
         Catch ex As Exception
-            Log(ex, "尝试补全文件失败(" & PageVersionLeft.Version.Name & ")", LogLevel.Msgbox)
+            Log(ex, "尝试补全文件失败(" & PageInstanceLeft.Instance.Name & ")", LogLevel.Msgbox)
         End Try
     End Sub
 
@@ -320,29 +319,28 @@
     Private Sub BtnManageDelete_Click(sender As Object, e As EventArgs) Handles BtnManageDelete.Click
         Try
             Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown
-            Dim IsHintIndie As Boolean = PageVersionLeft.Version.State <> McVersionState.Error AndAlso PageVersionLeft.Version.PathIndie <> PathMcFolder
-            Select Case MyMsgBox($"你确定要{If(IsShiftPressed, "永久", "")}删除版本 {PageVersionLeft.Version.Name} 吗?" &
+            Dim IsHintIndie As Boolean = PageInstanceLeft.Instance.State <> McInstanceState.Error AndAlso PageInstanceLeft.Instance.PathIndie <> McFolderSelected
+            Select Case MyMsgBox($"你确定要{If(IsShiftPressed, "永久", "")}删除版本 {PageInstanceLeft.Instance.Name} 吗?" &
                         If(IsHintIndie, vbCrLf & "由于该版本开启了版本隔离,删除版本时该版本对应的存档、资源包、Mod 等文件也将被一并删除!", ""),
                         "版本删除确认", , "取消",, IsHintIndie OrElse IsShiftPressed)
                 Case 1
-                    IniClearCache(PageVersionLeft.Version.PathIndie & "options.txt")
-                    IniClearCache(PageVersionLeft.Version.Path & "PCL\Setup.ini")
+                    IniClearCache(PageInstanceLeft.Instance.PathIndie & "options.txt")
+                    IniClearCache(PageInstanceLeft.Instance.PathVersion & "PCL\Setup.ini")
                     If IsShiftPressed Then
-                        DeleteDirectory(PageVersionLeft.Version.Path)
-                        Hint("版本 " & PageVersionLeft.Version.Name & " 已永久删除!", HintType.Green)
+                        DeleteDirectory(PageInstanceLeft.Instance.PathVersion)
                     Else
-                        FileIO.FileSystem.DeleteDirectory(PageVersionLeft.Version.Path, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
-                        Hint("版本 " & PageVersionLeft.Version.Name & " 已删除到回收站!", HintType.Green)
+                        FileIO.FileSystem.DeleteDirectory(PageInstanceLeft.Instance.PathVersion, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
                     End If
+                    Hint("已删除版本 " & PageInstanceLeft.Instance.Name & "!", HintType.Green)
                 Case 2
                     Return
             End Select
-            LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+            LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
             FrmMain.PageBack()
         Catch ex As OperationCanceledException
-            Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 被主动取消")
+            Log(ex, "删除版本 " & PageInstanceLeft.Instance.Name & " 被主动取消")
         Catch ex As Exception
-            Log(ex, "删除版本 " & PageVersionLeft.Version.Name & " 失败", LogLevel.Msgbox)
+            Log(ex, "删除版本 " & PageInstanceLeft.Instance.Name & " 失败", LogLevel.Msgbox)
         End Try
     End Sub
 

+ 1 - 1
Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml

@@ -3,7 +3,7 @@
     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" 
     xmlns:System="clr-namespace:System;assembly=mscorlib" 
-    mc:Ignorable="d" x:Class="PageVersionSetup"
+    mc:Ignorable="d" x:Class="PageInstanceSetup"
     PanScroll="PanBack">
     <local:MyScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" x:Name="PanBack">
         <StackPanel x:Name="PanMain" Margin="25,25,25,25">

+ 73 - 73
Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb → Plain Craft Launcher 2/Pages/PageInstance/PageInstanceSetup.xaml.vb

@@ -1,4 +1,4 @@
-Public Class PageVersionSetup
+Public Class PageInstanceSetup
 
     Private Shadows IsLoaded As Boolean = False
 
@@ -27,41 +27,41 @@
         Try
 
             '启动参数
-            TextArgumentTitle.Text = Setup.Get("VersionArgumentTitle", Version:=PageVersionLeft.Version)
-            TextArgumentInfo.Text = Setup.Get("VersionArgumentInfo", Version:=PageVersionLeft.Version)
-            Dim _unused = PageVersionLeft.Version.PathIndie '触发自动判定
-            ComboArgumentIndieV2.SelectedIndex = If(Setup.Get("VersionArgumentIndieV2", Version:=PageVersionLeft.Version), 0, 1)
+            TextArgumentTitle.Text = Setup.Get("VersionArgumentTitle", Instance:=PageInstanceLeft.Instance)
+            TextArgumentInfo.Text = Setup.Get("VersionArgumentInfo", Instance:=PageInstanceLeft.Instance)
+            Dim _unused = PageInstanceLeft.Instance.PathIndie '触发自动判定
+            ComboArgumentIndieV2.SelectedIndex = If(Setup.Get("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance), 0, 1)
             RefreshJavaComboBox()
 
             '游戏内存
-            CType(FindName("RadioRamType" & Setup.Load("VersionRamType", Version:=PageVersionLeft.Version)), MyRadioBox).Checked = True
-            SliderRamCustom.Value = Setup.Get("VersionRamCustom", Version:=PageVersionLeft.Version)
-            ComboRamOptimize.SelectedIndex = Setup.Get("VersionRamOptimize", Version:=PageVersionLeft.Version)
+            CType(FindName("RadioRamType" & Setup.Load("VersionRamType", Instance:=PageInstanceLeft.Instance)), MyRadioBox).Checked = True
+            SliderRamCustom.Value = Setup.Get("VersionRamCustom", Instance:=PageInstanceLeft.Instance)
+            ComboRamOptimize.SelectedIndex = Setup.Get("VersionRamOptimize", Instance:=PageInstanceLeft.Instance)
 
             '服务器
-            TextServerEnter.Text = Setup.Get("VersionServerEnter", Version:=PageVersionLeft.Version)
-            ComboServerLogin.SelectedIndex = Setup.Get("VersionServerLogin", Version:=PageVersionLeft.Version)
+            TextServerEnter.Text = Setup.Get("VersionServerEnter", Instance:=PageInstanceLeft.Instance)
+            ComboServerLogin.SelectedIndex = Setup.Get("VersionServerLogin", Instance:=PageInstanceLeft.Instance)
             ComboServerLoginLast = ComboServerLogin.SelectedIndex
             ServerLogin(ComboServerLogin.SelectedIndex)
-            TextServerNide.Text = Setup.Get("VersionServerNide", Version:=PageVersionLeft.Version)
-            TextServerAuthServer.Text = Setup.Get("VersionServerAuthServer", Version:=PageVersionLeft.Version)
-            TextServerAuthName.Text = Setup.Get("VersionServerAuthName", Version:=PageVersionLeft.Version)
-            TextServerAuthRegister.Text = Setup.Get("VersionServerAuthRegister", Version:=PageVersionLeft.Version)
+            TextServerNide.Text = Setup.Get("VersionServerNide", Instance:=PageInstanceLeft.Instance)
+            TextServerAuthServer.Text = Setup.Get("VersionServerAuthServer", Instance:=PageInstanceLeft.Instance)
+            TextServerAuthName.Text = Setup.Get("VersionServerAuthName", Instance:=PageInstanceLeft.Instance)
+            TextServerAuthRegister.Text = Setup.Get("VersionServerAuthRegister", Instance:=PageInstanceLeft.Instance)
 
             '高级设置
-            TextAdvanceJvm.Text = Setup.Get("VersionAdvanceJvm", Version:=PageVersionLeft.Version)
-            TextAdvanceGame.Text = Setup.Get("VersionAdvanceGame", Version:=PageVersionLeft.Version)
-            TextAdvanceRun.Text = Setup.Get("VersionAdvanceRun", Version:=PageVersionLeft.Version)
-            CheckAdvanceRunWait.Checked = Setup.Get("VersionAdvanceRunWait", Version:=PageVersionLeft.Version)
-            If Setup.Get("VersionAdvanceAssets", Version:=PageVersionLeft.Version) = 2 Then
+            TextAdvanceJvm.Text = Setup.Get("VersionAdvanceJvm", Instance:=PageInstanceLeft.Instance)
+            TextAdvanceGame.Text = Setup.Get("VersionAdvanceGame", Instance:=PageInstanceLeft.Instance)
+            TextAdvanceRun.Text = Setup.Get("VersionAdvanceRun", Instance:=PageInstanceLeft.Instance)
+            CheckAdvanceRunWait.Checked = Setup.Get("VersionAdvanceRunWait", Instance:=PageInstanceLeft.Instance)
+            If Setup.Get("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance) = 2 Then
                 Log("[Setup] 已迁移老版本的关闭文件校验设置")
-                Setup.Reset("VersionAdvanceAssets", Version:=PageVersionLeft.Version)
-                Setup.Set("VersionAdvanceAssetsV2", True, Version:=PageVersionLeft.Version)
+                Setup.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance)
+                Setup.Set("VersionAdvanceAssetsV2", True, Instance:=PageInstanceLeft.Instance)
             End If
-            CheckAdvanceAssetsV2.Checked = Setup.Get("VersionAdvanceAssetsV2", Version:=PageVersionLeft.Version)
-            CheckAdvanceJava.Checked = Setup.Get("VersionAdvanceJava", Version:=PageVersionLeft.Version)
-            CheckAdvanceDisableJLW.Checked = Setup.Get("VersionAdvanceDisableJLW", Version:=PageVersionLeft.Version)
-            CheckAdvanceDisableModUpdate.Checked = Setup.Get("VersionAdvanceDisableModUpdate", Version:=PageVersionLeft.Version)
+            CheckAdvanceAssetsV2.Checked = Setup.Get("VersionAdvanceAssetsV2", Instance:=PageInstanceLeft.Instance)
+            CheckAdvanceJava.Checked = Setup.Get("VersionAdvanceJava", Instance:=PageInstanceLeft.Instance)
+            CheckAdvanceDisableJLW.Checked = Setup.Get("VersionAdvanceDisableJLW", Instance:=PageInstanceLeft.Instance)
+            CheckAdvanceDisableModUpdate.Checked = Setup.Get("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance)
 
         Catch ex As Exception
             Log(ex, "重载版本独立设置时出错", LogLevel.Feedback)
@@ -72,29 +72,29 @@
     Public Sub Reset()
         Try
 
-            Setup.Reset("VersionServerEnter", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionServerLogin", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionServerNide", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionServerAuthServer", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionServerAuthRegister", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionServerAuthName", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionArgumentTitle", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionArgumentInfo", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionArgumentIndieV2", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionRamType", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionRamCustom", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionRamOptimize", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionAdvanceJvm", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionAdvanceGame", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionAdvanceAssets", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionAdvanceAssetsV2", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionAdvanceJava", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionAdvanceRun", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionAdvanceRunWait", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionAdvanceDisableJLW", Version:=PageVersionLeft.Version)
-            Setup.Reset("VersionAdvanceDisableModUpdate", Version:=PageVersionLeft.Version)
-
-            Setup.Reset("VersionArgumentJavaSelect", Version:=PageVersionLeft.Version)
+            Setup.Reset("VersionServerEnter", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionServerLogin", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionServerNide", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionServerAuthServer", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionServerAuthRegister", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionServerAuthName", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionArgumentTitle", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionArgumentInfo", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionArgumentIndieV2", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionRamType", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionRamCustom", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionRamOptimize", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionAdvanceJvm", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionAdvanceGame", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionAdvanceAssets", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionAdvanceAssetsV2", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionAdvanceJava", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionAdvanceRun", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionAdvanceRunWait", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionAdvanceDisableJLW", Instance:=PageInstanceLeft.Instance)
+            Setup.Reset("VersionAdvanceDisableModUpdate", Instance:=PageInstanceLeft.Instance)
+
+            Setup.Reset("VersionArgumentJavaSelect", Instance:=PageInstanceLeft.Instance)
             JavaSearchLoader.Start(IsForceRestart:=True)
 
             Log("[Setup] 已初始化版本独立设置")
@@ -108,27 +108,27 @@
 
     '将控件改变路由到设置改变
     Private Shared Sub RadioBoxChange(sender As MyRadioBox, e As Object) Handles RadioRamType0.Check, RadioRamType1.Check, RadioRamType2.Check
-        If AniControlEnabled = 0 Then Setup.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1)), Version:=PageVersionLeft.Version)
+        If AniControlEnabled = 0 Then Setup.Set(sender.Tag.ToString.Split("/")(0), Val(sender.Tag.ToString.Split("/")(1)), Instance:=PageInstanceLeft.Instance)
     End Sub
     Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextServerEnter.ValidatedTextChanged, TextArgumentInfo.ValidatedTextChanged, TextAdvanceGame.ValidatedTextChanged, TextAdvanceJvm.ValidatedTextChanged, TextServerNide.ValidatedTextChanged, TextServerAuthName.ValidatedTextChanged, TextServerAuthRegister.ValidatedTextChanged, TextServerAuthServer.ValidatedTextChanged, TextArgumentTitle.ValidatedTextChanged, TextAdvanceRun.ValidatedTextChanged
         If AniControlEnabled = 0 Then
             '#3194,不能删减 /
             'Dim HandledText As String = sender.Text
             'If sender.Tag = "VersionServerAuthServer" OrElse sender.Tag = "VersionServerAuthRegister" Then HandledText = HandledText.TrimEnd("/")
-            Setup.Set(sender.Tag, sender.Text, Version:=PageVersionLeft.Version)
+            Setup.Set(sender.Tag, sender.Text, Instance:=PageInstanceLeft.Instance)
         End If
     End Sub
     Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderRamCustom.Change
-        If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value, Version:=PageVersionLeft.Version)
+        If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value, Instance:=PageInstanceLeft.Instance)
     End Sub
     Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboRamOptimize.SelectionChanged
-        If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex, Version:=PageVersionLeft.Version)
+        If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex, Instance:=PageInstanceLeft.Instance)
     End Sub
     Private Shared Sub CheckBoxLikeComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndieV2.SelectionChanged
-        If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex = 0, Version:=PageVersionLeft.Version)
+        If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex = 0, Instance:=PageInstanceLeft.Instance)
     End Sub
     Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceRunWait.Change, CheckAdvanceAssetsV2.Change, CheckAdvanceJava.Change, CheckAdvanceDisableJLW.Change, CheckAdvanceDisableModUpdate.Change
-        If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked, Version:=PageVersionLeft.Version)
+        If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked, Instance:=PageInstanceLeft.Instance)
     End Sub
 
 #Region "游戏内存"
@@ -142,9 +142,9 @@
     ''' 刷新 UI 上的 RAM 显示。
     ''' </summary>
     Public Sub RefreshRam(ShowAnim As Boolean)
-        If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.VersionSetup OrElse FrmVersionLeft.PageID <> FormMain.PageSubType.VersionSetup Then Return
+        If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.InstanceSetup OrElse FrmInstanceLeft.PageID <> FormMain.PageSubType.InstanceSetup Then Return
         '获取内存情况
-        Dim RamGame As Double = Math.Round(GetRam(PageVersionLeft.Version), 5)
+        Dim RamGame As Double = Math.Round(GetRam(PageInstanceLeft.Instance), 5)
         Dim RamTotal As Double = Math.Round(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024 / 1024, 1)
         Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024, 1)
         Dim RamGameActual As Double = Math.Round(Math.Min(RamGame, RamAvailable), 5)
@@ -165,7 +165,7 @@
                           If(RamGame <> RamGameActual, " (可用 " & If(RamGameActual = Math.Floor(RamGameActual), RamGameActual & ".0", RamGameActual) & " GB)", "")
         LabRamUsed.Text = If(RamUsed = Math.Floor(RamUsed), RamUsed & ".0", RamUsed) & " GB"
         LabRamTotal.Text = " / " & If(RamTotal = Math.Floor(RamTotal), RamTotal & ".0", RamTotal) & " GB"
-        LabRamWarn.Visibility = If(RamGame = 1 AndAlso Not JavaIs64Bit(PageVersionLeft.Version) AndAlso Not Is32BitSystem AndAlso JavaList.Any, Visibility.Visible, Visibility.Collapsed)
+        LabRamWarn.Visibility = If(RamGame = 1 AndAlso Not JavaIs64Bit(PageInstanceLeft.Instance) AndAlso Not Is32BitSystem AndAlso JavaList.Any, Visibility.Visible, Visibility.Collapsed)
         If ShowAnim Then
             '宽度动画
             AniStart({
@@ -269,10 +269,10 @@
     ''' <summary>
     ''' 获取当前设置的 RAM 值。单位为 GB。
     ''' </summary>
-    Public Shared Function GetRam(Version As McVersion, Optional Is32BitJava As Boolean? = Nothing) As Double
+    Public Shared Function GetRam(Instance As McInstance, Optional Is32BitJava As Boolean? = Nothing) As Double
         '跟随全局设置
-        If Setup.Get("VersionRamType", Version:=Version) = 2 Then
-            Return PageSetupLaunch.GetRam(Version, True, Is32BitJava)
+        If Setup.Get("VersionRamType", Instance:=Instance) = 2 Then
+            Return PageSetupLaunch.GetRam(Instance, True, Is32BitJava)
         End If
 
         '------------------------------------------
@@ -281,7 +281,7 @@
 
         '使用当前版本的设置
         Dim RamGive As Double
-        If Setup.Get("VersionRamType", Version:=Version) = 0 Then
+        If Setup.Get("VersionRamType", Instance:=Instance) = 0 Then
             '自动配置
             Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024 * 10) / 10
             '确定需求的内存值
@@ -289,16 +289,16 @@
             Dim RamTarget1 As Double '估计能勉强带动了的内存
             Dim RamTarget2 As Double '估计没啥问题了的内存
             Dim RamTarget3 As Double '安装过多附加组件需要的内存
-            If Version IsNot Nothing AndAlso Not Version.IsLoaded Then Version.Load()
-            If Version IsNot Nothing AndAlso Version.Modable Then
+            If Instance IsNot Nothing AndAlso Not Instance.IsLoaded Then Instance.Load()
+            If Instance IsNot Nothing AndAlso Instance.Modable Then
                 '可安装 Mod 的版本
-                Dim ModDir As New DirectoryInfo(Version.PathIndie & "mods\")
+                Dim ModDir As New DirectoryInfo(Instance.PathIndie & "mods\")
                 Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Length, 0)
                 RamMininum = 0.5 + ModCount / 150
                 RamTarget1 = 1.5 + ModCount / 90
                 RamTarget2 = 2.7 + ModCount / 50
                 RamTarget3 = 4.5 + ModCount / 25
-            ElseIf Version IsNot Nothing AndAlso Version.Version.HasOptiFine Then
+            ElseIf Instance IsNot Nothing AndAlso Instance.Version.HasOptiFine Then
                 'OptiFine 版本
                 RamMininum = 0.5
                 RamTarget1 = 1.5
@@ -337,7 +337,7 @@ PreFin:
             RamGive = Math.Round(Math.Max(RamGive, RamMininum), 1)
         Else
             '手动配置
-            Dim Value As Integer = Setup.Get("VersionRamCustom", Version:=Version)
+            Dim Value As Integer = Setup.Get("VersionRamCustom", Instance:=Instance)
             If Value <= 12 Then
                 RamGive = Value * 0.1 + 0.3
             ElseIf Value <= 25 Then
@@ -349,7 +349,7 @@ PreFin:
             End If
         End If
         '若使用 32 位 Java,则限制为 1G
-        If If(Is32BitJava, Not JavaIs64Bit(PageVersionLeft.Version)) Then RamGive = Math.Min(1, RamGive)
+        If If(Is32BitJava, Not JavaIs64Bit(PageInstanceLeft.Instance)) Then RamGive = Math.Min(1, RamGive)
         Return RamGive
     End Function
 
@@ -423,9 +423,9 @@ PreFin:
         ComboArgumentJava.Items.Add(New MyComboBoxItem With {.Content = "自动选择合适的 Java", .Tag = "自动选择"})
         '更新列表
         Dim SelectedItem As MyComboBoxItem = Nothing
-        Dim SelectedBySetup As String = Setup.Get("VersionArgumentJavaSelect", Version:=PageVersionLeft.Version)
+        Dim SelectedBySetup As String = Setup.Get("VersionArgumentJavaSelect", Instance:=PageInstanceLeft.Instance)
         Try
-            For Each Java In JavaList.Clone().OrderByDescending(Function(v) v.VersionCode)
+            For Each Java In JavaList.Clone().OrderByDescending(Function(v) v.MajorVersion)
                 Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
                 ToolTipService.SetHorizontalOffset(ListItem, 400)
                 ComboArgumentJava.Items.Add(ListItem)
@@ -434,7 +434,7 @@ PreFin:
                 If JavaEntry.FromJson(GetJson(SelectedBySetup)).PathFolder = Java.PathFolder Then SelectedItem = ListItem
             Next
         Catch ex As Exception
-            Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Version:=PageVersionLeft.Version)
+            Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=PageInstanceLeft.Instance)
             Log(ex, "更新版本设置 Java 下拉框失败", LogLevel.Feedback)
         End Try
         '更新选择项
@@ -469,15 +469,15 @@ PreFin:
         Dim SelectedJava = ComboArgumentJava.SelectedItem.Tag
         If "使用全局设置".Equals(SelectedJava) Then
             '选择 “自动”
-            Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Version:=PageVersionLeft.Version)
+            Setup.Set("VersionArgumentJavaSelect", "使用全局设置", Instance:=PageInstanceLeft.Instance)
             Log("[Java] 修改版本 Java 选择设置:跟随全局设置")
         ElseIf "自动选择".Equals(SelectedJava) Then
             '选择 “自动”
-            Setup.Set("VersionArgumentJavaSelect", "", Version:=PageVersionLeft.Version)
+            Setup.Set("VersionArgumentJavaSelect", "", Instance:=PageInstanceLeft.Instance)
             Log("[Java] 修改版本 Java 选择设置:自动选择")
         Else
             '选择指定项
-            Setup.Set("VersionArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None), Version:=PageVersionLeft.Version)
+            Setup.Set("VersionArgumentJavaSelect", CType(SelectedJava.ToJson(), JObject).ToString(Newtonsoft.Json.Formatting.None), Instance:=PageInstanceLeft.Instance)
             Log("[Java] 修改版本 Java 选择设置:" & SelectedJava.ToString)
         End If
         RefreshRam(True)

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

@@ -178,7 +178,7 @@
             Try
                 '更新缓存
                 WriteIni(PathTemp & "Cache\Skin\IndexMs.ini", Setup.Get("CacheMsV2Uuid"), SkinAddress)
-                Log(String.Format("[Skin] 已写入皮肤地址缓存 {0} -> {1}", Setup.Get("CacheMsV2Uuid"), SkinAddress))
+                Log($"[Skin] 已写入皮肤地址缓存 {Setup.Get("CacheMsV2Uuid")} -> {SkinAddress}")
                 '刷新控件
                 For Each SkinLoader In {PageLaunchLeft.SkinMs, PageLaunchLeft.SkinLegacy}
                     SkinLoader.WaitForExit(IsForceRestart:=True)
@@ -244,13 +244,13 @@ Retry:
                             {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"},
                             {"Follower's", "追随者披风"}, {"MCC 15th Year", "MCC 15 周年披风"}, {"Minecraft Experience", "村民救援披风"},
                             {"Mojang Office", "Mojang 办公室披风"}, {"Home", "家园披风"}, {"Menace", "入侵披风"}, {"Yearn", "渴望披风"},
-                            {"Common", "普通披风"}, {"Pan", "薄煎饼披风"}, {"Founder's", "创始人披风"}, {"Copper", "铜披风"}
+                            {"Common", "普通披风"}, {"Pan", "薄煎饼披风"}, {"Founder's", "创始人披风"}, {"Copper", "铜披风"}, {"Zombie Horse", "僵尸马披风"}
                         }
                         Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}}
                         For Each Cape In SkinData("capes")
                             Dim CapeName As String = Cape("alias").ToString
                             If CapeNames.ContainsKey(CapeName) Then CapeName = CapeNames(CapeName)
-                            SelectionControl.Add(New MyRadioBox With {.Text = CapeName, .Checked = (Cape("state") = "ACTIVE")})
+                            SelectionControl.Add(New MyRadioBox With {.Text = CapeName, .Checked = Cape("state")?.ToString = "ACTIVE"})
                         Next
                         SelId = MyMsgBoxSelect(SelectionControl, "选择披风", "确定", "取消")
                     Catch ex As Exception

+ 68 - 69
Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb

@@ -14,7 +14,7 @@
         AniControlEnabled += 1
 
         '开始按钮
-        AddHandler McVersionListLoader.LoadingStateChanged, AddressOf RefreshButtonsUI
+        AddHandler McInstanceListLoader.LoadingStateChanged, AddressOf RefreshButtonsUI
         AddHandler McFolderListLoader.LoadingStateChanged, AddressOf RefreshButtonsUI
         RefreshButtonsUI()
 
@@ -37,18 +37,18 @@
                 McFolderListLoader.WaitForExit()
             End If
             '确认 Minecraft 文件夹存在
-            PathMcFolder = Setup.Get("LaunchFolderSelect").ToString.Replace("$", Path)
-            If PathMcFolder = "" OrElse Not Directory.Exists(PathMcFolder) Then
+            McFolderSelected = Setup.Get("LaunchFolderSelect").ToString.Replace("$", Path)
+            If McFolderSelected = "" OrElse Not Directory.Exists(McFolderSelected) Then
                 '无效的文件夹
-                If PathMcFolder = "" Then
+                If McFolderSelected = "" Then
                     Log("[Launch] 没有已储存的 Minecraft 文件夹")
                 Else
-                    Log("[Launch] Minecraft 文件夹无效,该文件夹已不存在:" & PathMcFolder, LogLevel.Debug)
+                    Log("[Launch] Minecraft 文件夹无效,该文件夹已不存在:" & McFolderSelected, LogLevel.Debug)
                 End If
                 McFolderListLoader.WaitForExit(IsForceRestart:=True)
-                Setup.Set("LaunchFolderSelect", McFolderList(0).Path.Replace(Path, "$"))
+                Setup.Set("LaunchFolderSelect", McFolderList(0).Location.Replace(Path, "$"))
             End If
-            Log("[Launch] Minecraft 文件夹:" & PathMcFolder)
+            Log("[Launch] Minecraft 文件夹:" & McFolderSelected)
             If Setup.Get("SystemDebugDelay") Then Thread.Sleep(RandomInteger(500, 3000))
             '自动整合包安装
             If PackInstallPath IsNot Nothing Then
@@ -68,24 +68,24 @@
             End If
             '确认 Minecraft 版本存在
             Dim Selection As String = Setup.Get("LaunchVersionSelect")
-            Dim Version As McVersion = If(Selection = "", Nothing, New McVersion(Selection))
-            If Version Is Nothing OrElse Not Version.Path.StartsWithF(PathMcFolder) OrElse Not Version.Check() Then
+            Dim Instance As McInstance = If(Selection = "", Nothing, New McInstance(Selection))
+            If Instance Is Nothing OrElse Not Instance.PathVersion.StartsWithF(McFolderSelected) OrElse Not Instance.Check() Then
                 '无效的版本
-                Log("[Launch] 当前选择的 Minecraft 版本无效:" & If(Version Is Nothing, "null", Version.Path), If(IsNothing(Version), LogLevel.Normal, LogLevel.Debug))
-                If Not McVersionListLoader.State = LoadState.Finished Then LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True)
-                If Not McVersionList.Any() OrElse McVersionList.First.Value(0).Logo.Contains("RedstoneBlock") Then
-                    Version = Nothing
+                Log("[Launch] 当前选择的 Minecraft 版本无效:" & If(Instance Is Nothing, "null", Instance.PathVersion), If(IsNothing(Instance), LogLevel.Normal, LogLevel.Debug))
+                If Not McInstanceListLoader.State = LoadState.Finished Then LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\", WaitForExit:=True)
+                If Not McInstanceList.Any() OrElse McInstanceList.First.Value(0).Logo.Contains("RedstoneBlock") Then
+                    Instance = Nothing
                     Setup.Set("LaunchVersionSelect", "")
                     Log("[Launch] 无可用 Minecraft 版本")
                 Else
-                    Version = McVersionList.First.Value(0)
-                    Setup.Set("LaunchVersionSelect", Version.Name)
-                    Log("[Launch] 自动选择 Minecraft 版本:" & Version.Path)
+                    Instance = McInstanceList.First.Value(0)
+                    Setup.Set("LaunchVersionSelect", Instance.Name)
+                    Log("[Launch] 自动选择 Minecraft 版本:" & Instance.PathVersion)
                 End If
             End If
             RunInUi(
             Sub()
-                McVersionCurrent = Version '绕这一圈是为了避免 McVersionCheck 触发第二次版本改变
+                McInstanceSelected = Instance '绕这一圈是为了避免 McVersionCheck 触发第二次版本改变
                 IsLoadFinished = True
                 RefreshButtonsUI()
                 RefreshPage(False, False) '有可能选择的版本变化了,需要重新刷新
@@ -119,7 +119,7 @@
                 LabLaunchingMethod.Text = "Authlib-Injector"
         End Select
         '初始化页面
-        LabLaunchingName.Text = McVersionCurrent.Name
+        LabLaunchingName.Text = McInstanceSelected.Name
         LabLaunchingStage.Text = "初始化"
         LabLaunchingTitle.Text = If(CurrentLaunchOptions?.SaveBatch Is Nothing, "正在启动游戏", "正在导出启动脚本")
         LabLaunchingProgress.Text = "0.00 %"
@@ -278,9 +278,9 @@
         '获取页面的可用种类并回写缓存
         Dim Type As PageType
         Dim LoginPageType As Integer
-        If McVersionCurrent IsNot Nothing Then
-            LoginPageType = Setup.Get("VersionServerLogin", Version:=McVersionCurrent)
-            '缓存当前版本的页面种类,下一次打开 McVersionCurrent 为空时才能加载出正确的页面
+        If McInstanceSelected IsNot Nothing Then
+            LoginPageType = Setup.Get("VersionServerLogin", Instance:=McInstanceSelected)
+            '缓存当前版本的页面种类,下一次打开 McInstanceSelected 为空时才能加载出正确的页面
             Setup.Set("LoginPageType", LoginPageType)
         Else
             LoginPageType = Setup.Get("LoginPageType")
@@ -344,7 +344,7 @@ UnknownType:
                 PanType.Visibility = Visibility.Collapsed
                 PanTypeOne.Visibility = Visibility.Visible
                 PathTypeOne.Data = (New GeometryConverter).ConvertFromString(Logo.IconButtonCard)
-                LabTypeOne.Text = If(McVersionCurrent Is Nothing, Setup.Get("CacheAuthServerName"), Setup.Get("VersionServerAuthName", Version:=McVersionCurrent))
+                LabTypeOne.Text = If(McInstanceSelected Is Nothing, Setup.Get("CacheAuthServerName"), Setup.Get("VersionServerAuthName", Instance:=McInstanceSelected))
                 If LabTypeOne.Text = "" Then LabTypeOne.Text = "第三方登录"
             Case Else
                 Log("[Control] 未知的登录页面:" & LoginPageType, LogLevel.Hint)
@@ -591,7 +591,7 @@ Finish:
     '版本选择按钮
     Private Sub BtnVersion_Click(sender As Object, e As EventArgs) Handles BtnVersion.Click
         If McLaunchLoader.State = LoadState.Loading Then Return
-        FrmMain.PageChange(FormMain.PageType.VersionSelect)
+        FrmMain.PageChange(FormMain.PageType.InstanceSelect)
     End Sub
     '启动按钮
     Public Sub LaunchButtonClick() Handles BtnLaunch.Click
@@ -615,15 +615,15 @@ Finish:
         End If
     End Sub
     Private BtnLaunchState As Integer = 0
-    Private BtnLaunchVersion As McVersion = Nothing
+    Private BtnLaunchInstance As McInstance = Nothing
     Public Sub RefreshButtonsUI() Handles BtnLaunch.Loaded
         If Not BtnLaunch.IsLoaded Then Return
         '获取当前状态
         Dim CurrentState As Integer
-        If (Not IsLoadFinished) OrElse McVersionListLoader.State = LoadState.Loading OrElse McFolderListLoader.State = LoadState.Loading Then
+        If (Not IsLoadFinished) OrElse McInstanceListLoader.State = LoadState.Loading OrElse McFolderListLoader.State = LoadState.Loading Then
             CurrentState = 0
         Else
-            If McVersionCurrent Is Nothing Then
+            If McInstanceSelected Is Nothing Then
                 If Setup.Get("UiHiddenPageDownload") AndAlso Not PageSetupUI.HiddenForceShow Then
                     CurrentState = 1
                 Else
@@ -635,8 +635,8 @@ Finish:
         End If
         '更新状态
         If CurrentState = BtnLaunchState AndAlso
-           If(McVersionCurrent Is Nothing, "", McVersionCurrent.Path) = If(BtnLaunchVersion Is Nothing, "", BtnLaunchVersion.Path) Then GoTo ExitRefresh
-        BtnLaunchVersion = McVersionCurrent
+           If(McInstanceSelected Is Nothing, "", McInstanceSelected.PathVersion) = If(BtnLaunchInstance Is Nothing, "", BtnLaunchInstance.PathVersion) Then GoTo ExitRefresh
+        BtnLaunchInstance = McInstanceSelected
         BtnLaunchState = CurrentState
         Select Case CurrentState
             Case 0
@@ -661,11 +661,11 @@ Finish:
                 FrmLaunchLeft.BtnVersion.IsEnabled = True
                 FrmLaunchLeft.BtnMore.Visibility = Visibility.Collapsed
             Case 3
-                Log("[Minecraft] 启动按钮:Minecraft 版本:" & McVersionCurrent.Path)
+                Log("[Minecraft] 启动按钮:Minecraft 版本:" & McInstanceSelected.PathVersion)
                 FrmLaunchLeft.BtnLaunch.Text = "启动游戏"
                 FrmLaunchLeft.BtnVersion.IsEnabled = True
                 FrmLaunchLeft.BtnLaunch.IsEnabled = True
-                FrmLaunchLeft.LabVersion.Text = McVersionCurrent.Name
+                FrmLaunchLeft.LabVersion.Text = McInstanceSelected.Name
                 'FrmLaunchLeft.BtnMore.Visibility = Visibility.Visible '由功能隐藏设置修改
         End Select
 ExitRefresh:
@@ -694,12 +694,12 @@ ExitRefresh:
     '版本设置按钮
     Private Sub BtnMore_Click(sender As Object, e As EventArgs) Handles BtnMore.Click
         If McLaunchLoader.State = LoadState.Loading Then Return
-        McVersionCurrent.Load()
-        PageVersionLeft.Version = McVersionCurrent
-        FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
+        McInstanceSelected.Load()
+        PageInstanceLeft.Instance = McInstanceSelected
+        FrmMain.PageChange(FormMain.PageType.InstanceSetup, 0)
     End Sub
     ''' <summary>
-    ''' 每 0.2s 执行一次,刷新启动的数据 UI 显示。
+    ''' 每 0.1s 执行一次,刷新启动的数据 UI 显示。
     ''' </summary>
     Public Sub LaunchingRefresh()
         Try
@@ -719,20 +719,27 @@ ExitRefresh:
                 Log(ex, "获取是否启动完成失败,可能是由于启动状态改变导致集合已修改")
                 Return
             End Try
+            LabLaunchingTitle.Text = If(IsLaunched OrElse McLaunchLoaderReal.State = LoadState.Finished,
+                "已启动游戏",
+                If(CurrentLaunchOptions.SaveBatch Is Nothing, "正在启动游戏", "正在导出启动脚本"))
             If AniIsRun("Launch State Page") Then IsLaunched = False '等待页面切换动画完成
-            '计算应显示的进度
+            '更新进度
             Dim ActualProgress = McLaunchLoaderReal.Progress
-            If ActualProgress >= ShowProgress Then ShowProgress += (ActualProgress - ShowProgress) * 0.2 + 0.005 '向实际进度靠一点
+            If ActualProgress >= ShowProgress Then ShowProgress += (ActualProgress - ShowProgress) * 0.1 + 0.0025 '向实际进度靠一点
             If ActualProgress <= ShowProgress Then ShowProgress = ActualProgress '原来或处理后变得比实际进度高,直接回退
             If IsLaunched Then ShowProgress = 1 '如果已经完成了,就不卖关子了
-            '文本
-            LabLaunchingTitle.Text = If(IsLaunched, "已启动游戏", If(CurrentLaunchOptions.SaveBatch Is Nothing, "正在启动游戏", "正在导出启动脚本"))
-            LabLaunchingProgress.Text = StrFillNum(ShowProgress * 100, 2) & " %"
+            LabLaunchingProgress.Text = (ShowProgress * 100).ToString("0.00") & " %"
+            '更新下载速度
             Dim HasLaunchDownloader As Boolean = False
             Try
-                For Each Loader In NetManager.Tasks
-                    If Loader.RealParent IsNot Nothing AndAlso Loader.RealParent.Name = "Minecraft 启动" AndAlso Loader.State = LoadState.Loading Then HasLaunchDownloader = True
-                Next
+                If NetManager.Speed = 0 AndAlso LabLaunchingDownload.Visibility = Visibility.Collapsed Then
+                    '可能只是在检查文件,没有实际下载
+                    HasLaunchDownloader = False
+                Else
+                    For Each Loader In NetManager.Tasks
+                        If Loader.RealParent IsNot Nothing AndAlso Loader.RealParent.Name = "Minecraft 启动" AndAlso Loader.State = LoadState.Loading Then HasLaunchDownloader = True
+                    Next
+                End If
             Catch ex As Exception
                 Log(ex, "获取 Minecraft 启动下载器失败,可能是因为启动被取消")
                 HasLaunchDownloader = False
@@ -740,41 +747,33 @@ ExitRefresh:
             LabLaunchingDownload.Text = GetString(NetManager.Speed) & "/s"
             '进度改变动画
             Dim AnimList As New List(Of AniData) From {
-                 AaGridLengthWidth(ProgressLaunchingFinished, ShowProgress - ProgressLaunchingFinished.Width.Value, 260,, New AniEaseOutFluent),
-                 AaGridLengthWidth(ProgressLaunchingUnfinished, 1 - ShowProgress - ProgressLaunchingUnfinished.Width.Value, 260,, New AniEaseOutFluent)
+                 AaGridLengthWidth(ProgressLaunchingFinished, ShowProgress - ProgressLaunchingFinished.Width.Value, 130,, New AniEaseOutFluent),
+                 AaGridLengthWidth(ProgressLaunchingUnfinished, 1 - ShowProgress - ProgressLaunchingUnfinished.Width.Value, 130,, New AniEaseOutFluent)
             }
-            Dim IsDownloadStateChanged As Boolean = HasLaunchDownloader = (LabLaunchingDownload.Visibility = Visibility.Collapsed)
-            If IsDownloadStateChanged Then
+            If HasLaunchDownloader = (LabLaunchingDownload.Visibility = Visibility.Collapsed) Then 'IsDownloadStateChanged
                 LabLaunchingDownload.Visibility = Visibility.Visible
                 LabLaunchingDownloadLeft.Visibility = Visibility.Visible
                 AnimList.AddRange({
-                 AaOpacity(LabLaunchingDownload, If(HasLaunchDownloader, 1, 0) - LabLaunchingDownload.Opacity, 100),
-                 AaOpacity(LabLaunchingDownloadLeft, If(HasLaunchDownloader, 0.5, 0) - LabLaunchingDownloadLeft.Opacity, 100),
-                 AaCode(Sub()
-                            If Not HasLaunchDownloader Then
-                                LabLaunchingDownload.Visibility = Visibility.Collapsed
-                                LabLaunchingDownloadLeft.Visibility = Visibility.Collapsed
-                            End If
-                        End Sub, 110)
-            })
+                    AaOpacity(LabLaunchingDownload, If(HasLaunchDownloader, 1, 0) - LabLaunchingDownload.Opacity, 90),
+                    AaOpacity(LabLaunchingDownloadLeft, If(HasLaunchDownloader, 0.5, 0) - LabLaunchingDownloadLeft.Opacity, 90),
+                    AaCode(
+                    Sub()
+                        If Not HasLaunchDownloader Then
+                            LabLaunchingDownload.Visibility = Visibility.Collapsed
+                            LabLaunchingDownloadLeft.Visibility = Visibility.Collapsed
+                        End If
+                    End Sub, 110)
+                })
             End If
-            Dim IsProgressStateChanged As Boolean = (Not IsLaunched) = (LabLaunchingProgress.Visibility = Visibility.Collapsed)
-            If IsProgressStateChanged Then
+            If (Not IsLaunched) = (LabLaunchingProgress.Visibility = Visibility.Collapsed) Then 'IsProgressStateChanged
                 LabLaunchingProgress.Visibility = Visibility.Visible
                 LabLaunchingProgressLeft.Visibility = Visibility.Visible
-                If IsLaunched Then
-                    'IsWidthAnimating = True
-                    PanLaunchingHint.Visibility = Visibility.Visible
-                    'AniStop("Launching Info Width")
-                    'PanLaunchingInfo.Width = 260
-                    'ActualUsedWidth = 260
-                    'IsWidthAnimating = False
-                End If
+                If IsLaunched Then PanLaunchingHint.Visibility = Visibility.Visible
                 AnimList.AddRange({
-                 AaOpacity(LabLaunchingProgress, If(Not IsLaunched, 1, 0) - LabLaunchingProgress.Opacity, 100),
-                 AaOpacity(LabLaunchingProgressLeft, If(Not IsLaunched, 0.5, 0) - LabLaunchingProgressLeft.Opacity, 100),
-                 AaOpacity(PanLaunchingHint, If(IsLaunched, 1, 0) - PanLaunchingHint.Opacity, 100)
-            })
+                    AaOpacity(LabLaunchingProgress, If(Not IsLaunched, 1, 0) - LabLaunchingProgress.Opacity, 90),
+                    AaOpacity(LabLaunchingProgressLeft, If(Not IsLaunched, 0.5, 0) - LabLaunchingProgressLeft.Opacity, 90),
+                    AaOpacity(PanLaunchingHint, If(IsLaunched, 1, 0) - PanLaunchingHint.Opacity, 90)
+                })
             End If
             AniStart(AnimList, "Launching Progress")
         Catch ex As Exception

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

@@ -107,6 +107,12 @@ Public Class PageLaunchRight
                     Case 13
                         Log("[Page] 主页预设:PCL 更新摘要")
                         Url = "https://raw.gitcode.com/ENC_Euphony/PCL-AI-Summary-HomePage/raw/master/Custom.xaml"
+                    Case 14
+                        Log("[Page] 主页预设:今日新闻热点")
+                        Url = "https://pcl.wyc-w.top/index.xaml"
+                    Case 15
+                        Log("[Page] 主页预设:Minecraft 芝士站")
+                        Url = "https://www.xxag.top/mkss"
                 End Select
         End Select
         '联网下载

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

@@ -27,7 +27,7 @@
     ''' 获取当前页面的登录信息。
     ''' </summary>
     Public Shared Function GetLoginData() As McLoginServer
-        Dim Server As String = If(IsNothing(McVersionCurrent), Setup.Get("CacheAuthServerServer"), Setup.Get("VersionServerAuthServer", Version:=McVersionCurrent)) & "/authserver"
+        Dim Server As String = If(IsNothing(McInstanceSelected), Setup.Get("CacheAuthServerServer"), Setup.Get("VersionServerAuthServer", Instance:=McInstanceSelected)) & "/authserver"
         If FrmLoginAuth Is Nothing Then
             Return New McLoginServer(McLoginType.Auth) With {.Token = "Auth", .BaseUrl = Server, .UserName = "", .Password = "", .Description = "Authlib-Injector", .Type = McLoginType.Auth}
         Else
@@ -71,15 +71,15 @@
     End Sub
     Private Sub Btn_Click(sender As Object, e As EventArgs) Handles BtnLink.Click
         If BtnLink.Content = "注册账号" Then
-            OpenWebsite(If(McVersionCurrent IsNot Nothing, Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent), Setup.Get("CacheAuthServerRegister")))
+            OpenWebsite(If(McInstanceSelected IsNot Nothing, Setup.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Setup.Get("CacheAuthServerRegister")))
         Else
-            Dim Website As String = If(McVersionCurrent IsNot Nothing, Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent), Setup.Get("CacheAuthServerRegister"))
+            Dim Website As String = If(McInstanceSelected IsNot Nothing, Setup.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Setup.Get("CacheAuthServerRegister"))
             OpenWebsite(Website.Replace("/auth/register", "/auth/forgot"))
         End If
     End Sub
     '切换注册按钮可见性
     Private Sub ReloadRegisterButton() Handles Me.Loaded
-        Dim Address As String = If(McVersionCurrent IsNot Nothing, Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent), Setup.Get("CacheAuthServerRegister"))
+        Dim Address As String = If(McInstanceSelected IsNot Nothing, Setup.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Setup.Get("CacheAuthServerRegister"))
         BtnLink.Visibility = If(String.IsNullOrEmpty(New ValidateHttp().Validate(Address)), Visibility.Visible, Visibility.Collapsed)
     End Sub
 

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

@@ -21,7 +21,7 @@
     ''' 获取当前页面的登录信息。
     ''' </summary>
     Public Shared Function GetLoginData() As McLoginServer
-        Dim Server As String = If(IsNothing(McVersionCurrent), Setup.Get("CacheAuthServerServer"), Setup.Get("VersionServerAuthServer", Version:=McVersionCurrent)) & "/authserver"
+        Dim Server As String = If(IsNothing(McInstanceSelected), Setup.Get("CacheAuthServerServer"), Setup.Get("VersionServerAuthServer", Instance:=McInstanceSelected)) & "/authserver"
         Return New McLoginServer(McLoginType.Auth) With {.Token = "Auth", .BaseUrl = Server, .UserName = Setup.Get("CacheAuthUsername"), .Password = Setup.Get("CacheAuthPass"), .Description = "Authlib-Injector", .Type = McLoginType.Auth}
     End Function
 
@@ -78,7 +78,7 @@
     End Sub
 
     Private Sub Skin_Click(sender As Object, e As MouseButtonEventArgs) Handles Skin.Click
-        Dim Address As String = If(McVersionCurrent IsNot Nothing, Setup.Get("VersionServerAuthRegister", Version:=McVersionCurrent), Setup.Get("CacheAuthServerRegister"))
+        Dim Address As String = If(McInstanceSelected IsNot Nothing, Setup.Get("VersionServerAuthRegister", Instance:=McInstanceSelected), Setup.Get("CacheAuthServerRegister"))
         If String.IsNullOrEmpty(New ValidateHttp().Validate(Address)) Then OpenWebsite(Address.Replace("/auth/register", "/user/closet"))
     End Sub
 

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

@@ -44,8 +44,8 @@ Public Class PageLoginLegacy
     Public Shared Function IsVaild(LoginData As McLoginLegacy) As String
         If LoginData.UserName.Trim = "" Then Return "玩家名不能为空!"
         If LoginData.UserName.Contains("""") Then Return "玩家名不能包含英文引号!"
-        If McVersionCurrent IsNot Nothing AndAlso
-           (McVersionCurrent.Version.IsStandardVersion AndAlso McVersionCurrent.Version.McVersion >= New Version(1, 20, 3)) AndAlso
+        If McInstanceSelected IsNot Nothing AndAlso
+           McInstanceSelected.Version.Vaild AndAlso McInstanceSelected.Version.Vanilla >= New Version(20, 0, 3) AndAlso
            LoginData.UserName.Trim.Length > 16 Then
             Return "自 1.20.3 起,玩家名至多只能包含 16 个字符!"
         End If

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

@@ -27,7 +27,7 @@
     ''' 获取当前页面的登录信息。
     ''' </summary>
     Public Shared Function GetLoginData() As McLoginServer
-        Dim Server As String = If(IsNothing(McVersionCurrent), Setup.Get("CacheNideServer"), Setup.Get("VersionServerNide", Version:=McVersionCurrent))
+        Dim Server As String = If(IsNothing(McInstanceSelected), Setup.Get("CacheNideServer"), Setup.Get("VersionServerNide", Instance:=McInstanceSelected))
         If FrmLoginNide Is Nothing Then
             Return New McLoginServer(McLoginType.Nide) With {.Token = "Nide", .UserName = "", .Password = "", .Description = "统一通行证", .Type = McLoginType.Nide, .BaseUrl = "https://auth.mc-user.com:233/" & Server & "/authserver"}
         Else
@@ -71,7 +71,7 @@
     End Sub
     Private Sub Btn_Click(sender As Object, e As EventArgs) Handles BtnLink.Click
         If BtnLink.Content = "注册账号" Then
-            OpenWebsite("https://login.mc-user.com:233/" & Setup.Get("VersionServerNide", Version:=McVersionCurrent) & "/register")
+            OpenWebsite("https://login.mc-user.com:233/" & Setup.Get("VersionServerNide", Instance:=McInstanceSelected) & "/register")
         Else
             OpenWebsite("https://login.mc-user.com:233/account/login")
         End If

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

@@ -21,7 +21,7 @@
     ''' 获取当前页面的登录信息。
     ''' </summary>
     Public Shared Function GetLoginData() As McLoginServer
-        Dim Server As String = If(IsNothing(McVersionCurrent), Setup.Get("CacheNideServer"), Setup.Get("VersionServerNide", Version:=McVersionCurrent))
+        Dim Server As String = If(IsNothing(McInstanceSelected), Setup.Get("CacheNideServer"), Setup.Get("VersionServerNide", Instance:=McInstanceSelected))
         Return New McLoginServer(McLoginType.Nide) With {.Token = "Nide", .UserName = Setup.Get("CacheNideUsername"), .Password = Setup.Get("CacheNidePass"), .Description = "统一通行证", .Type = McLoginType.Nide, .BaseUrl = "https://auth.mc-user.com:233/" & Server & "/authserver"}
     End Function
 
@@ -54,7 +54,7 @@
     End Sub
 
     Private Sub Skin_Click(sender As Object, e As MouseButtonEventArgs) Handles Skin.Click
-        OpenWebsite("https://login.mc-user.com:233/" & If(IsNothing(McVersionCurrent), Setup.Get("CacheNideServer"), Setup.Get("VersionServerNide", Version:=McVersionCurrent)) & "/skin")
+        OpenWebsite("https://login.mc-user.com:233/" & If(IsNothing(McInstanceSelected), Setup.Get("CacheNideServer"), Setup.Get("VersionServerNide", Instance:=McInstanceSelected)) & "/skin")
     End Sub
 
 End Class

+ 1 - 0
Plain Craft Launcher 2/Pages/PageLink/PageLinkMain.xaml

@@ -202,6 +202,7 @@
             </Grid>
         </Grid>
         <Grid x:Name="PanAlways" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="15" Opacity="0.5">
+            <local:MyTextButton Text="示例文本 www.meloong.com" Opacity="0.4" />
         </Grid>
     </Grid>
 </local:MyPageRight>

+ 2 - 3
Plain Craft Launcher 2/Pages/PageLink/PageLinkMain.xaml.vb

@@ -430,7 +430,7 @@ Public Class PageLinkMain
         If ServerConfig Is Nothing Then Throw New Exception("无法从服务器获取配置")
         '检查是否已禁用联机功能
         Dim DisableReason = ServerConfig("Link")?("DisableReason2")?.ToString
-        If Not String.IsNullOrEmpty(DisableReason) Then Throw New Exception("$" & DisableReason)
+        If Not String.IsNullOrEmpty(DisableReason) Then Throw New Exception("$" & DisableReason) 'TODO: 可能不会显示错误原因?
         If CType(ServerConfig("Link"), JObject).ContainsKey("MinVersionCode") AndAlso
            VersionCode < ServerConfig("Link")("MinVersionCode").ToObject(Of Integer) Then
             Throw New Exception("$你的 PCL 版本太老了,请在更新 PCL 之后再联机!")
@@ -523,7 +523,7 @@ Public Class PageLinkMain
         Dim ListenersPort As Integer = FreePorts(2) '它会占用【当前、当前 +1、当前 +2】共三个端口
         '获取启动参数
         Dim Arguments As String = ServerConfig("Link")("Argument")
-        Arguments += $" --network-name={NetworkName} --network-secret={NetworkSecret} --listeners {ListenersPort} --rpc-portal {RPCPort}"
+        Arguments += $" --network-name={NetworkName} --network-secret={NetworkSecret} --listeners {ListenersPort} --rpc-portal {RPCPort} --private-mode true"
         Dim HostName = If(IsServerSide, "Server-", "Client-") & RadixConvert(Math.Abs(Identify.GetHashCode), 10, 36)
         If IsServerSide Then
             Arguments += $" -i 10.114.114.114 --hostname={HostName} --tcp-whitelist={ServerPort} --udp-whitelist={ServerPort}"
@@ -539,7 +539,6 @@ Public Class PageLinkMain
         For Each Peer As String In RawPeers
             Arguments += $" -p=""{Peer}"""
         Next
-        Arguments += " --private-mode true" '老好人模式现在莫得用:If Not Setup.Get("LinkShareMode") Then
         If Setup.Get("LinkLatencyMode") = 1 Then Arguments += " --latency-first"
         '启动进程
         ProcessStart(Arguments)

+ 2515 - 561
Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml

@@ -114,567 +114,2521 @@
                 </Grid>
             </local:MyCard>
             <local:MyCard Margin="0,0,0,15" Title="赞助者">
-                <StackPanel Margin="25,40,10,20">
-                    <TextBlock HorizontalAlignment="Left" Text="以下是 2025 年 10 月的高级赞助者们!感谢各位对 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="不若" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Albus" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="牛马" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="溯" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="他" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="寂静之空" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="断约" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="跑不快的啊走" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="三十三" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="魂夜" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="apoooooo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="落户" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="落虞" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="漓九云" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Ding" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="yi9999" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="muo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="科骏达" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="嫉妒" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阿辉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="L." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="??????????)?" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="温雅" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MingChuYa" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="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="咸鱼猫猫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MCMIAO" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="熠惊" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="emm" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="十月." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Mark_ShaoYang" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="左" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Crocoldilopolis" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="!" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="风息" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="by烟火" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="优纪" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="人世间狡诈邪恶" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="廾匸" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="称之为翀" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="山海." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="巫元dry" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="墨羽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="暮秋知岁寒" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="司南" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="樱井弥生" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="墨枫逸尘" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="SmileRm" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="光" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="SquareBlock" />
-                        <TextBlock Width="240" Margin="0,1.5" Text="失去梦想的GGbond" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Kuni" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Herr" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="周清风" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="kirito" />
-                        <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="trav" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Danielisdoge" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="王隔壁" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="怕是卧龙先生" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="懒人碎觉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="神里绫华的狗" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="翁" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="是是是不是" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="水波不兴" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="zero" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="许愿流星雨" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="YiHuwuyue" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="CenturionSC" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="闲鱼下饭" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="残叶" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="浪浪天" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="西行寺叶叶子" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="覃丘丘" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Caryee" />
-                        <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="薄荷巧克力蛋糕" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="CT" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="酋长想去欧洲" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MOYO_" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="四季的猫." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Jcey" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Nefelibata." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="领域星" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="cnp" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="扔完炸药掏蜂鸟" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="新桑" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="北凉影" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="wax" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="白葉白不白" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="沐晨" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="。" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="哎呀呀" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="龙仔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="六百六十六" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="剑瘗千秋" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="亻三人亍" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="人" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Freezinker" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="鱼丸" />
-                        <TextBlock Width="240" Margin="0,1.5" Text="NORMAL_MAN36" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阿希佩尔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="kikimmo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="镜像折叠" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="留不住的刹那" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="朱小楠" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="鹤暝柘" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="莫离" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="江上tipsy" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="句号" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Master" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="边打铜锣边鬼叫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="随便就好" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="赢于" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="夏目心" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="NOBODY112" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="黑糖" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="李" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="皮皮狗我们走" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="卜部美琴" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="商枝" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="嫑喊我" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="流星与朝阳" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="呀呼" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="EasyOrange" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MATH算珠" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="暮光Ts" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="洛秋" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="瑾" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Tenno" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="酒奇" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="笑叹" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="今晚不熬夜" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="四月是你的谎言" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="方方" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Rei" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="lxh123123123" />
-                        <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="冬季の信物" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Y先生" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="万兔森罗" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="携酒迎春风" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="消逝" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="昭苏" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="卡卡卡卡啊" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="鱿倪克" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="彺钰" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="尘飞雾散芳华慢" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="言欢" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ZJD" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="别吵我在法考" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="WLan" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="457ssu" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="liu" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="贤" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="玄月" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="dailiweier" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="korfr" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="绕开这些天" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="田洛" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="天天向上" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="XINA-33" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Temmie" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="。" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="凌州" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="痴心夏天的风" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="予" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="笑死啦啦啦" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="旧曾谙" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="LightingPriest" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="sxdxm" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="GYWTT" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="煞神小郑" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="花" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="三金知日" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="sul" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="静心涵养" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="均就均吧" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Tuski_Velpro" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="望江寒" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="我该要E了" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="lxx" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MX丶" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="乘风9527" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="修狗不是狗" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="奇怪的深渊增加了" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="森森1025" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="愚墨玄" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="饼子" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="王" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="清水优" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="熬夜的猫条?ω?" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="南瓜" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="不觉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="晓町" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="王八吃绿豆" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="她面有愠色" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="shengli" />
-                        <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="亡利普贝当" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小猪" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="莱莱" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="吾等一个人" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="一只呆呆." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="李某顺" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="LBDLXLZT" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="二鸽咕咕咕" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="千了一水寒" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="大白" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="单林熙大王" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="qiji_SaMa" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="是我小白鸭~" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Yylinmu" />
-                        <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="欧欧欧" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Freezing" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="潜汐" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="waaiu" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小劫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Lemon0904" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="呆头鹅" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="无所事事的达达" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="梦鱼" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="JiuJiu" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阋yee" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="qsiwsi" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="你从未离去" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="独觞&自乐" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="定远" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ZYX" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="玦" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="浬江河" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ZERO" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="猫猫qwq" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="shark" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="宝箱怪" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="您的名字" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="零之执事" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="TTT" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="赵云撤" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="岩壑之崩" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Fox Hound" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Alon.E." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="湺" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="陳拾憶" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="kwzddz" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="莲苂" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="少帅" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="," />
-                        <TextBlock Width="120" Margin="0,1.5" Text="传奇群野猫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="挽枫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Q7" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阿卡找你玩" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="月月" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="POCKY" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="橙子饱宝" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="空城风雨" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Carlmu" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="日雨云曇" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Caerphilly" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Andy Wang" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Kepler" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小大人" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="波风菇" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="孤丶渊" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="白沙" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="夜Ylz" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="不知道唉kk" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="墨染星云间" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="-Trespassin." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="白天小生" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="霍柴玉铉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="雨" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="慕可OvO" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="上杉绘梨衣" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="观天台(炀章)" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="两仪阴阳子" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MOMOHAN" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="希瓦大陆_Hitable" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="比奇堡小佩奇" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="龙井茶叶" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="星辰" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="黑云画师" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="烤鱼" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="okufir" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="莫白" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="周星星" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="好无聊:-" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="轩辕朔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Kakiko" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="摩卡茉莉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="长忆安思" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Solomon" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="博麗靈夢" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="CMMing" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="择日再起床" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="逆黑C" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="星恒" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="销" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="XingLing2333" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Lesonmol" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="a" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="格拉索夫司机" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="LDG" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="爱玩游戏的路人" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="天灵地黄补肝丸子" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阿撒托斯" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="離倌" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="飞向烛的蛾" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="JadePolarise" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="不爱吃饭的Hog" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="莉莉大饺子" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="yu" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="徐" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="欢乐颂" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="榴莲千层" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="LordyTheQDuck" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="衔纸人" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="粉色妖精小姐?" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="kongfan" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="白杨之下" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Eme.b" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="熊猫" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="颜5236" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="KK" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="青色小鲨鱼" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阿惹" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="解析模式" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="秋夜纱" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Escape Star" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="LSEN志恒" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Azqs7109" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="艾雅法拉的狗" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="????????" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="LOWN" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="cuu7878" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="RemixQQ" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="CANYUEX" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="元路" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="承时之势" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="补丁" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="心枫浔尘" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="wujijuan" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="晨語古韵" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="流萤的星光" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="缄默" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="qq1967131327" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="sence4910" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="HilkK" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ZThengao" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="玖镜Sama" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Glx?" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="派大星" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="河边鸺葵" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="SoftSui" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="徐家胤" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="至夏" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="溯洄SWZM" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="海睿洋" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阿巴阿巴" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="灰合夏" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="XLMX" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="雲墨丶雪风" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="每天都是上上签" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Bright" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="UFO君" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="z001" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="琥色" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MaxQi" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="姜淼淼" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Chenluoxcly" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="南宫墨白" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="白晓" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ChengYhy" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="陆壹" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Agoni" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="可乐鸡翅" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="木诺于" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="无" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="imsunxinhao" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="在我嘴里种水稻" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="浮世三千" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="blue sky" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="wujiayi" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="XIAOXI" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="景天鸽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="24598" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="世谈茶楼" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="jwl" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Saki" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="董铮" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小羽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="张浩轩" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="neltharion" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="小于" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="太乙" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="玉卿程" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="lalailoveyou" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="EternalSinDusk" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="风继续吹" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="一只落云呦" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="叶沚芃" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="花非花雾非雾" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="BIOKL" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="你先别急" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="MuMAA" />
-                        <TextBlock Width="240" Margin="0,1.5" Text="擻齺獼豳鏚嬼嬭鼬乸鑽麣覊" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="风眠" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="hgmzyyy" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Danc1n9" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="doodo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="FrostNova" />
-                        <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="XU." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="八云源" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="qbn5" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="许诺霓虹" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="X-ran" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="微风" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="阿米诺斯" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="玄纪2006" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="666" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="恋某人-柏然" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="The_Crispy" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="电脑and病毒哥" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="W" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="jys" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="lonelife" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="离断幽" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="对方正在输入..." />
-                        <TextBlock Width="120" Margin="0,1.5" Text="带我去跳海" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Jogycjh" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="F" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="鸽六" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="亦明" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="苏瑜年" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="单身使我快乐" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="井狗的慈父" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="YanTY" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="勿念fmj" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="道瑶" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="JerryGo" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="HAJ_IMI" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="林星是星" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="扶她大法好" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="心如霜雪" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Отомстить" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="云巴" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="?ιδη?、" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="候鸟" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="望格" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="锅巴" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="月野" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="烛龙" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Rock god-Morax" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="百忧解" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="林琴科" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="北雁蘿蔔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="墨雪竹" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="雾里" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="鋆星" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="HPLY" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="淡然a" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="白玉京" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Ykir" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="三千" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="溪峡" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="avenqyx" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="xxz" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="tytd" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="yezhi" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="落子不悔" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="chenge886" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="秋雨淋枫落" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="斑斓根" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="空城微凉" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="晨099" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Ado" />
-                        <TextBlock Width="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="Black_Banana_Cat" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="君染" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="XiaoMingPro" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="翎霜流火" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="李一年" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="白沢見知らぬ" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="洛阳蓝焰" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="123" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Zikyeung" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="zzz_10728701" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="啥都想玩的天云" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="棱镜凌空" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="瑾" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="zzzzzjy" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="南有乔树" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="wsaml" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="韬光养晦" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="李白" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="xsh" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="ChatCTL" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="杰" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="霜天天" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="辛兮辞" />
-                        <TextBlock Width="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="Lewis" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="捞猴子的月亮呐" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="活着是为了摆烂" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="浔。" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="周南何" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="あんた" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="老乡老乡开开门" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="dedf" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Adminstrator" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="木子李" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="文刀木头鱼" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="泪刻我心" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="璃洺" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="wuzhi718" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="琳" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="fycn" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="风铃末末?" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="漫游池塘中" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="james" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="jiekun" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="gugugugugu" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Zomib" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="乱想的名字" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="fish" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Kfeadow" />
-                        <TextBlock Width="240" Margin="0,1.5" Text="MeltyAcoustAmber" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="Quan_Q" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="旋叶" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="YanXiaXia__" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="崩坏坏sama" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="中土来客" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="大星星" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="尋葉゛" />
-                        <TextBlock Width="120" Margin="0,1.5" Text="50MB" />
+                <StackPanel Margin="25,40,19,20">
+                    <TextBlock HorizontalAlignment="Left" Text="以下是近期的高级赞助者们!感谢大家对 PCL 的支持!!!" Margin="0,0,25,5.5" TextTrimming="None" TextWrapping="WrapWithOverflow" />
+                    <WrapPanel Margin="0,0,0,10">
                        <TextBlock Margin="0,1.5,6,0" Text="." />
+                        <TextBlock Margin="0,1.5,6,0" Text="." />
+                        <TextBlock Margin="0,1.5,6,0" Text="l" />
+                        <TextBlock Margin="0,1.5,6,0" Text="]" />
+                        <TextBlock Margin="0,1.5,6,0" Text="s" />
+                        <TextBlock Margin="0,1.5,6,0" Text="_" />
+                        <TextBlock Margin="0,1.5,6,0" Text="z" />
+                        <TextBlock Margin="0,1.5,6,0" Text="L" />
+                        <TextBlock Margin="0,1.5,6,0" Text="x" />
+                        <TextBlock Margin="0,1.5,6,0" Text="F" />
+                        <TextBlock Margin="0,1.5,6,0" Text="1" />
+                        <TextBlock Margin="0,1.5,6,0" Text="(:" />
+                        <TextBlock Margin="0,1.5,6,0" Text="jj" />
+                        <TextBlock Margin="0,1.5,6,0" Text="้" />
+                        <TextBlock Margin="0,1.5,6,0" Text="..." />
+                        <TextBlock Margin="0,1.5,6,0" Text="d" />
+                        <TextBlock Margin="0,1.5,6,0" Text="K" />
+                        <TextBlock Margin="0,1.5,6,0" Text="..." />
+                        <TextBlock Margin="0,1.5,6,0" Text="tt" />
+                        <TextBlock Margin="0,1.5,6,0" Text="A" />
+                        <TextBlock Margin="0,1.5,6,0" Text="" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ᐇ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="T." />
+                        <TextBlock Margin="0,1.5,6,0" Text="Li" />
+                        <TextBlock Margin="0,1.5,6,0" Text="&amp;" />
+                        <TextBlock Margin="0,1.5,6,0" Text="qi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冬" />
+                        <TextBlock Margin="0,1.5,6,0" Text="司" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zc" />
+                        <TextBlock Margin="0,1.5,6,0" Text="诺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="张" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="卧" />
+                        <TextBlock Margin="0,1.5,6,0" Text="辞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="信" />
+                        <TextBlock Margin="0,1.5,6,0" Text="vv" />
+                        <TextBlock Margin="0,1.5,6,0" Text="嘿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="伊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="乐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="玨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="西" />
+                        <TextBlock Margin="0,1.5,6,0" Text="影" />
+                        <TextBlock Margin="0,1.5,6,0" Text="華" />
+                        <TextBlock Margin="0,1.5,6,0" Text="零" />
+                        <TextBlock Margin="0,1.5,6,0" Text="啦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鸿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="云" />
+                        <TextBlock Margin="0,1.5,6,0" Text="@" />
+                        <TextBlock Margin="0,1.5,6,0" Text="@" />
+                        <TextBlock Margin="0,1.5,6,0" Text="W" />
+                        <TextBlock Margin="0,1.5,6,0" Text="魏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="云" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="笠" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="衍" />
+                        <TextBlock Margin="0,1.5,6,0" Text="渔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="幽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ㅤ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="泽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ㅤ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="溈" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无" />
+                        <TextBlock Margin="0,1.5,6,0" Text="謝" />
+                        <TextBlock Margin="0,1.5,6,0" Text="氵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="祖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="睿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="林" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="顺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="心" />
+                        <TextBlock Margin="0,1.5,6,0" Text="銀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="。" />
+                        <TextBlock Margin="0,1.5,6,0" Text="霖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="禺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="潘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无" />
+                        <TextBlock Margin="0,1.5,6,0" Text="YJ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="璇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我" />
+                        <TextBlock Margin="0,1.5,6,0" Text="序" />
+                        <TextBlock Margin="0,1.5,6,0" Text="。" />
+                        <TextBlock Margin="0,1.5,6,0" Text="广" />
+                        <TextBlock Margin="0,1.5,6,0" Text="…." />
+                        <TextBlock Margin="0,1.5,6,0" Text="困" />
+                        <TextBlock Margin="0,1.5,6,0" Text="云" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="耶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="黎" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="困" />
+                        <TextBlock Margin="0,1.5,6,0" Text="丶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="。" />
+                        <TextBlock Margin="0,1.5,6,0" Text="懿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cc" />
+                        <TextBlock Margin="0,1.5,6,0" Text="笙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="黎" />
+                        <TextBlock Margin="0,1.5,6,0" Text="橦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="玥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="特" />
+                        <TextBlock Margin="0,1.5,6,0" Text="安" />
+                        <TextBlock Margin="0,1.5,6,0" Text="麟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="。" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="漓" />
+                        <TextBlock Margin="0,1.5,6,0" Text="里" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="源" />
+                        <TextBlock Margin="0,1.5,6,0" Text="涛" />
+                        <TextBlock Margin="0,1.5,6,0" Text="瓷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="。" />
+                        <TextBlock Margin="0,1.5,6,0" Text="怀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="吧" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木" />
+                        <TextBlock Margin="0,1.5,6,0" Text="彬" />
+                        <TextBlock Margin="0,1.5,6,0" Text="江" />
+                        <TextBlock Margin="0,1.5,6,0" Text="?" />
+                        <TextBlock Margin="0,1.5,6,0" Text="殇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="烛" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晚" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LE" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ye" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Yy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kk" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cn" />
+                        <TextBlock Margin="0,1.5,6,0" Text="11" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LC" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lyf" />
+                        <TextBlock Margin="0,1.5,6,0" Text="7Y" />
+                        <TextBlock Margin="0,1.5,6,0" Text="qc" />
+                        <TextBlock Margin="0,1.5,6,0" Text="gv" />
+                        <TextBlock Margin="0,1.5,6,0" Text="尘." />
+                        <TextBlock Margin="0,1.5,6,0" Text="悸." />
+                        <TextBlock Margin="0,1.5,6,0" Text="lxs" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Be" />
+                        <TextBlock Margin="0,1.5,6,0" Text="liu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="湮." />
+                        <TextBlock Margin="0,1.5,6,0" Text="烨." />
+                        <TextBlock Margin="0,1.5,6,0" Text="XY" />
+                        <TextBlock Margin="0,1.5,6,0" Text="橘." />
+                        <TextBlock Margin="0,1.5,6,0" Text="3C" />
+                        <TextBlock Margin="0,1.5,6,0" Text="uu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Fly" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lpr" />
+                        <TextBlock Margin="0,1.5,6,0" Text="tql" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Bit" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xw" />
+                        <TextBlock Margin="0,1.5,6,0" Text="hh" />
+                        <TextBlock Margin="0,1.5,6,0" Text="f-x" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ylx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="dd" />
+                        <TextBlock Margin="0,1.5,6,0" Text=" 忆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="op" />
+                        <TextBlock Margin="0,1.5,6,0" Text="👾" />
+                        <TextBlock Margin="0,1.5,6,0" Text="🐶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="🕊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ylll" />
+                        <TextBlock Margin="0,1.5,6,0" Text="😯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="😑" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cfy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="chi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="UU" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lny" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ldy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="sxy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="e.h" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kai" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wg" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Fly." />
+                        <TextBlock Margin="0,1.5,6,0" Text="TA." />
+                        <TextBlock Margin="0,1.5,6,0" Text=" 寿." />
+                        <TextBlock Margin="0,1.5,6,0" Text="kjn" />
+                        <TextBlock Margin="0,1.5,6,0" Text="jqk" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ccy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="htz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HN" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kas" />
+                        <TextBlock Margin="0,1.5,6,0" Text="k子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陇li" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kxx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="4策" />
+                        <TextBlock Margin="0,1.5,6,0" Text="WY" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zhc" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sky" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kbs" />
+                        <TextBlock Margin="0,1.5,6,0" Text="suk" />
+                        <TextBlock Margin="0,1.5,6,0" Text="C啊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="S_C" />
+                        <TextBlock Margin="0,1.5,6,0" Text="dxx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="MK" />
+                        <TextBlock Margin="0,1.5,6,0" Text="米u" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zhx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小P" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yhx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="223" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LYB" />
+                        <TextBlock Margin="0,1.5,6,0" Text="666" />
+                        <TextBlock Margin="0,1.5,6,0" Text="YYT" />
+                        <TextBlock Margin="0,1.5,6,0" Text="oec" />
+                        <TextBlock Margin="0,1.5,6,0" Text="333" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yao" />
+                        <TextBlock Margin="0,1.5,6,0" Text="eee" />
+                        <TextBlock Margin="0,1.5,6,0" Text="117" />
+                        <TextBlock Margin="0,1.5,6,0" Text="whl" />
+                        <TextBlock Margin="0,1.5,6,0" Text="G寄" />
+                        <TextBlock Margin="0,1.5,6,0" Text="234" />
+                        <TextBlock Margin="0,1.5,6,0" Text="eee" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AH." />
+                        <TextBlock Margin="0,1.5,6,0" Text="kek" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Bay" />
+                        <TextBlock Margin="0,1.5,6,0" Text="132" />
+                        <TextBlock Margin="0,1.5,6,0" Text="123" />
+                        <TextBlock Margin="0,1.5,6,0" Text="000" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lIlIlI" />
+                        <TextBlock Margin="0,1.5,6,0" Text="leaf" />
+                        <TextBlock Margin="0,1.5,6,0" Text="fjvg" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Bell" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CYY" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kilo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Bby" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Tao" />
+                        <TextBlock Margin="0,1.5,6,0" Text=".NO" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lccz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cwx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LZX" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kori" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Z.zy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="jjbb" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xkjz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HFY" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lxxk" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BYX" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BBS" />
+                        <TextBlock Margin="0,1.5,6,0" Text="saie" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Van" />
+                        <TextBlock Margin="0,1.5,6,0" Text="rem" />
+                        <TextBlock Margin="0,1.5,6,0" Text="YuA" />
+                        <TextBlock Margin="0,1.5,6,0" Text="hzic" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wzb" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SOY" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ymx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="qqq" />
+                        <TextBlock Margin="0,1.5,6,0" Text="guo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="797." />
+                        <TextBlock Margin="0,1.5,6,0" Text="hhh" />
+                        <TextBlock Margin="0,1.5,6,0" Text="浮生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="绝少" />
+                        <TextBlock Margin="0,1.5,6,0" Text="潇渺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="老楼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="禄荥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="天华" />
+                        <TextBlock Margin="0,1.5,6,0" Text="亿年" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逝念" />
+                        <TextBlock Margin="0,1.5,6,0" Text="仕子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="東忆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="翎巡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="春风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="飞翔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="蜡烛" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小郭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凛夜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="格露" />
+                        <TextBlock Margin="0,1.5,6,0" Text="老黑" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晨曦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="丘夕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="死寂" />
+                        <TextBlock Margin="0,1.5,6,0" Text="泡崽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="啊?" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无世" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雾竹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="乐乐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="三皮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="绫七" />
+                        <TextBlock Margin="0,1.5,6,0" Text="七念" />
+                        <TextBlock Margin="0,1.5,6,0" Text="虚空" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无聊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="布鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="老白" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星空" />
+                        <TextBlock Margin="0,1.5,6,0" Text="韭菜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="水云" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无鳞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="幻厂" />
+                        <TextBlock Margin="0,1.5,6,0" Text="古神" />
+                        <TextBlock Margin="0,1.5,6,0" Text="毅轩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梦见" />
+                        <TextBlock Margin="0,1.5,6,0" Text="顾痴" />
+                        <TextBlock Margin="0,1.5,6,0" Text="九一" />
+                        <TextBlock Margin="0,1.5,6,0" Text="幽零" />
+                        <TextBlock Margin="0,1.5,6,0" Text="破帆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="七安" />
+                        <TextBlock Margin="0,1.5,6,0" Text="宁芙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="王道" />
+                        <TextBlock Margin="0,1.5,6,0" Text="心伤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="朝辞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冬司" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星辰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="朔云" />
+                        <TextBlock Margin="0,1.5,6,0" Text="琳玙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="狐狸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨叶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沽缨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枝皙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="醒雾" />
+                        <TextBlock Margin="0,1.5,6,0" Text="旋叶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="金金" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鸣术" />
+                        <TextBlock Margin="0,1.5,6,0" Text="浮晨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="蓝霜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿希" />
+                        <TextBlock Margin="0,1.5,6,0" Text="艾伦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="浮客" />
+                        <TextBlock Margin="0,1.5,6,0" Text="某人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="埃眀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="寻子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白狼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雨缘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晨焰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="谶纛" />
+                        <TextBlock Margin="0,1.5,6,0" Text="烨神" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜影" />
+                        <TextBlock Margin="0,1.5,6,0" Text="时离" />
+                        <TextBlock Margin="0,1.5,6,0" Text="微风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="豹豹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="羽化" />
+                        <TextBlock Margin="0,1.5,6,0" Text="染辞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="琉璃" />
+                        <TextBlock Margin="0,1.5,6,0" Text="牛马" />
+                        <TextBlock Margin="0,1.5,6,0" Text="乔玥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="缪行" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌寞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洋葱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="後妻" />
+                        <TextBlock Margin="0,1.5,6,0" Text="槐诗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="落尘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="疯狼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="欧漏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="澐鵼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="路人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木镐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="神樂" />
+                        <TextBlock Margin="0,1.5,6,0" Text="薄荷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="幻舞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="舞歌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="嘿嘿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小婷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="霖好" />
+                        <TextBlock Margin="0,1.5,6,0" Text="叶夕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="芜湖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="天宇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="叶蛾" />
+                        <TextBlock Margin="0,1.5,6,0" Text="青衿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨盏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凉星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="多余" />
+                        <TextBlock Margin="0,1.5,6,0" Text="诶嘿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="㕃烉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="以来" />
+                        <TextBlock Margin="0,1.5,6,0" Text="华月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陆压" />
+                        <TextBlock Margin="0,1.5,6,0" Text="清风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="霜降" />
+                        <TextBlock Margin="0,1.5,6,0" Text="客浔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="朮薺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="泠惜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="高战" />
+                        <TextBlock Margin="0,1.5,6,0" Text="花火" />
+                        <TextBlock Margin="0,1.5,6,0" Text="秋天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小船" />
+                        <TextBlock Margin="0,1.5,6,0" Text="瑞粼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枕梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="异教" />
+                        <TextBlock Margin="0,1.5,6,0" Text="望天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="患者" />
+                        <TextBlock Margin="0,1.5,6,0" Text="落夜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="涵仔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="海狸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冒泡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="卡卡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="初眠" />
+                        <TextBlock Margin="0,1.5,6,0" Text="昔谣" />
+                        <TextBlock Margin="0,1.5,6,0" Text="布衣" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沐沐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="哈哈" />
+                        <TextBlock Margin="0,1.5,6,0" Text="玺子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="月枫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="旧梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="羽白" />
+                        <TextBlock Margin="0,1.5,6,0" Text="霖银" />
+                        <TextBlock Margin="0,1.5,6,0" Text="云訞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雨姐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="昨日" />
+                        <TextBlock Margin="0,1.5,6,0" Text="蓝海" />
+                        <TextBlock Margin="0,1.5,6,0" Text="度嘟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="成了" />
+                        <TextBlock Margin="0,1.5,6,0" Text="幸免" />
+                        <TextBlock Margin="0,1.5,6,0" Text="渊肃" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿泽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小涵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="义帆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="月上" />
+                        <TextBlock Margin="0,1.5,6,0" Text="王月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="桃子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="锦锦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无法" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凯只" />
+                        <TextBlock Margin="0,1.5,6,0" Text="网警" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一一" />
+                        <TextBlock Margin="0,1.5,6,0" Text="狗子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="麟言" />
+                        <TextBlock Margin="0,1.5,6,0" Text="花花" />
+                        <TextBlock Margin="0,1.5,6,0" Text="驿墙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="啊这" />
+                        <TextBlock Margin="0,1.5,6,0" Text="乐园" />
+                        <TextBlock Margin="0,1.5,6,0" Text="临深" />
+                        <TextBlock Margin="0,1.5,6,0" Text="昔涟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="黑鸟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="巳木" />
+                        <TextBlock Margin="0,1.5,6,0" Text="霊夢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="謌声" />
+                        <TextBlock Margin="0,1.5,6,0" Text="拐若" />
+                        <TextBlock Margin="0,1.5,6,0" Text="蚀初" />
+                        <TextBlock Margin="0,1.5,6,0" Text="橘络" />
+                        <TextBlock Margin="0,1.5,6,0" Text="懒些" />
+                        <TextBlock Margin="0,1.5,6,0" Text="莉控" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿巴" />
+                        <TextBlock Margin="0,1.5,6,0" Text="黑犮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="回望" />
+                        <TextBlock Margin="0,1.5,6,0" Text="颜凡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="千山" />
+                        <TextBlock Margin="0,1.5,6,0" Text="哦哟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="六幺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="暮魙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="天磊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阡陌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小妖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="柒柒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猎鹰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="蜜饼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="染墨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="清风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="太宰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="黎羽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="将臣" />
+                        <TextBlock Margin="0,1.5,6,0" Text="狐狸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="坤蛙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="榆晚" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨光" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枕星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白绫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="虾条" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小影" />
+                        <TextBlock Margin="0,1.5,6,0" Text="胖虎" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我啊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不言" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雨仙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨白" />
+                        <TextBlock Margin="0,1.5,6,0" Text="喜欢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="竹筏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="辉哥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小鼓" />
+                        <TextBlock Margin="0,1.5,6,0" Text="闫妍" />
+                        <TextBlock Margin="0,1.5,6,0" Text="豆沙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="神祈" />
+                        <TextBlock Margin="0,1.5,6,0" Text="知秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="之卿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="林三" />
+                        <TextBlock Margin="0,1.5,6,0" Text="山隰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="盛夏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="朱颜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="黄瓜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="胧月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="暖冬" />
+                        <TextBlock Margin="0,1.5,6,0" Text="芝楠" />
+                        <TextBlock Margin="0,1.5,6,0" Text="幽墨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="秦箫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="欧耶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="球球" />
+                        <TextBlock Margin="0,1.5,6,0" Text="华砚" />
+                        <TextBlock Margin="0,1.5,6,0" Text="威灵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小俞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白夜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="伊一" />
+                        <TextBlock Margin="0,1.5,6,0" Text="泠落" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌冰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="化十" />
+                        <TextBlock Margin="0,1.5,6,0" Text="否否" />
+                        <TextBlock Margin="0,1.5,6,0" Text="馒头" />
+                        <TextBlock Margin="0,1.5,6,0" Text="岩枫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晚安" />
+                        <TextBlock Margin="0,1.5,6,0" Text="溟千" />
+                        <TextBlock Margin="0,1.5,6,0" Text="奇音" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夏暮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="樱赟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="云深" />
+                        <TextBlock Margin="0,1.5,6,0" Text="禾鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无殇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="紫薯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="寒风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="独雲" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白洛" />
+                        <TextBlock Margin="0,1.5,6,0" Text="暖阳" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杨想" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cola" />
+                        <TextBlock Margin="0,1.5,6,0" Text="芊羽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿通" />
+                        <TextBlock Margin="0,1.5,6,0" Text="北奚" />
+                        <TextBlock Margin="0,1.5,6,0" Text="舌头" />
+                        <TextBlock Margin="0,1.5,6,0" Text="丸子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="松缘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白糖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="新御" />
+                        <TextBlock Margin="0,1.5,6,0" Text="熠懿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白昼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿跃" />
+                        <TextBlock Margin="0,1.5,6,0" Text="清明" />
+                        <TextBlock Margin="0,1.5,6,0" Text="故玖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="心素" />
+                        <TextBlock Margin="0,1.5,6,0" Text="留意" />
+                        <TextBlock Margin="0,1.5,6,0" Text="计鸿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="清晰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="那谁" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我不" />
+                        <TextBlock Margin="0,1.5,6,0" Text="幽玄" />
+                        <TextBlock Margin="0,1.5,6,0" Text="听雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="允羡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="万华" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逸道" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逸轩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="弑神" />
+                        <TextBlock Margin="0,1.5,6,0" Text="呕吼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="坎漓" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿枫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="引言" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Fate" />
+                        <TextBlock Margin="0,1.5,6,0" Text="滋道" />
+                        <TextBlock Margin="0,1.5,6,0" Text="云鹤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="挽歌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="挽雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="歌者" />
+                        <TextBlock Margin="0,1.5,6,0" Text="苍穹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="如常" />
+                        <TextBlock Margin="0,1.5,6,0" Text="残夕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="言鸦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="古檩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="稣茫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="神仙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冷热" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白泽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夢络" />
+                        <TextBlock Margin="0,1.5,6,0" Text="帝暝" />
+                        <TextBlock Margin="0,1.5,6,0" Text=",," />
+                        <TextBlock Margin="0,1.5,6,0" Text="小丫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="千慕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨清" />
+                        <TextBlock Margin="0,1.5,6,0" Text="云梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="川啊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凉沉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逐雾" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夏至" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洛羽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="执笔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="上野" />
+                        <TextBlock Margin="0,1.5,6,0" Text="栗原" />
+                        <TextBlock Margin="0,1.5,6,0" Text="张萌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="笑容" />
+                        <TextBlock Margin="0,1.5,6,0" Text="清秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="筱湘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜蝶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="花欢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="微笑" />
+                        <TextBlock Margin="0,1.5,6,0" Text="柒久" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十八" />
+                        <TextBlock Margin="0,1.5,6,0" Text="槐安" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沸点" />
+                        <TextBlock Margin="0,1.5,6,0" Text="龙殇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="惊醒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="川夏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="苍璧" />
+                        <TextBlock Margin="0,1.5,6,0" Text="asdf" />
+                        <TextBlock Margin="0,1.5,6,0" Text="挽風" />
+                        <TextBlock Margin="0,1.5,6,0" Text="长安" />
+                        <TextBlock Margin="0,1.5,6,0" Text="长岛" />
+                        <TextBlock Margin="0,1.5,6,0" Text="空心" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿守" />
+                        <TextBlock Margin="0,1.5,6,0" Text="辰天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="北陌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="茕茕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="渡崆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="轩宝" />
+                        <TextBlock Margin="0,1.5,6,0" Text="东竹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="龙咩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="胧月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="向阳" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无疆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="嘉豪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="明愿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我华" />
+                        <TextBlock Margin="0,1.5,6,0" Text="泪星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="执予" />
+                        <TextBlock Margin="0,1.5,6,0" Text="虫二" />
+                        <TextBlock Margin="0,1.5,6,0" Text="花前" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十三" />
+                        <TextBlock Margin="0,1.5,6,0" Text="谷雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="惜陌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="离弦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="孽缘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="华旭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="理他" />
+                        <TextBlock Margin="0,1.5,6,0" Text="はち" />
+                        <TextBlock Margin="0,1.5,6,0" Text="啊?" />
+                        <TextBlock Margin="0,1.5,6,0" Text="影诺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枫林" />
+                        <TextBlock Margin="0,1.5,6,0" Text="挠薯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十二" />
+                        <TextBlock Margin="0,1.5,6,0" Text="面靤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="芜湖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="初霁" />
+                        <TextBlock Margin="0,1.5,6,0" Text="余音" />
+                        <TextBlock Margin="0,1.5,6,0" Text="扶光" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十四" />
+                        <TextBlock Margin="0,1.5,6,0" Text="禹海" />
+                        <TextBlock Margin="0,1.5,6,0" Text="dast" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晚风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="简单" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晓尘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="安信" />
+                        <TextBlock Margin="0,1.5,6,0" Text="惜橙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雷影" />
+                        <TextBlock Margin="0,1.5,6,0" Text="尘初" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冰戒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不二" />
+                        <TextBlock Margin="0,1.5,6,0" Text="槐鲤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="羽笙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="王梅" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沉渊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="以风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十一" />
+                        <TextBlock Margin="0,1.5,6,0" Text="酒煦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星阳" />
+                        <TextBlock Margin="0,1.5,6,0" Text="馉卿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="落殇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枫涯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="山河" />
+                        <TextBlock Margin="0,1.5,6,0" Text="慢银" />
+                        <TextBlock Margin="0,1.5,6,0" Text="溯凝" />
+                        <TextBlock Margin="0,1.5,6,0" Text="柳渟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夛逸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="九九" />
+                        <TextBlock Margin="0,1.5,6,0" Text="柴木" />
+                        <TextBlock Margin="0,1.5,6,0" Text="thcx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星黎" />
+                        <TextBlock Margin="0,1.5,6,0" Text="破音" />
+                        <TextBlock Margin="0,1.5,6,0" Text="渏玄" />
+                        <TextBlock Margin="0,1.5,6,0" Text="随岷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="四季" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木易" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星落" />
+                        <TextBlock Margin="0,1.5,6,0" Text="喵呜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="言笔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="桂糕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="hezi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="乐平" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木偶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨叶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梓铭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="隋暖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="故人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="偑壄" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜幕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="误区" />
+                        <TextBlock Margin="0,1.5,6,0" Text="苏白" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冰灵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白景" />
+                        <TextBlock Margin="0,1.5,6,0" Text="知我" />
+                        <TextBlock Margin="0,1.5,6,0" Text="渝雾" />
+                        <TextBlock Margin="0,1.5,6,0" Text="拾秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="挽手" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沦陷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鸠鸮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="佐罗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="寻夢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="南墨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="咕咕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="左爻" />
+                        <TextBlock Margin="0,1.5,6,0" Text="北静" />
+                        <TextBlock Margin="0,1.5,6,0" Text="相原" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌寒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="天才" />
+                        <TextBlock Margin="0,1.5,6,0" Text="糖果" />
+                        <TextBlock Margin="0,1.5,6,0" Text="因果" />
+                        <TextBlock Margin="0,1.5,6,0" Text="萧诧" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梦貘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晴空" />
+                        <TextBlock Margin="0,1.5,6,0" Text="轩冕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="仓鼠" />
+                        <TextBlock Margin="0,1.5,6,0" Text="天斗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="纸凉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逆是" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小羊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星云" />
+                        <TextBlock Margin="0,1.5,6,0" Text="呼吸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="城关" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小罗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="创世" />
+                        <TextBlock Margin="0,1.5,6,0" Text="午领" />
+                        <TextBlock Margin="0,1.5,6,0" Text="竹窝" />
+                        <TextBlock Margin="0,1.5,6,0" Text="龍炏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="震震" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木易" />
+                        <TextBlock Margin="0,1.5,6,0" Text="璃鸢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="绿洲" />
+                        <TextBlock Margin="0,1.5,6,0" Text="驭浪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="顾璟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小仙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="你猜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小久" />
+                        <TextBlock Margin="0,1.5,6,0" Text="御华" />
+                        <TextBlock Margin="0,1.5,6,0" Text="龑曦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="誓言" />
+                        <TextBlock Margin="0,1.5,6,0" Text="知勤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枫芫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="过客" />
+                        <TextBlock Margin="0,1.5,6,0" Text="清辉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鹿泽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="浴风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="如年" />
+                        <TextBlock Margin="0,1.5,6,0" Text="四季" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陌客" />
+                        <TextBlock Margin="0,1.5,6,0" Text="团团" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小智" />
+                        <TextBlock Margin="0,1.5,6,0" Text="袄橘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="野夫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="容易" />
+                        <TextBlock Margin="0,1.5,6,0" Text="请问" />
+                        <TextBlock Margin="0,1.5,6,0" Text="丂枧" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十一" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雪儿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星澜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="入机" />
+                        <TextBlock Margin="0,1.5,6,0" Text="影逸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="德丹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="江南" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不弃" />
+                        <TextBlock Margin="0,1.5,6,0" Text="秋水" />
+                        <TextBlock Margin="0,1.5,6,0" Text="辰溪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="淺縹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鱼板" />
+                        <TextBlock Margin="0,1.5,6,0" Text="三高" />
+                        <TextBlock Margin="0,1.5,6,0" Text="羽歌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="素良" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枷勒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="茗茗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="炢曜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="昕瑀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zerb" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Red." />
+                        <TextBlock Margin="0,1.5,6,0" Text="Kzm" />
+                        <TextBlock Margin="0,1.5,6,0" Text="FiTG" />
+                        <TextBlock Margin="0,1.5,6,0" Text="nolv" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HBC" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Dwy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SHN" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lknb" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Z&amp;X" />
+                        <TextBlock Margin="0,1.5,6,0" Text="rEEd" />
+                        <TextBlock Margin="0,1.5,6,0" Text="*****" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Avid" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xccd" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SYW" />
+                        <TextBlock Margin="0,1.5,6,0" Text="XIIIX" />
+                        <TextBlock Margin="0,1.5,6,0" Text="feijh" />
+                        <TextBlock Margin="0,1.5,6,0" Text="suze" />
+                        <TextBlock Margin="0,1.5,6,0" Text="As安" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LTFY" />
+                        <TextBlock Margin="0,1.5,6,0" Text="RAN" />
+                        <TextBlock Margin="0,1.5,6,0" Text="jutqi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="以安." />
+                        <TextBlock Margin="0,1.5,6,0" Text="xiziti" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晴曛." />
+                        <TextBlock Margin="0,1.5,6,0" Text="禺山·" />
+                        <TextBlock Margin="0,1.5,6,0" Text="亦暮." />
+                        <TextBlock Margin="0,1.5,6,0" Text="皮蛋." />
+                        <TextBlock Margin="0,1.5,6,0" Text="OVO" />
+                        <TextBlock Margin="0,1.5,6,0" Text="余悸." />
+                        <TextBlock Margin="0,1.5,6,0" Text="鲸云." />
+                        <TextBlock Margin="0,1.5,6,0" Text="青见." />
+                        <TextBlock Margin="0,1.5,6,0" Text="Zard" />
+                        <TextBlock Margin="0,1.5,6,0" Text="dcds" />
+                        <TextBlock Margin="0,1.5,6,0" Text="gulu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风势." />
+                        <TextBlock Margin="0,1.5,6,0" Text="RTW" />
+                        <TextBlock Margin="0,1.5,6,0" Text="FA洛" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ZZM" />
+                        <TextBlock Margin="0,1.5,6,0" Text="1121" />
+                        <TextBlock Margin="0,1.5,6,0" Text="2555" />
+                        <TextBlock Margin="0,1.5,6,0" Text="5521" />
+                        <TextBlock Margin="0,1.5,6,0" Text="clear" />
+                        <TextBlock Margin="0,1.5,6,0" Text="stear" />
+                        <TextBlock Margin="0,1.5,6,0" Text="OAO" />
+                        <TextBlock Margin="0,1.5,6,0" Text="7794" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ccSis" />
+                        <TextBlock Margin="0,1.5,6,0" Text="[ ]" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TA呀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="QAQ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wear" />
+                        <TextBlock Margin="0,1.5,6,0" Text="7iver" />
+                        <TextBlock Margin="0,1.5,6,0" Text="花***" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Titus" />
+                        <TextBlock Margin="0,1.5,6,0" Text="QAQ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Mzzl" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yana" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风屿i" />
+                        <TextBlock Margin="0,1.5,6,0" Text="L1eu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="1122" />
+                        <TextBlock Margin="0,1.5,6,0" Text="aster" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wind" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Trpw" />
+                        <TextBlock Margin="0,1.5,6,0" Text="N.  Y." />
+                        <TextBlock Margin="0,1.5,6,0" Text="Slryn" />
+                        <TextBlock Margin="0,1.5,6,0" Text="baka" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Gaso" />
+                        <TextBlock Margin="0,1.5,6,0" Text="28.th" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ning" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yang" />
+                        <TextBlock Margin="0,1.5,6,0" Text="echo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Airfri" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kline" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zq.胖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Youz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="a bit." />
+                        <TextBlock Margin="0,1.5,6,0" Text="scsx9" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cy_sk" />
+                        <TextBlock Margin="0,1.5,6,0" Text="旧人°" />
+                        <TextBlock Margin="0,1.5,6,0" Text="joker" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wesh" />
+                        <TextBlock Margin="0,1.5,6,0" Text="excjk" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Beim" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Yang" />
+                        <TextBlock Margin="0,1.5,6,0" Text="DIED" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Alloy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="李_子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zhou" />
+                        <TextBlock Margin="0,1.5,6,0" Text="DOry" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Theo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="karui" />
+                        <TextBlock Margin="0,1.5,6,0" Text="JTDR" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lucky" />
+                        <TextBlock Margin="0,1.5,6,0" Text="peng" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Lxxxx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yusui" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Akira" />
+                        <TextBlock Margin="0,1.5,6,0" Text="⊙v⊙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zzxyz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Exery" />
+                        <TextBlock Margin="0,1.5,6,0" Text="NULL" />
+                        <TextBlock Margin="0,1.5,6,0" Text="F浩华" />
+                        <TextBlock Margin="0,1.5,6,0" Text="mota" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Linxa" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Chen" />
+                        <TextBlock Margin="0,1.5,6,0" Text="WxW" />
+                        <TextBlock Margin="0,1.5,6,0" Text="RooS" />
+                        <TextBlock Margin="0,1.5,6,0" Text="sanlll" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kwiss" />
+                        <TextBlock Margin="0,1.5,6,0" Text="恒星ii" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cuiuc" />
+                        <TextBlock Margin="0,1.5,6,0" Text="0thas" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洛月7" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Kirito" />
+                        <TextBlock Margin="0,1.5,6,0" Text="hush." />
+                        <TextBlock Margin="0,1.5,6,0" Text="crush" />
+                        <TextBlock Margin="0,1.5,6,0" Text="uugg" />
+                        <TextBlock Margin="0,1.5,6,0" Text="chixu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="见see" />
+                        <TextBlock Margin="0,1.5,6,0" Text="bhhh" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ᗜ - ᗜ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="L1NG" />
+                        <TextBlock Margin="0,1.5,6,0" Text="suren" />
+                        <TextBlock Margin="0,1.5,6,0" Text="子渊h" />
+                        <TextBlock Margin="0,1.5,6,0" Text="untcv" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Heart" />
+                        <TextBlock Margin="0,1.5,6,0" Text="YOLO" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ss1Yc" />
+                        <TextBlock Margin="0,1.5,6,0" Text="vihan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="otrgo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="v-000" />
+                        <TextBlock Margin="0,1.5,6,0" Text="oweo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Irving" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Shaqi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="jackly" />
+                        <TextBlock Margin="0,1.5,6,0" Text="落kkk" />
+                        <TextBlock Margin="0,1.5,6,0" Text="revolt" />
+                        <TextBlock Margin="0,1.5,6,0" Text="懂Nat" />
+                        <TextBlock Margin="0,1.5,6,0" Text="末~末" />
+                        <TextBlock Margin="0,1.5,6,0" Text="loooy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="🤜🤛" />
+                        <TextBlock Margin="0,1.5,6,0" Text="友人A" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ZANE" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wocly" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sober" />
+                        <TextBlock Margin="0,1.5,6,0" Text="mmm" />
+                        <TextBlock Margin="0,1.5,6,0" Text="nihao" />
+                        <TextBlock Margin="0,1.5,6,0" Text="李JOE" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ZhiYu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BUGJI" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Toska" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SAFM" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yuybz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="hemo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="legno" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Viego" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ABiYa" />
+                        <TextBlock Margin="0,1.5,6,0" Text="arcsin" />
+                        <TextBlock Margin="0,1.5,6,0" Text="10086" />
+                        <TextBlock Margin="0,1.5,6,0" Text="sadan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xianla" />
+                        <TextBlock Margin="0,1.5,6,0" Text="面羊!!!" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ax1Le" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ezzhu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="88121" />
+                        <TextBlock Margin="0,1.5,6,0" Text="꒰ঌ.໒꒱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="dT-Tb" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Hkar1" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yao18" />
+                        <TextBlock Margin="0,1.5,6,0" Text="QUQT" />
+                        <TextBlock Margin="0,1.5,6,0" Text="YaLan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="XIELX." />
+                        <TextBlock Margin="0,1.5,6,0" Text="azreal" />
+                        <TextBlock Margin="0,1.5,6,0" Text="DBhzl" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ringo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="egg*3" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Nya秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="XUAN" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Pierce" />
+                        <TextBlock Margin="0,1.5,6,0" Text="WaGu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="XuAni" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Do vis" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CRattr" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ZHUO" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Moon" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Igcfitx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="MenG" />
+                        <TextBlock Margin="0,1.5,6,0" Text="YEyun" />
+                        <TextBlock Margin="0,1.5,6,0" Text="x1ang" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Carrot" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ryuyo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雨天凉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="橙纸Fy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="茶茶子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="髅十一" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枫樂喔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鹿一秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风见翎" />
+                        <TextBlock Margin="0,1.5,6,0" Text="村雨喵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小小月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="余朝波" />
+                        <TextBlock Margin="0,1.5,6,0" Text="和睦安" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杨山竹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="水原君" />
+                        <TextBlock Margin="0,1.5,6,0" Text="安洪钬" />
+                        <TextBlock Margin="0,1.5,6,0" Text="椰子粒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="霜天天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="玄无咎" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杨晏殊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="大米粒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="花映塚" />
+                        <TextBlock Margin="0,1.5,6,0" Text="易难离" />
+                        <TextBlock Margin="0,1.5,6,0" Text="李兆宇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="真火菌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="大昊子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="唯此生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="三千页" />
+                        <TextBlock Margin="0,1.5,6,0" Text="皮卡邱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zhihui" />
+                        <TextBlock Margin="0,1.5,6,0" Text="螺蛳粉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="镜像诚" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小烂鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="支离夏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="盐酸棋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杜金峰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="张什雾" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沉之云" />
+                        <TextBlock Margin="0,1.5,6,0" Text="gaaga" />
+                        <TextBlock Margin="0,1.5,6,0" Text="九洲殷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="月芸柔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洛很懒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="愿与愁" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小祭司" />
+                        <TextBlock Margin="0,1.5,6,0" Text="庄子昂" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夏威夷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逍遥叹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一场梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="周好人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="没名字" />
+                        <TextBlock Margin="0,1.5,6,0" Text="马牛逼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="葉龍電" />
+                        <TextBlock Margin="0,1.5,6,0" Text="煮小酒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="相思弦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="刘乙辰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="谢之遥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="吃不饱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="成大力" />
+                        <TextBlock Margin="0,1.5,6,0" Text="嗨嗨嗨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="王小灰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凹兔基" />
+                        <TextBlock Margin="0,1.5,6,0" Text="烂橘子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="达达鸭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="根号柒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="呀哈哈" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ㅤㅤㅤ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="西固图" />
+                        <TextBlock Margin="0,1.5,6,0" Text="心木目" />
+                        <TextBlock Margin="0,1.5,6,0" Text="旅行者" />
+                        <TextBlock Margin="0,1.5,6,0" Text="离别意" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猫猫虫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="严仲书" />
+                        <TextBlock Margin="0,1.5,6,0" Text="毒奶兽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="王语嫣" />
+                        <TextBlock Margin="0,1.5,6,0" Text="磁力场" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨鱼面" />
+                        <TextBlock Margin="0,1.5,6,0" Text="邵梓宸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="澄雪莲" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陌清茗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沐时雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="南天门" />
+                        <TextBlock Margin="0,1.5,6,0" Text="团子喵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="温瞳づ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="黑猪肉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小梨璃" />
+                        <TextBlock Margin="0,1.5,6,0" Text="tttddd" />
+                        <TextBlock Margin="0,1.5,6,0" Text="派大香" />
+                        <TextBlock Margin="0,1.5,6,0" Text="???" />
+                        <TextBlock Margin="0,1.5,6,0" Text="扮袼ه٥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雾与雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杨小狗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木浴花" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小先生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="老农民" />
+                        <TextBlock Margin="0,1.5,6,0" Text="西洲猪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="欲断欲" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一条龙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一口糕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="马铃薯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="遇之幸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="橙叶子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="周鸿渐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小凌远" />
+                        <TextBlock Margin="0,1.5,6,0" Text="下周见" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨玄衍" />
+                        <TextBlock Margin="0,1.5,6,0" Text="穹白百" />
+                        <TextBlock Margin="0,1.5,6,0" Text="勿念丷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="王梓杰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雨遮巷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="恰和日" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晨大帅" />
+                        <TextBlock Margin="0,1.5,6,0" Text="水沐沐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="封不觉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="药成雪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="针叶林" />
+                        <TextBlock Margin="0,1.5,6,0" Text="归零者" />
+                        <TextBlock Margin="0,1.5,6,0" Text="算命的" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晴天雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="囊囔囔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="奇百万" />
+                        <TextBlock Margin="0,1.5,6,0" Text="利晓北" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白洛仟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小小小" />
+                        <TextBlock Margin="0,1.5,6,0" Text="昼予川" />
+                        <TextBlock Margin="0,1.5,6,0" Text="古华北" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洛鸣星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="顾慕秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梧桐语" />
+                        <TextBlock Margin="0,1.5,6,0" Text="屑屑人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="苏陌年" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ABCLF" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十日卜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="朱墨鹮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="欧日zz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="尘世陈" />
+                        <TextBlock Margin="0,1.5,6,0" Text="玄逍子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨笔妍" />
+                        <TextBlock Margin="0,1.5,6,0" Text="藏一码" />
+                        <TextBlock Margin="0,1.5,6,0" Text="狼夫子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="秋灏灏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="社畜雀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="浓盐酸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="轩洛辰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="叁屿山" />
+                        <TextBlock Margin="0,1.5,6,0" Text="深东猫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="寒武纪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="过久失" />
+                        <TextBlock Margin="0,1.5,6,0" Text="赵国豪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="苏辞生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="流泪伏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="烧鹅饭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="怀特酱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="秦健明" />
+                        <TextBlock Margin="0,1.5,6,0" Text="李佳乐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="妃妃子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="朋柯颜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鹤可可" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小小崔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜行天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="羽阡寒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="溯流光" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陆小果" />
+                        <TextBlock Margin="0,1.5,6,0" Text="月无遥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="零陵吆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="幽幽天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="???" />
+                        <TextBlock Margin="0,1.5,6,0" Text="贤霄子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="蔺琳琳" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梦摘星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="王子赫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="常忘忧" />
+                        <TextBlock Margin="0,1.5,6,0" Text="五只羊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="江鸢雪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木叶丸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌国宁" />
+                        <TextBlock Margin="0,1.5,6,0" Text="头疼啊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="应钟七" />
+                        <TextBlock Margin="0,1.5,6,0" Text="happy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白紫橙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星绡碎" />
+                        <TextBlock Margin="0,1.5,6,0" Text="刘煜城" />
+                        <TextBlock Margin="0,1.5,6,0" Text="定风波" />
+                        <TextBlock Margin="0,1.5,6,0" Text="空灬白" />
+                        <TextBlock Margin="0,1.5,6,0" Text="氧化钙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白云飞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沈叙渊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="慕余年" />
+                        <TextBlock Margin="0,1.5,6,0" Text="言洛笙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="徐核弹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="勿忘我" />
+                        <TextBlock Margin="0,1.5,6,0" Text="问世间" />
+                        <TextBlock Margin="0,1.5,6,0" Text="访旋流" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小孤独" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小鲨鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="子斗子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Tiamo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="花江洛" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沐云空" />
+                        <TextBlock Margin="0,1.5,6,0" Text="牛晟旭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="臣子王" />
+                        <TextBlock Margin="0,1.5,6,0" Text="须忖秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="烁斯修" />
+                        <TextBlock Margin="0,1.5,6,0" Text="羡@鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="熊博涵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猫极地" />
+                        <TextBlock Margin="0,1.5,6,0" Text="莫子青" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梓璃懜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="姚骏垚" />
+                        <TextBlock Margin="0,1.5,6,0" Text="岳先生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="野与樊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lingjie" />
+                        <TextBlock Margin="0,1.5,6,0" Text="早餐秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Noctis" />
+                        <TextBlock Margin="0,1.5,6,0" Text="安思卿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杨铭轩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="染空柒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风海潮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="花不语" />
+                        <TextBlock Margin="0,1.5,6,0" Text="淮南宴" />
+                        <TextBlock Margin="0,1.5,6,0" Text="蜉蝶梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="八重樱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="宇瞳瞳" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梦灵痕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="李小枂" />
+                        <TextBlock Margin="0,1.5,6,0" Text="花信风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="衫岳卿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="苏沐风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="是锦葵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="商心慈" />
+                        <TextBlock Margin="0,1.5,6,0" Text="商望潮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鸥文森" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阳竹台" />
+                        <TextBlock Margin="0,1.5,6,0" Text="兲龟夕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="西瓜冰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="悠悠哦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冬眠王" />
+                        <TextBlock Margin="0,1.5,6,0" Text="玻璃茶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="纪筱文" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜气辉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小阿柴" />
+                        <TextBlock Margin="0,1.5,6,0" Text="明天见" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十一月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小海苔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="篆颉尊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="伪冬季" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冬晚檎" />
+                        <TextBlock Margin="0,1.5,6,0" Text="周常安" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一个神" />
+                        <TextBlock Margin="0,1.5,6,0" Text="灵都灵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="奇尔斯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="张三疯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="朝南颜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="迁安途" />
+                        <TextBlock Margin="0,1.5,6,0" Text="すぱる" />
+                        <TextBlock Margin="0,1.5,6,0" Text="却有晴" />
+                        <TextBlock Margin="0,1.5,6,0" Text="咪咪咪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="安徒生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="玉衡猫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="泰利呀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="大金霸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="伊瑟龙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猪猪侠" />
+                        <TextBlock Margin="0,1.5,6,0" Text="月见泠" />
+                        <TextBlock Margin="0,1.5,6,0" Text="装痛苦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="闲人乄" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小萌新" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猪猪侠" />
+                        <TextBlock Margin="0,1.5,6,0" Text="李济雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨无衡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="高东海" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夏安升" />
+                        <TextBlock Margin="0,1.5,6,0" Text="观月瞳" />
+                        <TextBlock Margin="0,1.5,6,0" Text="南方田" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鹤澈澈" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Doom" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冬续逢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="路痴鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="娄梧楼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夏饮子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="糯米糕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木瓜瓜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="你愁啥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ryoryo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="M墨墨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ACzhx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="等舟积" />
+                        <TextBlock Margin="0,1.5,6,0" Text="妄生徒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="奇怪秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="醉繁尘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="澄非橙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="燕回鸿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="祝瑜浩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="狐某某" />
+                        <TextBlock Margin="0,1.5,6,0" Text="在人间" />
+                        <TextBlock Margin="0,1.5,6,0" Text="君莫笑" />
+                        <TextBlock Margin="0,1.5,6,0" Text="李金哲" />
+                        <TextBlock Margin="0,1.5,6,0" Text="付啸宇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晚冬辞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="缪佳泽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="那个人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Beocft" />
+                        <TextBlock Margin="0,1.5,6,0" Text="iehuxs" />
+                        <TextBlock Margin="0,1.5,6,0" Text="RaReg" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SkyLin" />
+                        <TextBlock Margin="0,1.5,6,0" Text="韩立az" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ermite" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Akane" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Fywoo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wqy08" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cheers" />
+                        <TextBlock Margin="0,1.5,6,0" Text="GIEula" />
+                        <TextBlock Margin="0,1.5,6,0" Text="MOYU" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Vector" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Slivevr" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Beater" />
+                        <TextBlock Margin="0,1.5,6,0" Text="leiyuxi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="mc.jlkj" />
+                        <TextBlock Margin="0,1.5,6,0" Text="青峰yh" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Haojie" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Stupid" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zc_159" />
+                        <TextBlock Margin="0,1.5,6,0" Text="XxGou" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Mosky" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ncyyyy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SY星河" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LINLIN" />
+                        <TextBlock Margin="0,1.5,6,0" Text="momo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="离垢23" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zh飞翼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wzlwzl" />
+                        <TextBlock Margin="0,1.5,6,0" Text="闪闪33" />
+                        <TextBlock Margin="0,1.5,6,0" Text="榛子Zz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="StarXC" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Zhaotr" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Algerp" />
+                        <TextBlock Margin="0,1.5,6,0" Text="haiwqi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="DanKe" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ㅤcake" />
+                        <TextBlock Margin="0,1.5,6,0" Text="蓝莓be" />
+                        <TextBlock Margin="0,1.5,6,0" Text="messill" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Syuma" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Whiter" />
+                        <TextBlock Margin="0,1.5,6,0" Text="niesito" />
+                        <TextBlock Margin="0,1.5,6,0" Text="南top1" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ggggg" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cookie" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洛言叶." />
+                        <TextBlock Margin="0,1.5,6,0" Text="joeson" />
+                        <TextBlock Margin="0,1.5,6,0" Text="落雨ljd" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Adrem" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Z y o e" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Aether" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AyuAn" />
+                        <TextBlock Margin="0,1.5,6,0" Text="moose" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ckyasb" />
+                        <TextBlock Margin="0,1.5,6,0" Text="K2CO3" />
+                        <TextBlock Margin="0,1.5,6,0" Text="二柑心." />
+                        <TextBlock Margin="0,1.5,6,0" Text="chouzi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Alayna" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ba77er" />
+                        <TextBlock Margin="0,1.5,6,0" Text="sutang" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BOXER" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Genius" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Aurora" />
+                        <TextBlock Margin="0,1.5,6,0" Text="gzuani" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kraken" />
+                        <TextBlock Margin="0,1.5,6,0" Text="真壁 祭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cccis3c" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Lemon" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LEmon" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Aurora" />
+                        <TextBlock Margin="0,1.5,6,0" Text="redfish" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冰-_-澜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="notfun" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ahsian" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ppxxfb" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cBecky" />
+                        <TextBlock Margin="0,1.5,6,0" Text="丶SXFT" />
+                        <TextBlock Margin="0,1.5,6,0" Text="菜鸟vH" />
+                        <TextBlock Margin="0,1.5,6,0" Text="萧1314" />
+                        <TextBlock Margin="0,1.5,6,0" Text="MNAH" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Hill233" />
+                        <TextBlock Margin="0,1.5,6,0" Text="emmm" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Tzzlina" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Aolsais" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xiaowa" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Mejory" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Lucyna" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陈长🏀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="chen新" />
+                        <TextBlock Margin="0,1.5,6,0" Text="OUYOL" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HuiNik" />
+                        <TextBlock Margin="0,1.5,6,0" Text="forever" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ameng" />
+                        <TextBlock Margin="0,1.5,6,0" Text="amtam" />
+                        <TextBlock Margin="0,1.5,6,0" Text="hbycc1" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sunyyy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Atsuko" />
+                        <TextBlock Margin="0,1.5,6,0" Text="seeyou" />
+                        <TextBlock Margin="0,1.5,6,0" Text="mcRt菌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Leo728" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Skyline" />
+                        <TextBlock Margin="0,1.5,6,0" Text="WangS" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Cavalei" />
+                        <TextBlock Margin="0,1.5,6,0" Text="114514" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ZHIZHI" />
+                        <TextBlock Margin="0,1.5,6,0" Text="mc地图" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yui岑秒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="123456" />
+                        <TextBlock Margin="0,1.5,6,0" Text="one_fw" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Salovzf" />
+                        <TextBlock Margin="0,1.5,6,0" Text="030228" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Zipang" />
+                        <TextBlock Margin="0,1.5,6,0" Text="敖昀wu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="fyaccto" />
+                        <TextBlock Margin="0,1.5,6,0" Text="big red" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ash和C" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ZYHJIU" />
+                        <TextBlock Margin="0,1.5,6,0" Text="348535" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Kanniu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Nayuta" />
+                        <TextBlock Margin="0,1.5,6,0" Text="114514" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sharon" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yumusi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AHong" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ops626" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Madao" />
+                        <TextBlock Margin="0,1.5,6,0" Text="665352" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Buffalo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="璃音_YL" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sakana" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yuchen" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HKHCC" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CheNg." />
+                        <TextBlock Margin="0,1.5,6,0" Text="sky小申" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sabuce" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zyjᥫ᭡້໌ᮨ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ssootto" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Kabuto" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Nebula" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BHXUU" />
+                        <TextBlock Margin="0,1.5,6,0" Text="apostle" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TagGift" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LAOLIU" />
+                        <TextBlock Margin="0,1.5,6,0" Text="FY-GHT" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Suzune" />
+                        <TextBlock Margin="0,1.5,6,0" Text="upiotes" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CCTY10" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TongF0" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ICARUS" />
+                        <TextBlock Margin="0,1.5,6,0" Text="骆驼🐫." />
+                        <TextBlock Margin="0,1.5,6,0" Text="Autism." />
+                        <TextBlock Margin="0,1.5,6,0" Text="lahdow" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Enmojy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ZXZXW" />
+                        <TextBlock Margin="0,1.5,6,0" Text="龙猫fan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="GUAAA" />
+                        <TextBlock Margin="0,1.5,6,0" Text="9拾爱柒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="poposjj" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LiCaner" />
+                        <TextBlock Margin="0,1.5,6,0" Text="VICyolo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SprataS" />
+                        <TextBlock Margin="0,1.5,6,0" Text="reokied" />
+                        <TextBlock Margin="0,1.5,6,0" Text="getweft" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Winnie." />
+                        <TextBlock Margin="0,1.5,6,0" Text="ninabai" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Chan9e" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cheems" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Chakrla" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sinking" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ausnan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="weieiyu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="MEASH" />
+                        <TextBlock Margin="0,1.5,6,0" Text="迷雾Orz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Meieier" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ricardo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lemuria" />
+                        <TextBlock Margin="0,1.5,6,0" Text="smzdby" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Akokko" />
+                        <TextBlock Margin="0,1.5,6,0" Text="王ZEAN" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Fbrave9" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BUQing" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Airyhua" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Forever." />
+                        <TextBlock Margin="0,1.5,6,0" Text="ahadbd" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Lysance" />
+                        <TextBlock Margin="0,1.5,6,0" Text="周xiaxia" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿江233" />
+                        <TextBlock Margin="0,1.5,6,0" Text="origami" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Zone0o" />
+                        <TextBlock Margin="0,1.5,6,0" Text="დ᭄ꦿ꧔ꦿ℘⸙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="fhz2000" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Unicorn" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Frimella" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CHenLV" />
+                        <TextBlock Margin="0,1.5,6,0" Text="GDI枪王" />
+                        <TextBlock Margin="0,1.5,6,0" Text="orlando" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Palaoye" />
+                        <TextBlock Margin="0,1.5,6,0" Text="℘小꧔ꦿ艾℘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xxx1742" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Thomas" />
+                        <TextBlock Margin="0,1.5,6,0" Text="D1mien" />
+                        <TextBlock Margin="0,1.5,6,0" Text="诚山ovo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无常ovo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Luca_86" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ahmink" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lengruo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TheEyer" />
+                        <TextBlock Margin="0,1.5,6,0" Text="bwtyyds" />
+                        <TextBlock Margin="0,1.5,6,0" Text="tomoon" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HRbovo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="寒风EAE" />
+                        <TextBlock Margin="0,1.5,6,0" Text="时雨0vO" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Twilight" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Dwarm_" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cr0ssing" />
+                        <TextBlock Margin="0,1.5,6,0" Text="好(✪▽✪)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="文见mm" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ayin233" />
+                        <TextBlock Margin="0,1.5,6,0" Text="NLE阿笙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="br88888" />
+                        <TextBlock Margin="0,1.5,6,0" Text="hachimi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HarryYU" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Promise" />
+                        <TextBlock Margin="0,1.5,6,0" Text="GOTWH" />
+                        <TextBlock Margin="0,1.5,6,0" Text="morpho" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枫雨_AD" />
+                        <TextBlock Margin="0,1.5,6,0" Text="aiheiyds" />
+                        <TextBlock Margin="0,1.5,6,0" Text="pikimao" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Linevray" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Alm坑骑" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BAY微分" />
+                        <TextBlock Margin="0,1.5,6,0" Text="GL_1238" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Byebdjd" />
+                        <TextBlock Margin="0,1.5,6,0" Text="IEO1720" />
+                        <TextBlock Margin="0,1.5,6,0" Text="banxing" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ENTITEY" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Rowling" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AnHuiai" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AllDone" />
+                        <TextBlock Margin="0,1.5,6,0" Text="GarQAQ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Tiansiyu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Peter-W" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Dq-yyds" />
+                        <TextBlock Margin="0,1.5,6,0" Text="WK3535" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逆转疑风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="刀锻大大" />
+                        <TextBlock Margin="0,1.5,6,0" Text="莱茵奶龙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="满目怡情" />
+                        <TextBlock Margin="0,1.5,6,0" Text="这是火星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="咸鱼非酋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="本命东方" />
+                        <TextBlock Margin="0,1.5,6,0" Text="笨蛋白给" />
+                        <TextBlock Margin="0,1.5,6,0" Text="威不足道" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不愿逆流" />
+                        <TextBlock Margin="0,1.5,6,0" Text="QAQ233" />
+                        <TextBlock Margin="0,1.5,6,0" Text="君子如墨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="咖啡麦片" />
+                        <TextBlock Margin="0,1.5,6,0" Text="dailnmn" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yasukon" />
+                        <TextBlock Margin="0,1.5,6,0" Text="希望之星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="哦呀哦呀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雨客纸鸢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木木木不" />
+                        <TextBlock Margin="0,1.5,6,0" Text="方块万岁" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鳄鱼藤椒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="流水清心" />
+                        <TextBlock Margin="0,1.5,6,0" Text="PreMors" />
+                        <TextBlock Margin="0,1.5,6,0" Text="理塘王源" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雨墨之声" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白衣沾酒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="四氯锌酸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="狐神白桜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="L1nNian" />
+                        <TextBlock Margin="0,1.5,6,0" Text="芙芙雪糕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="长乐未央" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晚星就位" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雨渃江南" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无妄生欢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鲨鱼辣椒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="秋飞沧海" />
+                        <TextBlock Margin="0,1.5,6,0" Text="天名亡灵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌源羡辰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="棱镜凌空" />
+                        <TextBlock Margin="0,1.5,6,0" Text="烟雨江南" />
+                        <TextBlock Margin="0,1.5,6,0" Text="核能狐狸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="明涛兄弟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="可乐霸主" />
+                        <TextBlock Margin="0,1.5,6,0" Text="隋彧而安" />
+                        <TextBlock Margin="0,1.5,6,0" Text="游子忘也" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌之殇血" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一只萃香" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星辰幻梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风与梧桐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="包子打狗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逆境荒野" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨羽云尘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="榴莲千层" />
+                        <TextBlock Margin="0,1.5,6,0" Text="秋水长天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="简直可怕" />
+                        <TextBlock Margin="0,1.5,6,0" Text="岩壑之崩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌羽夜轩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="栀寒老酒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="友友友利" />
+                        <TextBlock Margin="0,1.5,6,0" Text="学费太贵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小苗同学" />
+                        <TextBlock Margin="0,1.5,6,0" Text="寂寞之日" />
+                        <TextBlock Margin="0,1.5,6,0" Text="云起风吟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沉沦无上" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不知道呢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鲸鱼家族" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白井黑子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梦境旅者" />
+                        <TextBlock Margin="0,1.5,6,0" Text="深爱着的" />
+                        <TextBlock Margin="0,1.5,6,0" Text="九月廿六" />
+                        <TextBlock Margin="0,1.5,6,0" Text="指鹿为马" />
+                        <TextBlock Margin="0,1.5,6,0" Text="泠鸢七弦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="苦命鸳鸯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鸡蛋壳子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="百变土鸡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我是小张" />
+                        <TextBlock Margin="0,1.5,6,0" Text="浮生如梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木已尘封" />
+                        <TextBlock Margin="0,1.5,6,0" Text="萧菓了菓" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雪路飘渺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="岩旅库雫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="年末小凯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="霜霜霜啊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一介俗子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="くらやみ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="文化老六" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逍遥小青" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一个花卷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枫叶落子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白给论语" />
+                        <TextBlock Margin="0,1.5,6,0" Text="辰铭辰尘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="深于LAN" />
+                        <TextBlock Margin="0,1.5,6,0" Text="那年盛夏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="有事掘坟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="错过了。" />
+                        <TextBlock Margin="0,1.5,6,0" Text="规模猪肉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白首迟暮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="浮旧浮梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="好想发癫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="年少不知" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鲨掉七号" />
+                        <TextBlock Margin="0,1.5,6,0" Text="永生君王" />
+                        <TextBlock Margin="0,1.5,6,0" Text="秋语随风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="南北绿豆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="做我的猫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="牛肉炖汤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="数学不难" />
+                        <TextBlock Margin="0,1.5,6,0" Text="月与梧桐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="余念望希" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猫眼新手" />
+                        <TextBlock Margin="0,1.5,6,0" Text="幻羽絮语" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白夜雨游" />
+                        <TextBlock Margin="0,1.5,6,0" Text="暂未想好" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无烬极昭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="物极必反" />
+                        <TextBlock Margin="0,1.5,6,0" Text="百般无聊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="蜂蜜特饮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="春阳遇巧" />
+                        <TextBlock Margin="0,1.5,6,0" Text="哈基米德" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一条咸鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="古风小生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="健健康康" />
+                        <TextBlock Margin="0,1.5,6,0" Text="宵烟花宫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="西贝与猪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="光鸢奇迹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="永世流传" />
+                        <TextBlock Margin="0,1.5,6,0" Text="缘随风来" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晨失落烟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="半盏孤灯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Summer" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜屿清风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一滩鸽子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌雨尘霄" />
+                        <TextBlock Margin="0,1.5,6,0" Text="炉管仙人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="千本双叶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="RINZAKI" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿里嘎多" />
+                        <TextBlock Margin="0,1.5,6,0" Text="文过饰非" />
+                        <TextBlock Margin="0,1.5,6,0" Text="西风没马" />
+                        <TextBlock Margin="0,1.5,6,0" Text="太过分辣" />
+                        <TextBlock Margin="0,1.5,6,0" Text="静态佬石" />
+                        <TextBlock Margin="0,1.5,6,0" Text="独孤卡尔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="玖玖玖辞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ㅤANAO" />
+                        <TextBlock Margin="0,1.5,6,0" Text="达瓦里氏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="华伦斯坦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十方封尘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="致爱丽丝" />
+                        <TextBlock Margin="0,1.5,6,0" Text="暮雪白日" />
+                        <TextBlock Margin="0,1.5,6,0" Text="黑拟小息" />
+                        <TextBlock Margin="0,1.5,6,0" Text="牛津领主" />
+                        <TextBlock Margin="0,1.5,6,0" Text="姚控飞机" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小气芭拉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="吞星之鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="炫不改非" />
+                        <TextBlock Margin="0,1.5,6,0" Text="东西不识" />
+                        <TextBlock Margin="0,1.5,6,0" Text="长亭已过" />
+                        <TextBlock Margin="0,1.5,6,0" Text="吃饭叫我" />
+                        <TextBlock Margin="0,1.5,6,0" Text="三世简明" />
+                        <TextBlock Margin="0,1.5,6,0" Text="北道延安" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洛雨下雾" />
+                        <TextBlock Margin="0,1.5,6,0" Text="山海观雾" />
+                        <TextBlock Margin="0,1.5,6,0" Text="矜言薄晔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="老羊肖恩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="狒话少说" />
+                        <TextBlock Margin="0,1.5,6,0" Text="离谱带师" />
+                        <TextBlock Margin="0,1.5,6,0" Text="云生浅梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星辰慕冷" />
+                        <TextBlock Margin="0,1.5,6,0" Text="绵延山脉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="浅安的浅" />
+                        <TextBlock Margin="0,1.5,6,0" Text="远山半醉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="胡桃夹子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="歪币巴卜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猪猪同学" />
+                        <TextBlock Margin="0,1.5,6,0" Text="折纸信笺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="南方嘉木" />
+                        <TextBlock Margin="0,1.5,6,0" Text="欧刃赛卌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="岁月静好" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白日做梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="半岛铁头" />
+                        <TextBlock Margin="0,1.5,6,0" Text="朽梦挽歌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晓峰昭苏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="清灵南玫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冻梨先生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="韭菜赫子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="自主进食" />
+                        <TextBlock Margin="0,1.5,6,0" Text="黄不赌毒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="芋泥叨叨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="废物点心" />
+                        <TextBlock Margin="0,1.5,6,0" Text="乾黔阙辞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="三五七言" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一只流萤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="斗神之神" />
+                        <TextBlock Margin="0,1.5,6,0" Text="故年清梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xiao郑至" />
+                        <TextBlock Margin="0,1.5,6,0" Text="宇落天穹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="氮气炸锅" />
+                        <TextBlock Margin="0,1.5,6,0" Text="火喷柿子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="君子随心" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星梦光辉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="灿若星河" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨下神轩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="冬十幻境" />
+                        <TextBlock Margin="0,1.5,6,0" Text="内鬼头子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十月良生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜行刀狼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="渊醉英雄" />
+                        <TextBlock Margin="0,1.5,6,0" Text="嚜嚜石膏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="童年小阳" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kongbai" />
+                        <TextBlock Margin="0,1.5,6,0" Text="相对无言" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晨曦将至" />
+                        <TextBlock Margin="0,1.5,6,0" Text="|樊谦谦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="途遇故人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="爱莉希雅" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿莫西林" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猫头骑士" />
+                        <TextBlock Margin="0,1.5,6,0" Text="嘟里嘟气" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白色咸鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="月华含光" />
+                        <TextBlock Margin="0,1.5,6,0" Text="古月方源" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夏恋烟火" />
+                        <TextBlock Margin="0,1.5,6,0" Text="寒宫多叶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="山狐城孤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="魅魔栋栋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="三体永存" />
+                        <TextBlock Margin="0,1.5,6,0" Text="烟雨江南" />
+                        <TextBlock Margin="0,1.5,6,0" Text="唯我清泉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="空空如也" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风扬尘起" />
+                        <TextBlock Margin="0,1.5,6,0" Text="莫问归期" />
+                        <TextBlock Margin="0,1.5,6,0" Text="好好吃药" />
+                        <TextBlock Margin="0,1.5,6,0" Text="五好青年" />
+                        <TextBlock Margin="0,1.5,6,0" Text="男鹿辰巳" />
+                        <TextBlock Margin="0,1.5,6,0" Text="犭纟纟犭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="爱电豆豆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="汐汐公主" />
+                        <TextBlock Margin="0,1.5,6,0" Text="念念不忘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="孤城夜雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="联合三七" />
+                        <TextBlock Margin="0,1.5,6,0" Text="酒心可可" />
+                        <TextBlock Margin="0,1.5,6,0" Text="抒情呆毛" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xiaqi121" />
+                        <TextBlock Margin="0,1.5,6,0" Text="深邃星空" />
+                        <TextBlock Margin="0,1.5,6,0" Text="柒月伴生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="倒头就睡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="故国神游" />
+                        <TextBlock Margin="0,1.5,6,0" Text="早川只因" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨痴樾峰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="莱塔洛斯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="御龙必成" />
+                        <TextBlock Margin="0,1.5,6,0" Text="奥古斯汀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="南鸢离梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="九世惡果" />
+                        <TextBlock Margin="0,1.5,6,0" Text="醉卧沙场" />
+                        <TextBlock Margin="0,1.5,6,0" Text="余与雨上" />
+                        <TextBlock Margin="0,1.5,6,0" Text="咸鱼舰长" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晓月之光" />
+                        <TextBlock Margin="0,1.5,6,0" Text="云南白药" />
+                        <TextBlock Margin="0,1.5,6,0" Text="心海幻想" />
+                        <TextBlock Margin="0,1.5,6,0" Text="叶芷戾天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="代桃梦影" />
+                        <TextBlock Margin="0,1.5,6,0" Text="绿叶晴空" />
+                        <TextBlock Margin="0,1.5,6,0" Text="文柳居士" />
+                        <TextBlock Margin="0,1.5,6,0" Text="封灵云天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="赤鸢仙人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="浪漫古士" />
+                        <TextBlock Margin="0,1.5,6,0" Text="苍白之空" />
+                        <TextBlock Margin="0,1.5,6,0" Text="火焰炎风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="懒人一个" />
+                        <TextBlock Margin="0,1.5,6,0" Text="淋潇烟柔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="再次伟大" />
+                        <TextBlock Margin="0,1.5,6,0" Text="东缺海鸥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="道陆玄烬" />
+                        <TextBlock Margin="0,1.5,6,0" Text="死幻安生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="曼波曼波" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Madoka" />
+                        <TextBlock Margin="0,1.5,6,0" Text="欧阳缺德" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白云苍狗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="三颗飞星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="花之潮汐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Time Up" />
+                        <TextBlock Margin="0,1.5,6,0" Text="金木文雄" />
+                        <TextBlock Margin="0,1.5,6,0" Text="失物招领" />
+                        <TextBlock Margin="0,1.5,6,0" Text="真仙杨小" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不想取名" />
+                        <TextBlock Margin="0,1.5,6,0" Text="彼岸多闻" />
+                        <TextBlock Margin="0,1.5,6,0" Text="泡泡茶壶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="菠萝盖饭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="山水鹤梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="枯叶火心" />
+                        <TextBlock Margin="0,1.5,6,0" Text="茶子千鹤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="起源之间" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌元君君" />
+                        <TextBlock Margin="0,1.5,6,0" Text="涂山寒梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小小夏野" />
+                        <TextBlock Margin="0,1.5,6,0" Text="流水化月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨绿之韵" />
+                        <TextBlock Margin="0,1.5,6,0" Text="落笔知秋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="柠月如風" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杰克俊曼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="MaBaKa" />
+                        <TextBlock Margin="0,1.5,6,0" Text="山栀川柏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="哆啦库梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="True1on" />
+                        <TextBlock Margin="0,1.5,6,0" Text="笔墨山河" />
+                        <TextBlock Margin="0,1.5,6,0" Text="初闻林北" />
+                        <TextBlock Margin="0,1.5,6,0" Text="晏李白泽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="春末雨夏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="墨书年华" />
+                        <TextBlock Margin="0,1.5,6,0" Text="百战不跆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="辛不是新" />
+                        <TextBlock Margin="0,1.5,6,0" Text="非常新意" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一只企鹅" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不留余念" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陈皮鸡蛋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="悠游岁月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CuH棕土" />
+                        <TextBlock Margin="0,1.5,6,0" Text="寒霜qwq" />
+                        <TextBlock Margin="0,1.5,6,0" Text="传单OvO" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Relieved" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Heliolite" />
+                        <TextBlock Margin="0,1.5,6,0" Text="八月月ya" />
+                        <TextBlock Margin="0,1.5,6,0" Text="YcsYwag" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Zhuant1" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ayanami" />
+                        <TextBlock Margin="0,1.5,6,0" Text="DFanger" />
+                        <TextBlock Margin="0,1.5,6,0" Text="allMagic" />
+                        <TextBlock Margin="0,1.5,6,0" Text="REMOTE" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TAT_TAT" />
+                        <TextBlock Margin="0,1.5,6,0" Text="mita的米" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Light_Cn" />
+                        <TextBlock Margin="0,1.5,6,0" Text="14recetti" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CO2_996" />
+                        <TextBlock Margin="0,1.5,6,0" Text="suojiang" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Feidemu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="GuanDN" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Allen505" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我推:古见" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Duunam" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HLK2233" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白玄.雪狼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Echo-cat" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Mikeboy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xiao_zuo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Angelica" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Ultimaya" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Chimney" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陌然·百川" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星汐·云澜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="huhaaaa" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Liriummi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="shenxiny" />
+                        <TextBlock Margin="0,1.5,6,0" Text="木镐子XY" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wws2009" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Tanikaze" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LLOKVRE" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sonatina" />
+                        <TextBlock Margin="0,1.5,6,0" Text="mc00511" />
+                        <TextBlock Margin="0,1.5,6,0" Text="dokidoki" />
+                        <TextBlock Margin="0,1.5,6,0" Text="moudele" />
+                        <TextBlock Margin="0,1.5,6,0" Text="urobolos" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Bohemia" />
+                        <TextBlock Margin="0,1.5,6,0" Text="树叶擦Pp" />
+                        <TextBlock Margin="0,1.5,6,0" Text=" 止于永辉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="amshwlb" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Drizzle轩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="DanmLei" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Aipotu呇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Tanikaze" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wu15362" />
+                        <TextBlock Margin="0,1.5,6,0" Text="MURRAY" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Railsucer" />
+                        <TextBlock Margin="0,1.5,6,0" Text="hengjimi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="人心难测i" />
+                        <TextBlock Margin="0,1.5,6,0" Text="啦啦啦🌟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Bobsteve" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sansnam" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Petrichor" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zth12138" />
+                        <TextBlock Margin="0,1.5,6,0" Text="M_mcjsw" />
+                        <TextBlock Margin="0,1.5,6,0" Text="JOJOJoss" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zdf13161" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yijianmei" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zhiaizirui" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SCPWWL" />
+                        <TextBlock Margin="0,1.5,6,0" Text="asoftwan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="泠鸢Clear" />
+                        <TextBlock Margin="0,1.5,6,0" Text="klgb2025" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Lengsy23" />
+                        <TextBlock Margin="0,1.5,6,0" Text="qingfeng" />
+                        <TextBlock Margin="0,1.5,6,0" Text="KlinsZera" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Brad Gao" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Jmochoo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CHEN.J.H" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sisiyphus" />
+                        <TextBlock Margin="0,1.5,6,0" Text="NGC6503" />
+                        <TextBlock Margin="0,1.5,6,0" Text="龙影Kage" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Mike茶茶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Marrakes" />
+                        <TextBlock Margin="0,1.5,6,0" Text="hero_boy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Kreamzfy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BUMARO" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Hishabby" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Alans1gn" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Zikyeung" />
+                        <TextBlock Margin="0,1.5,6,0" Text="汐翎Xling" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜斗Deity" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Endxiang" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LuoHong" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Mouse_H" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Megamix" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星光Stralt" />
+                        <TextBlock Margin="0,1.5,6,0" Text="rainbowk" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Qing said" />
+                        <TextBlock Margin="0,1.5,6,0" Text="haolanne" />
+                        <TextBlock Margin="0,1.5,6,0" Text="dio小面包" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Yimikong" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xiaoxin47" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TheApros" />
+                        <TextBlock Margin="0,1.5,6,0" Text="smallzero" />
+                        <TextBlock Margin="0,1.5,6,0" Text="玄墨Crazy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AAxolotls" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yshdjgfsd" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zzmmjj66" />
+                        <TextBlock Margin="0,1.5,6,0" Text="坑坑suki~" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cerf6kzlm" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Thagirion" />
+                        <TextBlock Margin="0,1.5,6,0" Text="B站宅小猩" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LURENQP" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zhao9662" />
+                        <TextBlock Margin="0,1.5,6,0" Text="looting01" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Allen Cao" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AzureStar" />
+                        <TextBlock Margin="0,1.5,6,0" Text="桃苏苏吖o" />
+                        <TextBlock Margin="0,1.5,6,0" Text="nepenthe" />
+                        <TextBlock Margin="0,1.5,6,0" Text="mmmmm" />
+                        <TextBlock Margin="0,1.5,6,0" Text="故里乡112" />
+                        <TextBlock Margin="0,1.5,6,0" Text="_syrii蟠桃_" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Lsmufeng" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Enasnieht" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ChaPurral" />
+                        <TextBlock Margin="0,1.5,6,0" Text="minglipro" />
+                        <TextBlock Margin="0,1.5,6,0" Text="᭄ཽ࿆等*风࿐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我叫阿乐~" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洛泠LoRin" />
+                        <TextBlock Margin="0,1.5,6,0" Text="老毛豆213" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ridiculous" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Kaorurem" />
+                        <TextBlock Margin="0,1.5,6,0" Text="hongfeng" />
+                        <TextBlock Margin="0,1.5,6,0" Text="喜欢柚子O" />
+                        <TextBlock Margin="0,1.5,6,0" Text="apple_cell" />
+                        <TextBlock Margin="0,1.5,6,0" Text="71FOR3ST" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TRIM5829" />
+                        <TextBlock Margin="0,1.5,6,0" Text="QinYu_Liu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sophia_鲲" />
+                        <TextBlock Margin="0,1.5,6,0" Text="手抓饼ovo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Mr-桂花酒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星屿 Staris" />
+                        <TextBlock Margin="0,1.5,6,0" Text="muhuixue" />
+                        <TextBlock Margin="0,1.5,6,0" Text="pkq皮卡丘" />
+                        <TextBlock Margin="0,1.5,6,0" Text="培培塔tata" />
+                        <TextBlock Margin="0,1.5,6,0" Text="aishunybz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="huahua39" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SuperXBD" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ฅ(*°ω°*ฅ)*" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HereBlack" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Eastmelan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BraveBulls" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Forlusama" />
+                        <TextBlock Margin="0,1.5,6,0" Text="A_Ling233" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Cup_paprr" />
+                        <TextBlock Margin="0,1.5,6,0" Text="NuanNiao" />
+                        <TextBlock Margin="0,1.5,6,0" Text="sprite0301" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Hakusawa" />
+                        <TextBlock Margin="0,1.5,6,0" Text="baizhe237" />
+                        <TextBlock Margin="0,1.5,6,0" Text="k1ssPeach" />
+                        <TextBlock Margin="0,1.5,6,0" Text="T O M老师" />
+                        <TextBlock Margin="0,1.5,6,0" Text="standQAQ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一直在流泪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="XiaoLe_SH" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ys_huoyan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我是桶子哥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="想不到名字" />
+                        <TextBlock Margin="0,1.5,6,0" Text="洗头佬药锭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌点工作室" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不吃白不吃" />
+                        <TextBlock Margin="0,1.5,6,0" Text="超级大月光" />
+                        <TextBlock Margin="0,1.5,6,0" Text="锋锋锋锋刺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="虚无中的气" />
+                        <TextBlock Margin="0,1.5,6,0" Text="飞天猪头怪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="可恶的一瓶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一两桃花酿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不眠歇逼了" />
+                        <TextBlock Margin="0,1.5,6,0" Text="乙酸乙烯酯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="腾飞在天空" />
+                        <TextBlock Margin="0,1.5,6,0" Text="龙庙彭于晏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="豪豪好先生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="是折木木阿" />
+                        <TextBlock Margin="0,1.5,6,0" Text="四叶棱镜花" />
+                        <TextBlock Margin="0,1.5,6,0" Text="无畏的林可" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一个大白泽" />
+                        <TextBlock Margin="0,1.5,6,0" Text="MCYKJ666" />
+                        <TextBlock Margin="0,1.5,6,0" Text="音黎爱玩机" />
+                        <TextBlock Margin="0,1.5,6,0" Text="青色小鲨鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TNTKarma" />
+                        <TextBlock Margin="0,1.5,6,0" Text="明天会更好" />
+                        <TextBlock Margin="0,1.5,6,0" Text="爱吃大橙子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="狗不理鲨鲨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="有趣的尸体" />
+                        <TextBlock Margin="0,1.5,6,0" Text="学海永无崖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="记得加备注" />
+                        <TextBlock Margin="0,1.5,6,0" Text="橙子巧克力" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜繁星落海" />
+                        <TextBlock Margin="0,1.5,6,0" Text="二向箔面包" />
+                        <TextBlock Margin="0,1.5,6,0" Text="三思而后行" />
+                        <TextBlock Margin="0,1.5,6,0" Text="哲哲爱晴晴" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我是你爸爸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="克莉斯蒂娜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="缘来天注定" />
+                        <TextBlock Margin="0,1.5,6,0" Text="含笑的波浪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="缘的一条鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="喜多不郁代" />
+                        <TextBlock Margin="0,1.5,6,0" Text="啥名都不过" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风岚无言天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="水漾月微醺" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猫猫终结者" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沉默的路人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="永远缺素材" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不知鬼的鬼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="爱吃螺蛳粉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="睡到自然醒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="汉书五行志" />
+                        <TextBlock Margin="0,1.5,6,0" Text="重阳楼外楼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="青衫生润知" />
+                        <TextBlock Margin="0,1.5,6,0" Text="能不能理智" />
+                        <TextBlock Margin="0,1.5,6,0" Text="暖她一整天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="超神与铁锅" />
+                        <TextBlock Margin="0,1.5,6,0" Text="沐云雾怒斯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zen1th999" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿墨想吃鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="远枫恋红蝶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="借一缕时光" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小幽帅帅哒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="最爱の香香" />
+                        <TextBlock Margin="0,1.5,6,0" Text="古明地恋恋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="怠惰的刻时" />
+                        <TextBlock Margin="0,1.5,6,0" Text="睡不醒一点" />
+                        <TextBlock Margin="0,1.5,6,0" Text="你说呢胶水" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小永忆江南" />
+                        <TextBlock Margin="0,1.5,6,0" Text="约德尔悍匪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Four14760" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星星不在天" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小然软乎乎" />
+                        <TextBlock Margin="0,1.5,6,0" Text="指尖彡流年" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杰克丹姆斯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="江东五五开" />
+                        <TextBlock Margin="0,1.5,6,0" Text="飙车的河神" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿成猫猫侠" />
+                        <TextBlock Margin="0,1.5,6,0" Text="烛星不是星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="香的掉渣菇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="千年老陈醋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="喜欢旧事物" />
+                        <TextBlock Margin="0,1.5,6,0" Text="美高阿克曼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="泽泽很不错" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白夜花花花" />
+                        <TextBlock Margin="0,1.5,6,0" Text="帅到被人砍" />
+                        <TextBlock Margin="0,1.5,6,0" Text="世界在眼前" />
+                        <TextBlock Margin="0,1.5,6,0" Text="苦命的孩纸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="水离子喔豁" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我爱你羊羔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="地狱的变暖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一位建筑残" />
+                        <TextBlock Margin="0,1.5,6,0" Text="假日威龙陈" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凉凉凉凉凉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="卡萨布兰卡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鸢尾的指挥" />
+                        <TextBlock Margin="0,1.5,6,0" Text="笨蛋失眠曲" />
+                        <TextBlock Margin="0,1.5,6,0" Text="维克多雨火" />
+                        <TextBlock Margin="0,1.5,6,0" Text="麻辣关东煮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="WhiteSaro" />
+                        <TextBlock Margin="0,1.5,6,0" Text="东源落日雪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="惊喜热干面" />
+                        <TextBlock Margin="0,1.5,6,0" Text="天冷不洗手" />
+                        <TextBlock Margin="0,1.5,6,0" Text="骑驴下江南" />
+                        <TextBlock Margin="0,1.5,6,0" Text="锤飞你是我" />
+                        <TextBlock Margin="0,1.5,6,0" Text="所念皆星河" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小小魔法师" />
+                        <TextBlock Margin="0,1.5,6,0" Text="好人不偿命" />
+                        <TextBlock Margin="0,1.5,6,0" Text="宋沙沙将军" />
+                        <TextBlock Margin="0,1.5,6,0" Text="芥末沐浴露" />
+                        <TextBlock Margin="0,1.5,6,0" Text="爱吃羊的鸡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="很酷好不好" />
+                        <TextBlock Margin="0,1.5,6,0" Text="百鬼阿库娅" />
+                        <TextBlock Margin="0,1.5,6,0" Text="さようなら" />
+                        <TextBlock Margin="0,1.5,6,0" Text="北冥有鱼乀" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风总该自由" />
+                        <TextBlock Margin="0,1.5,6,0" Text="。。。。。" />
+                        <TextBlock Margin="0,1.5,6,0" Text="奢望沈幼楚" />
+                        <TextBlock Margin="0,1.5,6,0" Text="世界年轻时" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿尔托莉雅" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我已经躺平" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我叫江小白" />
+                        <TextBlock Margin="0,1.5,6,0" Text="杀生入轮回" />
+                        <TextBlock Margin="0,1.5,6,0" Text="谁有我皮呢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="技术网最棒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="亜衣酱油瓶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="流年乍思雨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="StellarDoll" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鸽子子子子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猫猫雫羽咔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="吴糖味可乐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="前方已无人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="陨落小笨蛋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Thousumy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="睡不够张张" />
+                        <TextBlock Margin="0,1.5,6,0" Text="妙味脆脆鲨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="执琴不是勤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小路啦啦啦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="明日香大王" />
+                        <TextBlock Margin="0,1.5,6,0" Text="落子木木木" />
+                        <TextBlock Margin="0,1.5,6,0" Text="尘枫maple" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白瓷梅子汤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不要吃冰箱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="何以断倾伤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一三五陆七" />
+                        <TextBlock Margin="0,1.5,6,0" Text="三火可燃冰" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不是哥们?" />
+                        <TextBlock Margin="0,1.5,6,0" Text="下北泽红茶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="chy125430" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿sir别抓我" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Flippedxxx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="鱼把托OUT" />
+                        <TextBlock Margin="0,1.5,6,0" Text="STAR辰星7" />
+                        <TextBlock Margin="0,1.5,6,0" Text="秋枫Maple" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xichebeiyu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="用爱发dian" />
+                        <TextBlock Margin="0,1.5,6,0" Text="qwq难qwq" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zrnzzydskx" />
+                        <TextBlock Margin="0,1.5,6,0" Text="makotowu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="aTheGhost" />
+                        <TextBlock Margin="0,1.5,6,0" Text="dmrcJYYYY" />
+                        <TextBlock Margin="0,1.5,6,0" Text="WEYOUNG" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Mi manchi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="vhdfjgbhw" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一路向南hc" />
+                        <TextBlock Margin="0,1.5,6,0" Text="the_Tilapia" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LongLe005" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Izayoi_星芒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ASHPRIME" />
+                        <TextBlock Margin="0,1.5,6,0" Text="PashaQwQ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="DarkMoon" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ꪋꪆ꪿゛诶嘿ഒ🍒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Alico12315" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Jiang_1012" />
+                        <TextBlock Margin="0,1.5,6,0" Text="曲奇兔叽土i" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Cold_Rainy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="蓝莓酱daze" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猫猫怪人RX" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Dr.Opsnow" />
+                        <TextBlock Margin="0,1.5,6,0" Text="kun114514" />
+                        <TextBlock Margin="0,1.5,6,0" Text="11小黑狼11" />
+                        <TextBlock Margin="0,1.5,6,0" Text="About you." />
+                        <TextBlock Margin="0,1.5,6,0" Text="星海Sakura" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白给Escape" />
+                        <TextBlock Margin="0,1.5,6,0" Text="1145.14MB" />
+                        <TextBlock Margin="0,1.5,6,0" Text="茶泡饭0708" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风华正猫 恒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="MaxXiagee" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Lemonzero" />
+                        <TextBlock Margin="0,1.5,6,0" Text="🍀一缕阳光" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Anmosama" />
+                        <TextBlock Margin="0,1.5,6,0" Text="天羽tian_yu" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Serendipity" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Shimon130" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Skyi_Bunny" />
+                        <TextBlock Margin="0,1.5,6,0" Text="霊_梅蘭斯蒂" />
+                        <TextBlock Margin="0,1.5,6,0" Text="乌龟的_黑头" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LMY666888" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Little_Asran" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CaptainHW" />
+                        <TextBlock Margin="0,1.5,6,0" Text="shi_dandan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="North_Lane" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LTDXM予墨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Qing__Niao" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一臭玩Mc的" />
+                        <TextBlock Margin="0,1.5,6,0" Text="vehborubel" />
+                        <TextBlock Margin="0,1.5,6,0" Text="O_QiaoKeLi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HomesIsFar" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Wuking022" />
+                        <TextBlock Margin="0,1.5,6,0" Text="YellowBeen" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AlthaeaTAT" />
+                        <TextBlock Margin="0,1.5,6,0" Text="远舟Bedelia" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BladeStorm" />
+                        <TextBlock Margin="0,1.5,6,0" Text="materialism" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Vangoghaa" />
+                        <TextBlock Margin="0,1.5,6,0" Text="weizhiming" />
+                        <TextBlock Margin="0,1.5,6,0" Text="aFatOrange" />
+                        <TextBlock Margin="0,1.5,6,0" Text="PioneerSun" />
+                        <TextBlock Margin="0,1.5,6,0" Text="QQ小小笑笑" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Redamancy" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Yee.(bushi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="X1aoChuan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Mr.尼古拉斯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Vexxaration" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Kerzenstern" />
+                        <TextBlock Margin="0,1.5,6,0" Text="YamadaRyo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="misaka6982" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zxhzhk0803" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yanmuyuan" />
+                        <TextBlock Margin="0,1.5,6,0" Text="RoyalPower" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Xzavier0707" />
+                        <TextBlock Margin="0,1.5,6,0" Text="GOODRAGE" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Xiaohua500" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Humancraft" />
+                        <TextBlock Margin="0,1.5,6,0" Text="A级禁止事件" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Myzoonosis" />
+                        <TextBlock Margin="0,1.5,6,0" Text="1283191655" />
+                        <TextBlock Margin="0,1.5,6,0" Text="☆久莫非忘☆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="平原十三月w" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HelloWoudl" />
+                        <TextBlock Margin="0,1.5,6,0" Text="FangZiming" />
+                        <TextBlock Margin="0,1.5,6,0" Text="FurryFanson" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TYPHONESS" />
+                        <TextBlock Margin="0,1.5,6,0" Text="国窖ao_li_ao" />
+                        <TextBlock Margin="0,1.5,6,0" Text="UNDavis96B" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Goldenglow" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Renaissance" />
+                        <TextBlock Margin="0,1.5,6,0" Text="C.肥宅快乐水" />
+                        <TextBlock Margin="0,1.5,6,0" Text="cloudfire_83" />
+                        <TextBlock Margin="0,1.5,6,0" Text="FB666蓝莓酱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="凌默&amp;吴解叶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Watermelon" />
+                        <TextBlock Margin="0,1.5,6,0" Text="KL_Xydwg01" />
+                        <TextBlock Margin="0,1.5,6,0" Text="1.21生电萌新" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Celesphonia" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CaesarCheat" />
+                        <TextBlock Margin="0,1.5,6,0" Text="神狐_Godfox" />
+                        <TextBlock Margin="0,1.5,6,0" Text="oooo123123" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一条鱼的狂奔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小阿鬼下大饭" />
+                        <TextBlock Margin="0,1.5,6,0" Text="三金羊Sheep" />
+                        <TextBlock Margin="0,1.5,6,0" Text="明天会更好吧" />
+                        <TextBlock Margin="0,1.5,6,0" Text="会看到晚霞吗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="月下独酌的猫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="PersImmlion" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梦の鲤丶青云" />
+                        <TextBlock Margin="0,1.5,6,0" Text="起猛了再睡会" />
+                        <TextBlock Margin="0,1.5,6,0" Text="收取人间快乐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="风吹不动树叶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="艾派克斯大师" />
+                        <TextBlock Margin="0,1.5,6,0" Text="齐夏不会说谎" />
+                        <TextBlock Margin="0,1.5,6,0" Text="道馆炸膛仙人" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小狸花爱吃鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="奶二抽一顶住" />
+                        <TextBlock Margin="0,1.5,6,0" Text="热心市民小昇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小羊是羊中羊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="W.D.xinba13" />
+                        <TextBlock Margin="0,1.5,6,0" Text="农夫山泉真君" />
+                        <TextBlock Margin="0,1.5,6,0" Text="对方正在输入" />
+                        <TextBlock Margin="0,1.5,6,0" Text="快咸死的咸鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿科爱玩游戏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="超高校级奇迹" />
+                        <TextBlock Margin="0,1.5,6,0" Text="峨眉山的猴子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="皮卡丘汪汪汪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="老婆不止蕾姆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="只玩三国军师" />
+                        <TextBlock Margin="0,1.5,6,0" Text="美式生椰拿铁" />
+                        <TextBlock Margin="0,1.5,6,0" Text="对你偷偷暗恋" />
+                        <TextBlock Margin="0,1.5,6,0" Text="嫦娥爱吃玉兔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="上午你只是你" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小熊的蜂蜜罐" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我爱龙腾猫跃" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一只路过的雲" />
+                        <TextBlock Margin="0,1.5,6,0" Text="折下一枝山楂" />
+                        <TextBlock Margin="0,1.5,6,0" Text="把失落说给风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="迷人的卷心菜" />
+                        <TextBlock Margin="0,1.5,6,0" Text="你的憨憨朋友" />
+                        <TextBlock Margin="0,1.5,6,0" Text="光圈里的故事" />
+                        <TextBlock Margin="0,1.5,6,0" Text="猪皮怪不得了" />
+                        <TextBlock Margin="0,1.5,6,0" Text="就一捡垃圾的" />
+                        <TextBlock Margin="0,1.5,6,0" Text="每天都要开心" />
+                        <TextBlock Margin="0,1.5,6,0" Text="听歌成为习惯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="帅气的特码头" />
+                        <TextBlock Margin="0,1.5,6,0" Text="丨只爱加藤惠" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一只路过的汪" />
+                        <TextBlock Margin="0,1.5,6,0" Text="哥布林厨师长" />
+                        <TextBlock Margin="0,1.5,6,0" Text="忽必烈多一烈" />
+                        <TextBlock Margin="0,1.5,6,0" Text="昭昭子的颜宝" />
+                        <TextBlock Margin="0,1.5,6,0" Text="下北泽刺客凉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="爱臭美的蛤蟆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="特特特酸柠檬" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十九线小作家" />
+                        <TextBlock Margin="0,1.5,6,0" Text="终在温柔怀里" />
+                        <TextBlock Margin="0,1.5,6,0" Text="草莓小熊软糖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="她模糊的脸庞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="五大洲的凉皮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="她都叫我阿哲" />
+                        <TextBlock Margin="0,1.5,6,0" Text="奕总多喝热水" />
+                        <TextBlock Margin="0,1.5,6,0" Text="暴雪魔法巨龙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="分かリません" />
+                        <TextBlock Margin="0,1.5,6,0" Text="炸鱼与狗修金" />
+                        <TextBlock Margin="0,1.5,6,0" Text="又中他人一计" />
+                        <TextBlock Margin="0,1.5,6,0" Text="睁眼睡不着觉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿尔卑斯的风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小赵能吃能喝" />
+                        <TextBlock Margin="0,1.5,6,0" Text="摸鱼混日真菌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="维他命柠檬茶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一个真正的鳗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="DkyMDream" />
+                        <TextBlock Margin="0,1.5,6,0" Text="愿天一梦mllk" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LuXiNingMC" />
+                        <TextBlock Margin="0,1.5,6,0" Text="David_22091" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Noble sheep" />
+                        <TextBlock Margin="0,1.5,6,0" Text="文艺HUNTER" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Blizzard_ruin" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雷。。(¬_¬)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="unlverse_star" />
+                        <TextBlock Margin="0,1.5,6,0" Text="YOUSHIBIAN" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AULOLY-秋萌" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LeenKun随风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Dindal effect" />
+                        <TextBlock Margin="0,1.5,6,0" Text="孤如影陌.终灸" />
+                        <TextBlock Margin="0,1.5,6,0" Text="the truth star" />
+                        <TextBlock Margin="0,1.5,6,0" Text="CCJACKMAN" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SyngoZeenLi" />
+                        <TextBlock Margin="0,1.5,6,0" Text="♢糖酱5217♢" />
+                        <TextBlock Margin="0,1.5,6,0" Text="椰果奶龙7788" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BLACKSHEEP" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lanshensama" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Augetry-zero" />
+                        <TextBlock Margin="0,1.5,6,0" Text="lindesycrying" />
+                        <TextBlock Margin="0,1.5,6,0" Text="WANGZIONE" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TURRNUTA薇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Hyxsunmoon" />
+                        <TextBlock Margin="0,1.5,6,0" Text="h6llucination" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sword Bearer" />
+                        <TextBlock Margin="0,1.5,6,0" Text="✎ℳBeloved_" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TearWindBell" />
+                        <TextBlock Margin="0,1.5,6,0" Text="走路太s会崴脚" />
+                        <TextBlock Margin="0,1.5,6,0" Text="tomorrow277" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SHE_LOOKED" />
+                        <TextBlock Margin="0,1.5,6,0" Text="whiteline白告" />
+                        <TextBlock Margin="0,1.5,6,0" Text="御坂114514号" />
+                        <TextBlock Margin="0,1.5,6,0" Text="守护最好的mc" />
+                        <TextBlock Margin="0,1.5,6,0" Text="TranquilGlow" />
+                        <TextBlock Margin="0,1.5,6,0" Text="zzz_10728701" />
+                        <TextBlock Margin="0,1.5,6,0" Text="旭阳08310001" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xiaoguan_aos" />
+                        <TextBlock Margin="0,1.5,6,0" Text="fangkuai9166" />
+                        <TextBlock Margin="0,1.5,6,0" Text="对方正在输入..." />
+                        <TextBlock Margin="0,1.5,6,0" Text="HEAVENS海君" />
+                        <TextBlock Margin="0,1.5,6,0" Text="chenzhiyu520" />
+                        <TextBlock Margin="0,1.5,6,0" Text="超A级炼金术士" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Scottren_Stast" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ihatetheworld" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Anjou&amp;赫斯比" />
+                        <TextBlock Margin="0,1.5,6,0" Text="打篮球的Stone" />
+                        <TextBlock Margin="0,1.5,6,0" Text="qugehaoming" />
+                        <TextBlock Margin="0,1.5,6,0" Text="神秘伪证hiro酱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="DreamEclipse_" />
+                        <TextBlock Margin="0,1.5,6,0" Text="HorizonOcean" />
+                        <TextBlock Margin="0,1.5,6,0" Text="琥珀酸美托洛尔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="汤圆是只哈士奇" />
+                        <TextBlock Margin="0,1.5,6,0" Text="逸一时,误一世" />
+                        <TextBlock Margin="0,1.5,6,0" Text="夜空中最亮的星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="售票员发通报🇨🇳" />
+                        <TextBlock Margin="0,1.5,6,0" Text="楼上睡觉不关灯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雨夜带刀不带伞" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LongyuanMira" />
+                        <TextBlock Margin="0,1.5,6,0" Text="网络恶棍逆天酱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="antherthunder" />
+                        <TextBlock Margin="0,1.5,6,0" Text="螺旋扫掠做弹簧" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一只乱游的咸鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="每天都是星期日" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小红帽当大灰狼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="爱唱歌的知更鸟" />
+                        <TextBlock Margin="0,1.5,6,0" Text="守到黎明见花开" />
+                        <TextBlock Margin="0,1.5,6,0" Text="梦想是摇子领袖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="穆鱼不是木头鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一只安静的三三" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我欲饮酒点孤灯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="朝花不问夕时叶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不会搭房子的鹏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="灵魂骑士魏大锤" />
+                        <TextBlock Margin="0,1.5,6,0" Text="当时只道是寻常" />
+                        <TextBlock Margin="0,1.5,6,0" Text="妙袜发是瞌睡虫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="游戏大师爱丽丝" />
+                        <TextBlock Margin="0,1.5,6,0" Text="魔法少女特日日" />
+                        <TextBlock Margin="0,1.5,6,0" Text="好吃你就多吃点" />
+                        <TextBlock Margin="0,1.5,6,0" Text="差一个时辰遇见" />
+                        <TextBlock Margin="0,1.5,6,0" Text="哈基米南北绿豆" />
+                        <TextBlock Margin="0,1.5,6,0" Text="主席教导放光芒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="马头不爱玩游戏" />
+                        <TextBlock Margin="0,1.5,6,0" Text="白夜千歌桜祭月" />
+                        <TextBlock Margin="0,1.5,6,0" Text="自信的巴巴托斯" />
+                        <TextBlock Margin="0,1.5,6,0" Text="想养两只哥斯拉" />
+                        <TextBlock Margin="0,1.5,6,0" Text="八块钱的关东煮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="萌萌哒滴冬眠熊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="同学老爸叫海强" />
+                        <TextBlock Margin="0,1.5,6,0" Text="永不开封的汽水" />
+                        <TextBlock Margin="0,1.5,6,0" Text="午睡后慵懒的猫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="有船的少年与海" />
+                        <TextBlock Margin="0,1.5,6,0" Text="星空中吹来的风" />
+                        <TextBlock Margin="0,1.5,6,0" Text="深院尘稀书韵雅" />
+                        <TextBlock Margin="0,1.5,6,0" Text="空恋大魔女yuki" />
+                        <TextBlock Margin="0,1.5,6,0" Text="名字是個好東西" />
+                        <TextBlock Margin="0,1.5,6,0" Text="叱咤月海鱼鱼猫" />
+                        <TextBlock Margin="0,1.5,6,0" Text="苔藓块速访问子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="北湖龙哥的应该" />
+                        <TextBlock Margin="0,1.5,6,0" Text="你脸怎么红红的" />
+                        <TextBlock Margin="0,1.5,6,0" Text="yangyangyang" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AnEvilPancake" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Despicable me" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Secluded-Wolf" />
+                        <TextBlock Margin="0,1.5,6,0" Text="congcong3776" />
+                        <TextBlock Margin="0,1.5,6,0" Text="BrightMorning" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Degenerate.🌙" />
+                        <TextBlock Margin="0,1.5,6,0" Text="MuFeng_Ender" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xiaozhaoDOGE" />
+                        <TextBlock Margin="0,1.5,6,0" Text="꧁卐劉蘭卍꧂" />
+                        <TextBlock Margin="0,1.5,6,0" Text="言乐UMBRELLA" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Brackenfeather" />
+                        <TextBlock Margin="0,1.5,6,0" Text="照井黎Terui_Rei" />
+                        <TextBlock Margin="0,1.5,6,0" Text="嗜血龙少242424" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sakura Burning" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Reci_inkyserical" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Shirasaw_a29ca" />
+                        <TextBlock Margin="0,1.5,6,0" Text="The light is dim" />
+                        <TextBlock Margin="0,1.5,6,0" Text="LittleGinger_HB" />
+                        <TextBlock Margin="0,1.5,6,0" Text="PurplePuffCake" />
+                        <TextBlock Margin="0,1.5,6,0" Text="🍔 kakukirin🍔" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Gefallene Engel" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Eachhuangtang" />
+                        <TextBlock Margin="0,1.5,6,0" Text="shallow nobody" />
+                        <TextBlock Margin="0,1.5,6,0" Text="xiaoxiaoxiao111" />
+                        <TextBlock Margin="0,1.5,6,0" Text="仙子伊布_official" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Abandoned丶梦" />
+                        <TextBlock Margin="0,1.5,6,0" Text="NinjaRabbitOvO" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ElamrUranusDay" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wuliaodexiaoluo" />
+                        <TextBlock Margin="0,1.5,6,0" Text="再长高5cm就好了" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雪风大人是最强哒" />
+                        <TextBlock Margin="0,1.5,6,0" Text="新鲜哥(暗示版)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="最喜欢宇柯柯子了" />
+                        <TextBlock Margin="0,1.5,6,0" Text="爽爽无敌暴龙战士" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ㅤㅤㅤㅤㅤㅤㅤㅤ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="莓有酱才是真的酱" />
+                        <TextBlock Margin="0,1.5,6,0" Text="不知道叫什么啊!" />
+                        <TextBlock Margin="0,1.5,6,0" Text="论如何起个好名字" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一只神奇的年糕鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一杯热腾腾的咖啡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我真是谢谢你了丶" />
+                        <TextBlock Margin="0,1.5,6,0" Text="爱恨吾已无心分辨" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ㅤㅤㅤㅤㅤㅤㅤㅤ" />
+                        <TextBlock Margin="0,1.5,6,0" Text="羊绒大衣第一套房" />
+                        <TextBlock Margin="0,1.5,6,0" Text="大笨蛋你在里面吗" />
+                        <TextBlock Margin="0,1.5,6,0" Text="从你的全世界路过" />
+                        <TextBlock Margin="0,1.5,6,0" Text="须臾山中棺林见晴" />
+                        <TextBlock Margin="0,1.5,6,0" Text="天空之城(HBX)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="h4chPE_Network" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AloneAfterHours" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Bilibili_Z2WLGSG" />
+                        <TextBlock Margin="0,1.5,6,0" Text="月下誓约·予爱以心" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Minecraft_GD656" />
+                        <TextBlock Margin="0,1.5,6,0" Text="SuzuAki_kaopota" />
+                        <TextBlock Margin="0,1.5,6,0" Text="wuuuuuuuuuuud" />
+                        <TextBlock Margin="0,1.5,6,0" Text="动点moving point" />
+                        <TextBlock Margin="0,1.5,6,0" Text="Sanchezzzzzzzzzz" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ret-coordinate-sys" />
+                        <TextBlock Margin="0,1.5,6,0" Text="护教军统御贤者姚鱼" />
+                        <TextBlock Margin="0,1.5,6,0" Text="导饰品的苦逼大学生" />
+                        <TextBlock Margin="0,1.5,6,0" Text="失去梦想的GGbond" />
+                        <TextBlock Margin="0,1.5,6,0" Text="老迪老迪(老直男)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="为什么要偷我的外卖" />
+                        <TextBlock Margin="0,1.5,6,0" Text="是男人就喝刺客魔药" />
+                        <TextBlock Margin="0,1.5,6,0" Text="古希腊掌管秒睡的神" />
+                        <TextBlock Margin="0,1.5,6,0" Text="小熊软糖(变硬版)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AAA往生堂堂主胡桃" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一览众山    都比我高" />
+                        <TextBlock Margin="0,1.5,6,0" Text="浅唱待花开ღ( ´・ᴗ・` )" />
+                        <TextBlock Margin="0,1.5,6,0" Text="十六分之一加四分之一" />
+                        <TextBlock Margin="0,1.5,6,0" Text="斯卡里茨的潘德莫妮卡" />
+                        <TextBlock Margin="0,1.5,6,0" Text="摸不着头脑的路易十六" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我叫超人强越超人越强" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ㅤㅤㅤㅤ希尔伯特·昂热" />
+                        <TextBlock Margin="0,1.5,6,0" Text="[email protected]" />
+                        <TextBlock Margin="0,1.5,6,0" Text="橘子不是唯一的水果🍊" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一个玩mc长大的小人物" />
+                        <TextBlock Margin="0,1.5,6,0" Text="器器Minecraft(蛋哥)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="七彩洞洞鞋(我是剑剑)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我就是我,不一样的水果" />
+                        <TextBlock Margin="0,1.5,6,0" Text="你家猫出门散步被我捡了" />
+                        <TextBlock Margin="0,1.5,6,0" Text="就要在这里发电ᕕ(◠ڼ◠)ᕗ​" />
+                        <TextBlock Margin="0,1.5,6,0" Text="阿白two(努力挣猫粮版)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="AAA 蔬果尿素批发市场低价" />
+                        <TextBlock Margin="0,1.5,6,0" Text="青春没有售价,扣一复活牢大" />
+                        <TextBlock Margin="0,1.5,6,0" Text="ㅤㅤㅤ꧁€€€亿只pvp€€€꧂" />
+                        <TextBlock Margin="0,1.5,6,0" Text="西伯利亚泰坦龙徒手捏爆小行星" />
+                        <TextBlock Margin="0,1.5,6,0" Text="天上飞的是什么,是帝皇的勾子" />
+                        <TextBlock Margin="0,1.5,6,0" Text="希望成为pcl测试人员的热爱玩家" />
+                        <TextBlock Margin="0,1.5,6,0" Text="混沌疯子-玩家(Shuvi_Doura)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="雪豹示波器梦到迷幻电子烟雾脉冲" />
+                        <TextBlock Margin="0,1.5,6,0" Text="狼漫君陨落(毁灭手机瑶瑶领先)" />
+                        <TextBlock Margin="0,1.5,6,0" Text="我离开了床我洗脸刷牙吃饭打扮漂亮" />
+                        <TextBlock Margin="0,1.5,6,0" Text="一天不路积阳徳,几天不路积积阳阳徳" />
                     </WrapPanel>
                     <Grid Height="35">
                         <Grid.ColumnDefinitions>

+ 1 - 1
Plain Craft Launcher 2/Pages/PageOther/PageOtherLeft.xaml.vb

@@ -49,7 +49,7 @@
     ''' <summary>
     ''' 勾选事件改变页面。
     ''' </summary>
-    Private Sub PageCheck(sender As MyListItem, e As RouteEventArgs) Handles ItemAbout.Check, ItemHelp.Check, ItemTest.Check
+    Private Sub PageCheck(sender As FrameworkElement, e As RouteEventArgs) Handles ItemAbout.Check, ItemHelp.Check, ItemTest.Check
         '尚未初始化控件属性时,sender.Tag 为 Nothing,会导致切换到页面 0
         '若使用 IsLoaded,则会导致模拟点击不被执行(模拟点击切换页面时,控件的 IsLoaded 为 False)
         If sender.Tag IsNot Nothing Then PageChange(Val(sender.Tag))

+ 43 - 43
Plain Craft Launcher 2/Pages/PageSelectLeft.xaml.vb

@@ -34,7 +34,7 @@
                 '添加控件
                 Dim ContMenu As ContextMenu = Nothing
                 Select Case Folder.Type
-                    Case McFolderType.Original
+                    Case McFolder.Types.Original
                         ContMenu = GetObjectFromXML(
                                 <ContextMenu xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PCL;assembly=Plain Craft Launcher 2">
                                     <local:MyMenuItem x:Name="Rename" Header="重命名" Padding="0,2,0,0" Icon="F1 M 53.2929,21.2929L 54.7071,22.7071C 56.4645,24.4645 56.4645,27.3137 54.7071,29.0711L 52.2323,31.5459L 44.4541,23.7677L 46.9289,21.2929C 48.6863,19.5355 51.5355,19.5355 53.2929,21.2929 Z M 31.7262,52.052L 23.948,44.2738L 43.0399,25.182L 50.818,32.9601L 31.7262,52.052 Z M 23.2409,47.1023L 28.8977,52.7591L 21.0463,54.9537L 23.2409,47.1023 Z"/>
@@ -43,7 +43,7 @@
                                     <local:MyMenuItem x:Name="Delete" Header="删除" Padding="0,0,0,2" Icon="F1 M 26.9166,22.1667L 37.9999,33.25L 49.0832,22.1668L 53.8332,26.9168L 42.7499,38L 53.8332,49.0834L 49.0833,53.8334L 37.9999,42.75L 26.9166,53.8334L 22.1666,49.0833L 33.25,38L 22.1667,26.9167L 26.9166,22.1667 Z "/>
                                 </ContextMenu>
                         )
-                    Case McFolderType.RenamedOriginal
+                    Case McFolder.Types.RenamedOriginal
                         ContMenu = GetObjectFromXML(
                                 <ContextMenu xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PCL;assembly=Plain Craft Launcher 2">
                                     <local:MyMenuItem x:Name="Remove" Header="复原名称" Padding="0,2,0,0" Icon="F1 M 53.2929,21.2929L 54.7071,22.7071C 56.4645,24.4645 56.4645,27.3137 54.7071,29.0711L 52.2323,31.5459L 44.4541,23.7677L 46.9289,21.2929C 48.6863,19.5355 51.5355,19.5355 53.2929,21.2929 Z M 31.7262,52.052L 23.948,44.2738L 43.0399,25.182L 50.818,32.9601L 31.7262,52.052 Z M 23.2409,47.1023L 28.8977,52.7591L 21.0463,54.9537L 23.2409,47.1023 Z"/>
@@ -53,7 +53,7 @@
                                     <local:MyMenuItem x:Name="Delete" Header="删除" Padding="0,0,0,2" Icon="F1 M 26.9166,22.1667L 37.9999,33.25L 49.0832,22.1668L 53.8332,26.9168L 42.7499,38L 53.8332,49.0834L 49.0833,53.8334L 37.9999,42.75L 26.9166,53.8334L 22.1666,49.0833L 33.25,38L 22.1667,26.9167L 26.9166,22.1667 Z "/>
                                 </ContextMenu>
                         )
-                    Case McFolderType.Custom
+                    Case McFolder.Types.Custom
                         ContMenu = GetObjectFromXML(
                                 <ContextMenu xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:PCL;assembly=Plain Craft Launcher 2">
                                     <local:MyMenuItem x:Name="Rename" Header="重命名" Padding="0,2,0,0" Icon="F1 M 53.2929,21.2929L 54.7071,22.7071C 56.4645,24.4645 56.4645,27.3137 54.7071,29.0711L 52.2323,31.5459L 44.4541,23.7677L 46.9289,21.2929C 48.6863,19.5355 51.5355,19.5355 53.2929,21.2929 Z M 31.7262,52.052L 23.948,44.2738L 43.0399,25.182L 50.818,32.9601L 31.7262,52.052 Z M 23.2409,47.1023L 28.8977,52.7591L 21.0463,54.9537L 23.2409,47.1023 Z"/>
@@ -64,15 +64,15 @@
                                 </ContextMenu>
                         )
                 End Select
-                If (Folder.Type = McFolderType.Original OrElse Folder.Type = McFolderType.RenamedOriginal) AndAlso Folder.Path = Path & ".minecraft\" AndAlso McFolderList.Count = 1 Then CType(ContMenu.FindName("Delete"), MyMenuItem).Header = "清空"
+                If (Folder.Type = McFolder.Types.Original OrElse Folder.Type = McFolder.Types.RenamedOriginal) AndAlso Folder.Location = Path & ".minecraft\" AndAlso McFolderList.Count = 1 Then CType(ContMenu.FindName("Delete"), MyMenuItem).Header = "清空"
                 '注册事件
-                If Not Folder.Type = McFolderType.Original Then CType(ContMenu.FindName("Remove"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Remove_Click))
+                If Not Folder.Type = McFolder.Types.Original Then CType(ContMenu.FindName("Remove"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Remove_Click))
                 CType(ContMenu.FindName("Open"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Open_Click))
                 CType(ContMenu.FindName("Delete"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Delete_Click))
                 CType(ContMenu.FindName("Rename"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Rename_Click))
                 CType(ContMenu.FindName("Refresh"), MyMenuItem).AddHandler(MyMenuItem.ClickEvent, New RoutedEventHandler(AddressOf FrmSelectLeft.Refresh_Click))
                 '构建框架与图表按钮
-                Dim NewItem As New MyListItem With {.IsScaleAnimationEnabled = False, .Type = MyListItem.CheckType.RadioBox, .MinPaddingRight = 30, .Title = Folder.Name, .Info = Folder.Path, .Height = 40, .ContextMenu = ContMenu, .Tag = Folder}
+                Dim NewItem As New MyListItem With {.IsScaleAnimationEnabled = False, .Type = MyListItem.CheckType.RadioBox, .MinPaddingRight = 30, .Title = Folder.Name, .Info = Folder.Location, .Height = 40, .ContextMenu = ContMenu, .Tag = Folder}
                 AddHandler NewItem.Changed, AddressOf FrmSelectLeft.Folder_Change
                 Dim NewIconButton As New MyIconButton With {.Logo = Logo.IconButtonSetup, .LogoScale = 1.1}
                 AddHandler NewIconButton.Click, Sub(sender, e)
@@ -81,7 +81,7 @@
                                                 End Sub
                 NewItem.Buttons = {NewIconButton}
                 FrmSelectLeft.PanList.Children.Add(NewItem)
-                Log("[Minecraft] 有效的 Minecraft 文件夹:" & Folder.Name & " > " & Folder.Path)
+                Log("[Minecraft] 有效的 Minecraft 文件夹:" & Folder.Name & " > " & Folder.Location)
             Next
 
             '标题文本
@@ -125,7 +125,7 @@
 
             '确认勾选状态
             For i = 0 To McFolderList.Count - 1
-                If McFolderList(i).Path = PathMcFolder Then
+                If McFolderList(i).Location = McFolderSelected Then
                     CType(FrmSelectLeft.PanList.Children(i + 1), MyListItem).Checked = True '去掉第一个标题
                     Return
                 End If
@@ -133,14 +133,14 @@
             If Not McFolderList.Any() Then
                 Throw New ArgumentNullException("没有可用的 Minecraft 文件夹")
             Else
-                Setup.Set("LaunchFolderSelect", McFolderList(0).Path.Replace(Path, "$"))
+                Setup.Set("LaunchFolderSelect", McFolderList(0).Location.Replace(Path, "$"))
                 CType(FrmSelectLeft.PanList.Children(1), MyListItem).Checked = True
             End If
 
         Catch ex As Exception
             Log(ex, "构建 Minecraft 文件夹列表 UI 出错", LogLevel.Feedback)
         Finally
-            LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\") '刷新版本列表
+            LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\") '刷新版本列表
         End Try
     End Sub
     Private McFolderListLast As List(Of McFolder)
@@ -232,20 +232,20 @@
                 Dim ModFolder As New DirectoryInfo(FolderPath & "mods\")
                 If Not (ModFolder.Exists AndAlso ModFolder.EnumerateFiles.Count >= 3) Then Return
                 '2. 版本数较少,可能为整合包
-                Dim VersionFolder As New DirectoryInfo(FolderPath & "versions\")
-                If Not (VersionFolder.Exists AndAlso VersionFolder.EnumerateDirectories.Count <= 3) Then Return
+                Dim VersionFolderInfo As New DirectoryInfo(FolderPath & "versions\")
+                If Not (VersionFolderInfo.Exists AndAlso VersionFolderInfo.EnumerateDirectories.Count <= 3) Then Return
                 '3. 能够找到可安装 Mod 的版本
-                For Each VersionPath In VersionFolder.EnumerateDirectories
-                    Dim Version As New McVersion(VersionPath.FullName)
-                    Version.Load()
-                    If Not Version.Modable Then Continue For
+                For Each VersionFolder In VersionFolderInfo.EnumerateDirectories
+                    Dim Instance As New McInstance(VersionFolder.FullName)
+                    Instance.Load()
+                    If Not Instance.Modable Then Continue For
                     '4. 该版本的隔离文件夹下不存在 mods
-                    Dim ModIndieFolder As New DirectoryInfo(Version.Path & "mods\")
+                    Dim ModIndieFolder As New DirectoryInfo(Instance.PathVersion & "mods\")
                     If ModIndieFolder.Exists AndAlso ModIndieFolder.EnumerateFiles.Any Then Return
                     '满足以上全部条件则视为根目录整合包
-                    Setup.Set("VersionArgumentIndie", 2, Version:=Version)
-                    Setup.Set("VersionArgumentIndieV2", False, Version:=Version)
-                    Log("[Setup] 已自动关闭单版本隔离:" & Version.Name, LogLevel.Debug)
+                    Setup.Set("VersionArgumentIndie", 2, Instance:=Instance)
+                    Setup.Set("VersionArgumentIndieV2", False, Instance:=Instance)
+                    Log("[Setup] 已自动关闭单版本隔离:" & Instance.Name, LogLevel.Debug)
                 Next
             Catch ex As Exception
                 Log(ex, "向文件夹列表中添加新文件夹失败", LogLevel.Feedback)
@@ -276,14 +276,14 @@
 
             Dim Folder As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag
             '若为 “移除”,则提醒是否删除 PCL 的配置文件
-            If Folder.Type = McFolderType.Custom Then
+            If Folder.Type = McFolder.Types.Custom Then
                 Select Case MyMsgBox("是否需要清理 PCL 在该文件夹中的配置文件?" & vbCrLf & "这包括各个版本的独立设置(如自定义图标、第三方登录配置)等,对游戏本身没有影响。", "配置文件清理", "删除", "保留", "取消")
                     Case 1
                         '删除配置文件
-                        If File.Exists(Folder.Path & "PCL.ini") Then File.Delete(Folder.Path & "PCL.ini")
-                        If Directory.Exists(Folder.Path & "versions\") Then
-                            For Each Version In New DirectoryInfo(Folder.Path & "versions\").EnumerateDirectories
-                                If Directory.Exists(Version.FullName & "\PCL\") Then Directory.Delete(Version.FullName & "\PCL\", True)
+                        If File.Exists(Folder.Location & "PCL.ini") Then File.Delete(Folder.Location & "PCL.ini")
+                        If Directory.Exists(Folder.Location & "versions\") Then
+                            For Each InstanceInfo In New DirectoryInfo(Folder.Location & "versions\").EnumerateDirectories
+                                If Directory.Exists(InstanceInfo.FullName & "\PCL\") Then Directory.Delete(InstanceInfo.FullName & "\PCL\", True)
                             Next
                         End If
                     Case 2
@@ -299,7 +299,7 @@
             Dim Name As String = ""
             For i = 0 To Folders.Count - 1
                 If Folders(i) = "" Then Exit For
-                If Folders(i).ToString.EndsWith(Folder.Path) Then
+                If Folders(i).ToString.EndsWith(Folder.Location) Then
                     Name = Folders(i).ToString.BeforeFirst(">")
                     Folders.RemoveAt(i)
                     Exit For
@@ -307,7 +307,7 @@
             Next
             '保存
             Setup.Set("LaunchFolders", If(Not Folders.Any(), "", Join(Folders.ToArray, "|")))
-            Hint(If(Folder.Type = McFolderType.Custom, "文件夹 " & Name & " 已从列表中移除!", "文件夹名称已复原!"), HintType.Green)
+            Hint(If(Folder.Type = McFolder.Types.Custom, "文件夹 " & Name & " 已从列表中移除!", "文件夹名称已复原!"), HintType.Green)
             McFolderListLoader.Start(IsForceRestart:=True)
 
         Catch ex As Exception
@@ -316,15 +316,15 @@
     End Sub
     Public Sub Delete_Click(sender As Object, e As RoutedEventArgs)
         Dim Folder As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag
-        Dim DeleteText As String = If((Folder.Type = McFolderType.Original OrElse Folder.Type = McFolderType.RenamedOriginal) AndAlso Folder.Path = Path & ".minecraft\" AndAlso McFolderList.Count = 1, "清空", "删除")
-        If MyMsgBox("你确定要" & DeleteText & "这个文件夹吗?" & vbCrLf & "目标文件夹:" & Folder.Path & vbCrLf & vbCrLf & "这会导致该文件夹中的所有存档与其他文件永久丢失,且不可恢复!", "删除警告", "取消", "确认", "取消") <> 2 Then Return
-        If MyMsgBox("如果你在该文件夹中存放了除 MC 以外的其他文件,这些文件也会被一同删除!" & vbCrLf & "继续删除会导致该文件夹中的所有文件永久丢失,请在仔细确认后再继续!" & vbCrLf & "目标文件夹:" & Folder.Path & vbCrLf & vbCrLf & "这是最后一次警告!", "删除警告", "确认" & DeleteText, "取消", IsWarn:=True) <> 1 Then Return
+        Dim DeleteText As String = If((Folder.Type = McFolder.Types.Original OrElse Folder.Type = McFolder.Types.RenamedOriginal) AndAlso Folder.Location = Path & ".minecraft\" AndAlso McFolderList.Count = 1, "清空", "删除")
+        If MyMsgBox("你确定要" & DeleteText & "这个文件夹吗?" & vbCrLf & "目标文件夹:" & Folder.Location & vbCrLf & vbCrLf & "这会导致该文件夹中的所有存档与其他文件永久丢失,且不可恢复!", "删除警告", "取消", "确认", "取消") <> 2 Then Return
+        If MyMsgBox("如果你在该文件夹中存放了除 MC 以外的其他文件,这些文件也会被一同删除!" & vbCrLf & "继续删除会导致该文件夹中的所有文件永久丢失,请在仔细确认后再继续!" & vbCrLf & "目标文件夹:" & Folder.Location & vbCrLf & vbCrLf & "这是最后一次警告!", "删除警告", "确认" & DeleteText, "取消", IsWarn:=True) <> 1 Then Return
         '移出列表
-        If Folder.Type = McFolderType.Custom Then
+        If Folder.Type = McFolder.Types.Custom Then
             Dim Folders As New List(Of String)(Setup.Get("LaunchFolders").ToString.Split("|"))
             For i = 0 To Folders.Count - 1
                 If Folders(i) = "" Then Exit For
-                If Folders(i).ToString.EndsWith(Folder.Path) Then
+                If Folders(i).ToString.EndsWith(Folder.Location) Then
                     'Name = Folders(i).ToString.Before(">")
                     Folders.RemoveAt(i)
                     Exit For
@@ -337,8 +337,8 @@
             '删除文件夹
             Try
                 Hint("正在" & DeleteText & "文件夹 " & Folder.Name & "!", HintType.Blue)
-                DeleteDirectory(Folder.Path)
-                If DeleteText = "清空" Then Directory.CreateDirectory(Folder.Path)
+                DeleteDirectory(Folder.Location)
+                If DeleteText = "清空" Then Directory.CreateDirectory(Folder.Location)
                 Hint("已" & DeleteText & "文件夹 " & Folder.Name & "!", HintType.Green)
             Catch ex As Exception
                 Log(ex, DeleteText & "文件夹 " & Folder.Name & " 失败", LogLevel.Hint)
@@ -353,14 +353,14 @@
     End Sub
     Public Sub Refresh_Click(sender As Object, e As RoutedEventArgs)
         Dim Data As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag
-        RefreshCurrent(Data.Path)
+        RefreshCurrent(Data.Location)
     End Sub
     Public Sub RefreshCurrent() Implements IRefreshable.Refresh
-        RefreshCurrent(PathMcFolder)
+        RefreshCurrent(McFolderSelected)
     End Sub
     Public Shared Sub RefreshCurrent(Folder As String)
-        WriteIni(Folder & "PCL.ini", "VersionCache", "") '删除缓存以强制要求下一次加载时更新列表
-        If Folder = PathMcFolder Then LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+        WriteIni(Folder & "PCL.ini", "InstanceCache", "") '删除缓存以强制要求下一次加载时更新列表
+        If Folder = McFolderSelected Then LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
     End Sub
     Public Sub Rename_Click(sender As Object, e As RoutedEventArgs)
         Dim Folder As McFolder = CType(CType(CType(sender.Parent, ContextMenu).Parent, Primitives.Popup).PlacementTarget, MyListItem).Tag
@@ -376,19 +376,19 @@
             For i = 0 To Folders.Count - 1
                 Dim FolderCurrent As String = Folders(i)
                 If FolderCurrent = "" Then Continue For
-                If FolderCurrent.Split(">")(1) = Folder.Path Then
+                If FolderCurrent.Split(">")(1) = Folder.Location Then
                     IsAdded = True
                     If FolderCurrent.Split(">")(0) = NewName Then
                         '名称未修改
                         Return
                     Else
-                        Folders(i) = NewName & ">" & Folder.Path
+                        Folders(i) = NewName & ">" & Folder.Location
                     End If
                     Exit For
                 End If
             Next
             '如果没有添加过,则添加进去(因为修改了默认项的名称)
-            If Not IsAdded Then Folders.Add(NewName & ">" & Folder.Path)
+            If Not IsAdded Then Folders.Add(NewName & ">" & Folder.Location)
             Hint("文件夹名称已更新为 " & NewName & " !", HintType.Green)
             '保存
             Setup.Set("LaunchFolders", Join(Folders.ToArray, "|"))
@@ -408,9 +408,9 @@
             Return
         End If
         '更换
-        Setup.Set("LaunchFolderSelect", CType(sender.Tag, McFolder).Path.Replace(Path, "$"))
+        Setup.Set("LaunchFolderSelect", CType(sender.Tag, McFolder).Location.Replace(Path, "$"))
         McFolderListLoader.Start(IsForceRestart:=True)
-        LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\") '刷新版本列表
+        LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\") '刷新版本列表
     End Sub
 
 End Class

+ 56 - 58
Plain Craft Launcher 2/Pages/PageSelectRight.xaml.vb

@@ -2,15 +2,15 @@
 
     '窗口基础
     Private Sub PageSelectRight_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
-        LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\")
+        LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.RunOnUpdated, MaxDepth:=1, ExtraPath:="versions\")
         PanBack.ScrollToHome()
     End Sub
     Private Sub LoaderInit() Handles Me.Initialized
-        PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, McVersionListLoader, AddressOf McVersionListUI, AutoRun:=False)
+        PageLoaderInit(Load, PanLoad, PanAllBack, Nothing, McInstanceListLoader, AddressOf McInstanceListUI, AutoRun:=False)
     End Sub
     Private Sub Load_Click(sender As Object, e As MouseButtonEventArgs) Handles Load.Click
-        If McVersionListLoader.State = LoadState.Failed Then
-            LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+        If McInstanceListLoader.State = LoadState.Failed Then
+            LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
         End If
     End Sub
 
@@ -22,30 +22,29 @@
 
 #Region "结果 UI 化"
 
-    Private Sub McVersionListUI(Loader As LoaderTask(Of String, Integer))
+    Private Sub McInstanceListUI(Loader As LoaderTask(Of String, Integer))
         Try
-            Dim Path As String = Loader.Input
             '加载 UI
             PanMain.Children.Clear()
 
-            For Each Card As KeyValuePair(Of McVersionCardType, List(Of McVersion)) In McVersionList.ToArray
+            For Each Card As KeyValuePair(Of McInstanceCardType, List(Of McInstance)) In McInstanceList.ToArray
                 '确认是否为隐藏版本显示状态
-                If Card.Key = McVersionCardType.Hidden Xor ShowHidden Then Continue For
+                If Card.Key = McInstanceCardType.Hidden Xor ShowHidden Then Continue For
 #Region "确认卡片名称"
                 Dim CardName As String = ""
                 Select Case Card.Key
-                    Case McVersionCardType.OriginalLike
+                    Case McInstanceCardType.OriginalLike
                         CardName = "常规版本"
-                    Case McVersionCardType.API
+                    Case McInstanceCardType.API
                         Dim IsForgeExists As Boolean = False
                         Dim IsNeoForgeExists As Boolean = False
                         Dim IsFabricExists As Boolean = False
                         Dim IsLiteExists As Boolean = False
-                        For Each Version As McVersion In Card.Value
-                            If Version.Version.HasFabric Then IsFabricExists = True
-                            If Version.Version.HasLiteLoader Then IsLiteExists = True
-                            If Version.Version.HasForge Then IsForgeExists = True
-                            If Version.Version.HasNeoForge Then IsNeoForgeExists = True
+                        For Each Instance As McInstance In Card.Value
+                            If Instance.Version.HasFabric Then IsFabricExists = True
+                            If Instance.Version.HasLiteLoader Then IsLiteExists = True
+                            If Instance.Version.HasForge Then IsForgeExists = True
+                            If Instance.Version.HasNeoForge Then IsNeoForgeExists = True
                         Next
                         If If(IsLiteExists, 1, 0) + If(IsForgeExists, 1, 0) + If(IsFabricExists, 1, 0) + If(IsNeoForgeExists, 1, 0) > 1 Then
                             CardName = "可安装 Mod"
@@ -58,15 +57,15 @@
                         Else
                             CardName = "Fabric 版本"
                         End If
-                    Case McVersionCardType.Error
+                    Case McInstanceCardType.Error
                         CardName = "错误的版本"
-                    Case McVersionCardType.Hidden
+                    Case McInstanceCardType.Hidden
                         CardName = "隐藏的版本"
-                    Case McVersionCardType.Rubbish
+                    Case McInstanceCardType.Rubbish
                         CardName = "不常用版本"
-                    Case McVersionCardType.Star
+                    Case McInstanceCardType.Star
                         CardName = "收藏夹"
-                    Case McVersionCardType.Fool
+                    Case McInstanceCardType.Fool
                         CardName = "愚人节版本"
                     Case Else
                         Throw New ArgumentException("未知的卡片种类(" & Card.Key & ")")
@@ -80,7 +79,7 @@
                 NewCard.SwapControl = NewStack
                 PanMain.Children.Add(NewCard)
                 '确定卡片是否展开
-                If Card.Key = McVersionCardType.Rubbish OrElse Card.Key = McVersionCardType.Error OrElse Card.Key = McVersionCardType.Fool Then
+                If Card.Key = McInstanceCardType.Rubbish OrElse Card.Key = McInstanceCardType.Error OrElse Card.Key = McInstanceCardType.Fool Then
                     NewCard.IsSwapped = True
                 Else
                     MyCard.StackInstall(NewStack, 0, CardTitle)
@@ -114,13 +113,13 @@
             Log(ex, "将版本列表转换显示时失败", LogLevel.Feedback)
         End Try
     End Sub
-    Public Shared Sub McVersionListContent(sender As MyListItem, e As EventArgs)
-        Dim Version As McVersion = sender.Tag
+    Public Shared Sub McInstanceListContent(sender As MyListItem, e As EventArgs)
+        Dim Instance As McInstance = sender.Tag
         '注册点击事件
         AddHandler sender.Click, AddressOf Item_Click
         '图标按钮
         Dim BtnStar As New MyIconButton
-        If Version.IsStar Then
+        If Instance.IsStar Then
             BtnStar.ToolTip = "取消收藏"
             ToolTipService.SetPlacement(BtnStar, Primitives.PlacementMode.Center)
             ToolTipService.SetVerticalOffset(BtnStar, 30)
@@ -136,17 +135,17 @@
             BtnStar.Logo = Logo.IconButtonLikeLine
         End If
         AddHandler BtnStar.Click, Sub()
-                                      WriteIni(Version.Path & "PCL\Setup.ini", "IsStar", Not Version.IsStar)
-                                      McVersionListForceRefresh = True
-                                      LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+                                      WriteIni(Instance.PathVersion & "PCL\Setup.ini", "IsStar", Not Instance.IsStar)
+                                      McInstanceListForceRefresh = True
+                                      LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
                                   End Sub
         Dim BtnDel As New MyIconButton With {.LogoScale = 1.1, .Logo = Logo.IconButtonDelete}
         BtnDel.ToolTip = "删除"
         ToolTipService.SetPlacement(BtnDel, Primitives.PlacementMode.Center)
         ToolTipService.SetVerticalOffset(BtnDel, 30)
         ToolTipService.SetHorizontalOffset(BtnDel, 2)
-        AddHandler BtnDel.Click, Sub() DeleteVersion(sender, Version)
-        If Version.State <> McVersionState.Error Then
+        AddHandler BtnDel.Click, Sub() DeleteInstance(sender, Instance)
+        If Instance.State <> McInstanceState.Error Then
             Dim BtnCont As New MyIconButton With {.LogoScale = 1.1, .Logo = Logo.IconButtonSetup}
             BtnCont.ToolTip = "设置"
             ToolTipService.SetPlacement(BtnCont, Primitives.PlacementMode.Center)
@@ -154,13 +153,13 @@
             ToolTipService.SetHorizontalOffset(BtnCont, 2)
             AddHandler BtnCont.Click,
             Sub()
-                PageVersionLeft.Version = Version
-                FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
+                PageInstanceLeft.Instance = Instance
+                FrmMain.PageChange(FormMain.PageType.InstanceSetup, 0)
             End Sub
             AddHandler sender.MouseRightButtonUp,
             Sub()
-                PageVersionLeft.Version = Version
-                FrmMain.PageChange(FormMain.PageType.VersionSetup, 0)
+                PageInstanceLeft.Instance = Instance
+                FrmMain.PageChange(FormMain.PageType.InstanceSetup, 0)
             End Sub
             sender.Buttons = {BtnStar, BtnDel, BtnCont}
         Else
@@ -169,8 +168,8 @@
             ToolTipService.SetPlacement(BtnCont, Primitives.PlacementMode.Center)
             ToolTipService.SetVerticalOffset(BtnCont, 30)
             ToolTipService.SetHorizontalOffset(BtnCont, 2)
-            AddHandler BtnCont.Click, Sub() PageVersionOverall.OpenVersionFolder(Version)
-            AddHandler sender.MouseRightButtonUp, Sub() PageVersionOverall.OpenVersionFolder(Version)
+            AddHandler BtnCont.Click, Sub() PageInstanceOverall.OpenInstanceFolder(Instance)
+            AddHandler sender.MouseRightButtonUp, Sub() PageInstanceOverall.OpenInstanceFolder(Instance)
             sender.Buttons = {BtnStar, BtnDel, BtnCont}
         End If
     End Sub
@@ -181,15 +180,15 @@
 
     '点击选项
     Public Shared Sub Item_Click(sender As MyListItem, e As EventArgs)
-        Dim Version As McVersion = sender.Tag
-        If New McVersion(Version.Path).Check Then
+        Dim Instance As McInstance = sender.Tag
+        If New McInstance(Instance.PathVersion).Check Then
             '正常版本
-            McVersionCurrent = Version
-            Setup.Set("LaunchVersionSelect", McVersionCurrent.Name)
+            McInstanceSelected = Instance
+            Setup.Set("LaunchVersionSelect", McInstanceSelected.Name)
             FrmMain.PageBack()
         Else
             '错误版本
-            PageVersionOverall.OpenVersionFolder(Version)
+            PageInstanceOverall.OpenInstanceFolder(Instance)
         End If
     End Sub
 
@@ -197,29 +196,28 @@
         FrmMain.PageChange(FormMain.PageType.Download, FormMain.PageSubType.DownloadInstall)
     End Sub
 
-    '修改此代码时,同时修改 PageVersionOverall 中的代码
-    Public Shared Sub DeleteVersion(Item As MyListItem, Version As McVersion)
+    '修改此代码时,同时修改 PageInstanceOverall 中的代码
+    Public Shared Sub DeleteInstance(Item As MyListItem, Instance As McInstance)
         Try
             Dim IsShiftPressed As Boolean = My.Computer.Keyboard.ShiftKeyDown
-            Dim IsHintIndie As Boolean = Version.State <> McVersionState.Error AndAlso Version.PathIndie <> PathMcFolder
-            Select Case MyMsgBox($"你确定要{If(IsShiftPressed, "永久", "")}删除版本 {Version.Name} 吗?" &
+            Dim IsHintIndie As Boolean = Instance.State <> McInstanceState.Error AndAlso Instance.PathIndie <> McFolderSelected
+            Select Case MyMsgBox($"你确定要{If(IsShiftPressed, "永久", "")}删除版本 {Instance.Name} 吗?" &
                         If(IsHintIndie, vbCrLf & "由于该版本开启了版本隔离,删除版本时该版本对应的存档、资源包、Mod 等文件也将被一并删除!", ""),
                         "版本删除确认", , "取消",, True)
                 Case 1
-                    IniClearCache(Version.PathIndie & "options.txt")
-                    IniClearCache(Version.Path & "PCL\Setup.ini")
+                    IniClearCache(Instance.PathIndie & "options.txt")
+                    IniClearCache(Instance.PathVersion & "PCL\Setup.ini")
                     If IsShiftPressed Then
-                        DeleteDirectory(Version.Path)
-                        Hint("版本 " & Version.Name & " 已永久删除!", HintType.Green)
+                        DeleteDirectory(Instance.PathVersion)
                     Else
-                        FileIO.FileSystem.DeleteDirectory(Version.Path, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
-                        Hint("版本 " & Version.Name & " 已删除!", HintType.Green)
+                        FileIO.FileSystem.DeleteDirectory(Instance.PathVersion, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
                     End If
+                    Hint("版本 " & Instance.Name & " 已删除!", HintType.Green)
                 Case 2
                     Return
             End Select
             '从 UI 中移除
-            If Version.DisplayType = McVersionCardType.Hidden OrElse Not Version.IsStar Then
+            If Instance.DisplayType = McInstanceCardType.Hidden OrElse Not Instance.IsStar Then
                 '仅出现在当前卡片
                 Dim Parent As StackPanel = Item.Parent
                 If Parent.Children.Count > 2 Then '当前的项目与一个占位符
@@ -227,23 +225,23 @@
                     Dim Card As MyCard = Parent.Parent
                     Card.Title = Card.Title.Replace(Parent.Children.Count - 1, Parent.Children.Count - 2) '有一个占位符
                     Parent.Children.Remove(Item)
-                    If McVersionCurrent IsNot Nothing AndAlso Version.Path = McVersionCurrent.Path Then
+                    If McInstanceSelected IsNot Nothing AndAlso Instance.PathVersion = McInstanceSelected.PathVersion Then
                         '删除当前版本就更改选择
-                        McVersionCurrent = CType(Parent.Children(0), MyListItem).Tag
+                        McInstanceSelected = MyVirtualizingElement.TryInit(Parent.Children(0)).Tag
                     End If
-                    LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.UpdateOnly, MaxDepth:=1, ExtraPath:="versions\")
+                    LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.UpdateOnly, MaxDepth:=1, ExtraPath:="versions\")
                 Else
                     '删除后没剩了
-                    LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+                    LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
                 End If
             Else
                 '同时出现在当前卡片与收藏夹
-                LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+                LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
             End If
         Catch ex As OperationCanceledException
-            Log(ex, "删除版本 " & Version.Name & " 被主动取消")
+            Log(ex, "删除版本 " & Instance.Name & " 被主动取消")
         Catch ex As Exception
-            Log(ex, "删除版本 " & Version.Name & " 失败", LogLevel.Msgbox)
+            Log(ex, "删除版本 " & Instance.Name & " 失败", LogLevel.Msgbox)
         End Try
     End Sub
 

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

@@ -1,9 +1,6 @@
 Public Class ModSetup
+    Private Const VersionSetup As Integer = 1
 
-    ''' <summary>
-    ''' 设置的更新号。
-    ''' </summary>
-    Public Const VersionSetup As Integer = 1
     ''' <summary>
     ''' 设置列表。
     ''' </summary>
@@ -43,6 +40,7 @@
         {"SystemSystemUpdate", New SetupEntry(0)},
         {"SystemSystemActivity", New SetupEntry(0)},
         {"SystemSystemTelemetry", New SetupEntry(True, Source:=SetupSource.Registry)},
+        {"CacheDrops", New SetupEntry("", Source:=SetupSource.Registry)},
         {"CacheConfig", New SetupEntry(0, Source:=SetupSource.Registry)},
         {"CacheExportConfig", New SetupEntry("", Source:=SetupSource.Registry)},
         {"CacheSavedPageUrl", New SetupEntry("", Source:=SetupSource.Registry)},
@@ -112,7 +110,6 @@
         {"LaunchRamType", New SetupEntry(0)},
         {"LaunchRamCustom", New SetupEntry(15)},
         {"LinkLastAutoJoinInviteCode", New SetupEntry("", Source:=SetupSource.Registry)},
-        {"LinkShareMode", New SetupEntry(True, Source:=SetupSource.Registry)},
         {"LinkLatencyMode", New SetupEntry(0, Source:=SetupSource.Registry)},
         {"LinkCustomPeer", New SetupEntry("")},
         {"LinkEasyTierVersion", New SetupEntry(-1, Source:=SetupSource.Registry)},
@@ -174,29 +171,29 @@
         {"UiHiddenOtherVote", New SetupEntry(False)},
         {"UiHiddenOtherAbout", New SetupEntry(False)},
         {"UiHiddenOtherTest", New SetupEntry(False)},
-        {"VersionAdvanceJvm", New SetupEntry("", Source:=SetupSource.Version)},
-        {"VersionAdvanceGame", New SetupEntry("", Source:=SetupSource.Version)},
-        {"VersionAdvanceAssets", New SetupEntry(0, Source:=SetupSource.Version)},
-        {"VersionAdvanceAssetsV2", New SetupEntry(False, Source:=SetupSource.Version)},
-        {"VersionAdvanceJava", New SetupEntry(False, Source:=SetupSource.Version)},
-        {"VersionAdvanceRun", New SetupEntry("", Source:=SetupSource.Version)},
-        {"VersionAdvanceRunWait", New SetupEntry(True, Source:=SetupSource.Version)},
-        {"VersionAdvanceDisableJLW", New SetupEntry(False, Source:=SetupSource.Version)},
-        {"VersionAdvanceDisableModUpdate", New SetupEntry(False, Source:=SetupSource.Version)},
-        {"VersionRamType", New SetupEntry(2, Source:=SetupSource.Version)},
-        {"VersionRamCustom", New SetupEntry(15, Source:=SetupSource.Version)},
-        {"VersionRamOptimize", New SetupEntry(0, Source:=SetupSource.Version)},
-        {"VersionArgumentTitle", New SetupEntry("", Source:=SetupSource.Version)},
-        {"VersionArgumentInfo", New SetupEntry("", Source:=SetupSource.Version)},
-        {"VersionArgumentIndie", New SetupEntry(-1, Source:=SetupSource.Version)},
-        {"VersionArgumentIndieV2", New SetupEntry(False, Source:=SetupSource.Version)},
-        {"VersionArgumentJavaSelect", New SetupEntry("使用全局设置", Source:=SetupSource.Version)},
-        {"VersionServerEnter", New SetupEntry("", Source:=SetupSource.Version)},
-        {"VersionServerLogin", New SetupEntry(0, Source:=SetupSource.Version)},
-        {"VersionServerNide", New SetupEntry("", Source:=SetupSource.Version)},
-        {"VersionServerAuthRegister", New SetupEntry("", Source:=SetupSource.Version)},
-        {"VersionServerAuthName", New SetupEntry("", Source:=SetupSource.Version)},
-        {"VersionServerAuthServer", New SetupEntry("", Source:=SetupSource.Version)}
+        {"VersionAdvanceJvm", New SetupEntry("", Source:=SetupSource.Instance)},
+        {"VersionAdvanceGame", New SetupEntry("", Source:=SetupSource.Instance)},
+        {"VersionAdvanceAssets", New SetupEntry(0, Source:=SetupSource.Instance)},
+        {"VersionAdvanceAssetsV2", New SetupEntry(False, Source:=SetupSource.Instance)},
+        {"VersionAdvanceJava", New SetupEntry(False, Source:=SetupSource.Instance)},
+        {"VersionAdvanceRun", New SetupEntry("", Source:=SetupSource.Instance)},
+        {"VersionAdvanceRunWait", New SetupEntry(True, Source:=SetupSource.Instance)},
+        {"VersionAdvanceDisableJLW", New SetupEntry(False, Source:=SetupSource.Instance)},
+        {"VersionAdvanceDisableModUpdate", New SetupEntry(False, Source:=SetupSource.Instance)},
+        {"VersionRamType", New SetupEntry(2, Source:=SetupSource.Instance)},
+        {"VersionRamCustom", New SetupEntry(15, Source:=SetupSource.Instance)},
+        {"VersionRamOptimize", New SetupEntry(0, Source:=SetupSource.Instance)},
+        {"VersionArgumentTitle", New SetupEntry("", Source:=SetupSource.Instance)},
+        {"VersionArgumentInfo", New SetupEntry("", Source:=SetupSource.Instance)},
+        {"VersionArgumentIndie", New SetupEntry(-1, Source:=SetupSource.Instance)},
+        {"VersionArgumentIndieV2", New SetupEntry(False, Source:=SetupSource.Instance)},
+        {"VersionArgumentJavaSelect", New SetupEntry("使用全局设置", Source:=SetupSource.Instance)},
+        {"VersionServerEnter", New SetupEntry("", Source:=SetupSource.Instance)},
+        {"VersionServerLogin", New SetupEntry(0, Source:=SetupSource.Instance)},
+        {"VersionServerNide", New SetupEntry("", Source:=SetupSource.Instance)},
+        {"VersionServerAuthRegister", New SetupEntry("", Source:=SetupSource.Instance)},
+        {"VersionServerAuthName", New SetupEntry("", Source:=SetupSource.Instance)},
+        {"VersionServerAuthServer", New SetupEntry("", Source:=SetupSource.Instance)}
     }
 
 #Region "基础"
@@ -204,7 +201,7 @@
     Private Enum SetupSource
         Normal
         Registry
-        Version
+        Instance
     End Enum
     Private Class SetupEntry
 
@@ -239,18 +236,18 @@
     ''' <summary>
     ''' 改变某个设置项的值。
     ''' </summary>
-    Public Sub [Set](Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
-        [Set](Key, Value, SetupDict(Key), ForceReload, Version)
+    Public Sub [Set](Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing)
+        [Set](Key, Value, SetupDict(Key), ForceReload, Instance)
     End Sub
     ''' <summary>
     ''' 写入某个未经加密的设置项。
     ''' 若该设置项经过了加密,则会抛出异常。
     ''' </summary>
-    Public Sub SetSafe(Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
+    Public Sub SetSafe(Key As String, Value As Object, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing)
         If SetupDict(Key).Encoded Then Throw New InvalidOperationException("禁止写入加密设置项:" & Key)
-        [Set](Key, Version, ForceReload, Version)
+        [Set](Key, Instance, ForceReload, Instance)
     End Sub
-    Private Sub [Set](Key As String, Value As Object, E As SetupEntry, ForceReload As Boolean, Version As McVersion)
+    Private Sub [Set](Key As String, Value As Object, E As SetupEntry, ForceReload As Boolean, Instance As McInstance)
         Try
 
             Value = CTypeDynamic(Value, E.Type)
@@ -259,7 +256,7 @@
                 If E.Value = Value AndAlso Not ForceReload Then Return
             Else
                 '如果未应用,则直接更改并应用
-                If E.Source <> SetupSource.Version Then E.State = 2
+                If E.Source <> SetupSource.Instance Then E.State = 2
             End If
             '设置新值
             E.Value = Value
@@ -277,9 +274,9 @@
                     WriteIni("Setup", Key, Value)
                 Case SetupSource.Registry
                     WriteReg(Key, Value)
-                Case SetupSource.Version
-                    If Version Is Nothing Then Throw New Exception($"更改版本设置 {Key} 时未提供目标版本")
-                    WriteIni(Version.Path & "PCL\Setup.ini", Key, Value)
+                Case SetupSource.Instance
+                    If Instance Is Nothing Then Throw New Exception($"更改版本设置 {Key} 时未提供目标版本")
+                    WriteIni(Instance.PathVersion & "PCL\Setup.ini", Key, Value)
             End Select
             '应用
             '例如 VersionServerLogin 要求在设置之后再引发事件
@@ -294,15 +291,15 @@
     ''' <summary>
     ''' 应用某个设置项的值。
     ''' </summary>
-    Public Function Load(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
-        Return Load(Key, SetupDict(Key), ForceReload, Version)
+    Public Function Load(Key As String, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing)
+        Return Load(Key, SetupDict(Key), ForceReload, Instance)
     End Function
-    Private Function Load(Key As String, E As SetupEntry, ForceReload As Boolean, Version As McVersion)
+    Private Function Load(Key As String, E As SetupEntry, ForceReload As Boolean, Instance As McInstance)
         '如果已经应用过,则什么也不干
         If E.State = 2 AndAlso Not ForceReload Then Return E.Value
         '读取,应用并设置状态
-        Read(Key, E, Version)
-        If E.Source <> SetupSource.Version Then E.State = 2
+        Read(Key, E, Instance)
+        If E.Source <> SetupSource.Instance Then E.State = 2
         Dim Method As Reflection.MethodInfo = GetType(ModSetup).GetMethod(Key)
         If Method IsNot Nothing Then Method.Invoke(Me, {E.Value})
         Return E.Value
@@ -311,19 +308,19 @@
     ''' <summary>
     ''' 获取某个设置项的值。
     ''' </summary>
-    Public Function [Get](Key As String, Optional Version As McVersion = Nothing)
+    Public Function [Get](Key As String, Optional Instance As McInstance = Nothing)
         If Not SetupDict.ContainsKey(Key) Then Throw New KeyNotFoundException("未找到设置项:" & Key)
-        Return [Get](Key, SetupDict(Key), Version)
+        Return [Get](Key, SetupDict(Key), Instance)
     End Function
     ''' <summary>
     ''' 获取某个未经加密的设置项的值。
     ''' 若该设置项经过了加密,则会抛出异常。
     ''' </summary>
-    Public Function GetSafe(Key As String, Optional Version As McVersion = Nothing)
+    Public Function GetSafe(Key As String, Optional Instance As McInstance = Nothing)
         If SetupDict(Key).Encoded Then Throw New InvalidOperationException("禁止读取加密设置项:" & Key)
-        Return [Get](Key, Version)
+        Return [Get](Key, Instance)
     End Function
-    Private Function [Get](Key As String, E As SetupEntry, Version As McVersion)
+    Private Function [Get](Key As String, E As SetupEntry, Instance As McInstance)
         '获取强制值
         Dim Force As String = ForceValue(Key)
         If Force IsNot Nothing Then
@@ -332,8 +329,8 @@
         End If
         '如果尚未读取过,则读取
         If E.State = 0 Then
-            Read(Key, E, Version)
-            If E.Source <> SetupSource.Version Then E.State = 1
+            Read(Key, E, Instance)
+            If E.Source <> SetupSource.Instance Then E.State = 1
         End If
         '返回现在的值
         Return E.Value
@@ -342,17 +339,17 @@
     ''' <summary>
     ''' 初始化某个设置项的值。
     ''' </summary>
-    Public Sub Reset(Key As String, Optional ForceReload As Boolean = False, Optional Version As McVersion = Nothing)
+    Public Sub Reset(Key As String, Optional ForceReload As Boolean = False, Optional Instance As McInstance = Nothing)
         Dim E As SetupEntry = SetupDict(Key)
-        [Set](Key, E.DefaultValue, E, ForceReload, Version)
+        [Set](Key, E.DefaultValue, E, ForceReload, Instance)
         Select Case SetupDict(Key).Source
             Case SetupSource.Normal
                 DeleteIniKey("Setup", Key)
             Case SetupSource.Registry
                 DeleteReg(Key)
-            Case Else 'SetupSource.Version
-                If Version Is Nothing Then Throw New Exception($"重置版本设置 {Key} 时未提供目标版本")
-                DeleteIniKey(Version.Path & "PCL\Setup.ini", Key)
+            Case Else 'SetupSource.Instance
+                If Instance Is Nothing Then Throw New Exception($"重置版本设置 {Key} 时未提供目标版本")
+                DeleteIniKey(Instance.PathVersion & "PCL\Setup.ini", Key)
         End Select
     End Sub
     ''' <summary>
@@ -364,22 +361,22 @@
     ''' <summary>
     ''' 某个设置项是否从未被设置过。
     ''' </summary>
-    Public Function IsUnset(Key As String, Optional Version As McVersion = Nothing) As Boolean
+    Public Function IsUnset(Key As String, Optional Instance As McInstance = Nothing) As Boolean
         Select Case SetupDict(Key).Source
             Case SetupSource.Normal
                 Return Not HasIniKey("Setup", Key)
             Case SetupSource.Registry
                 Return Not HasReg(Key)
-            Case Else 'SetupSource.Version
-                If Version Is Nothing Then Throw New Exception($"判断版本设置 {Key} 是否存在时未提供目标版本")
-                Return Not HasIniKey(Version.Path & "PCL\Setup.ini", Key)
+            Case Else 'SetupSource.Instance
+                If Instance Is Nothing Then Throw New Exception($"判断版本设置 {Key} 是否存在时未提供目标版本")
+                Return Not HasIniKey(Instance.PathVersion & "PCL\Setup.ini", Key)
         End Select
     End Function
 
     ''' <summary>
     ''' 读取设置。
     ''' </summary>
-    Private Sub Read(Key As String, ByRef E As SetupEntry, Version As McVersion)
+    Private Sub Read(Key As String, ByRef E As SetupEntry, Instance As McInstance)
         Try
             If Not E.State = 0 Then Return
             Dim SourceValue As String = Nothing '先用 String 储存,避免类型转换
@@ -388,11 +385,11 @@
                     SourceValue = ReadIni("Setup", Key, E.DefaultValueEncoded)
                 Case SetupSource.Registry
                     SourceValue = ReadReg(Key, E.DefaultValueEncoded)
-                Case SetupSource.Version
-                    If Version Is Nothing Then
+                Case SetupSource.Instance
+                    If Instance Is Nothing Then
                         Throw New Exception("读取版本设置 " & Key & " 时未提供目标版本")
                     Else
-                        SourceValue = ReadIni(Version.Path & "PCL\Setup.ini", Key, E.DefaultValueEncoded)
+                        SourceValue = ReadIni(Instance.PathVersion & "PCL\Setup.ini", Key, E.DefaultValueEncoded)
                     End If
             End Select
             If E.Encoded Then
@@ -420,6 +417,8 @@
 #If BETA Then
         If Key = "UiLauncherTheme" Then Return "0"
 #End If
+        If Key = "UiHiddenPageLink" Then Return True
+        If Key = "UiHiddenSetupLink" Then Return True
         Return Nothing
     End Function
 
@@ -430,11 +429,11 @@
     '切换选择
     Public Sub LaunchVersionSelect(Value As String)
         Log("[Setup] 当前选择的 Minecraft 版本:" & Value)
-        WriteIni(PathMcFolder & "PCL.ini", "Version", If(IsNothing(McVersionCurrent), "", McVersionCurrent.Name))
+        WriteIni(McFolderSelected & "PCL.ini", "Version", If(IsNothing(McInstanceSelected), "", McInstanceSelected.Name))
     End Sub
     Public Sub LaunchFolderSelect(Value As String)
         Log("[Setup] 当前选择的 Minecraft 文件夹:" & Value.ToString.Replace("$", Path))
-        PathMcFolder = Value.ToString.Replace("$", Path)
+        McFolderSelected = Value.ToString.Replace("$", Path)
     End Sub
 
     '游戏内存
@@ -762,18 +761,18 @@
 
     '游戏内存
     Public Sub VersionRamType(Type As Integer)
-        If FrmVersionSetup Is Nothing Then Return
-        FrmVersionSetup.RamType(Type)
+        If FrmInstanceSetup Is Nothing Then Return
+        FrmInstanceSetup.RamType(Type)
     End Sub
 
     '服务器
     Public Sub VersionServerLogin(Type As Integer)
-        If FrmVersionSetup Is Nothing Then Return
+        If FrmInstanceSetup Is Nothing Then Return
         '为第三方登录清空缓存以更新描述
-        WriteIni(PathMcFolder & "PCL.ini", "VersionCache", "")
-        If PageVersionLeft.Version Is Nothing Then Return
-        PageVersionLeft.Version = New McVersion(PageVersionLeft.Version.Name).Load()
-        LoaderFolderRun(McVersionListLoader, PathMcFolder, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
+        WriteIni(McFolderSelected & "PCL.ini", "InstanceCache", "")
+        If PageInstanceLeft.Instance Is Nothing Then Return
+        PageInstanceLeft.Instance = New McInstance(PageInstanceLeft.Instance.Name).Load()
+        LoaderFolderRun(McInstanceListLoader, McFolderSelected, LoaderFolderRunType.ForceRun, MaxDepth:=1, ExtraPath:="versions\")
     End Sub
 
 #End Region

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

@@ -252,8 +252,8 @@
                     <StackPanel Margin="0,12,0,4" Grid.Row="6" Grid.ColumnSpan="2" HorizontalAlignment="Left">
                         <local:MyCheckBox Height="28" Text="禁用 Java Launch Wrapper" x:Name="CheckAdvanceDisableJLW" Tag="LaunchAdvanceDisableJLW"
                             ToolTipService.Placement="Right" ToolTip="PCL 会使用 Java Launch Wrapper 来修复老版本 Java 在中文路径下无法启动的问题。&#xa;如果这被反作弊拦截,或遇到其他问题,也可以将其关闭。" />
-                        <local:MyCheckBox Height="28" Text="要求 Java 使用高性能显卡" x:Name="CheckAdvanceGraphicCard" Tag="LaunchAdvanceGraphicCard"
-                            ToolTipService.Placement="Right" ToolTip="自动在 Windows 设置 → 系统 → 屏幕 → 显示卡 中将 Java 改为使用高性能显卡。&#xa;如果电脑同时有集显和独显,这能确保 MC 使用独显进行渲染,以大幅提高性能。" />
+                        <local:MyCheckBox Height="28" Text="使用高性能显卡" x:Name="CheckAdvanceGraphicCard" Tag="LaunchAdvanceGraphicCard"
+                            ToolTipService.Placement="Right" ToolTip="自动在 Windows 设置 → 系统 → 屏幕 → 显示卡 中将 PCL 和 Java 改为使用高性能显卡。&#xa;如果同时有集成显卡和独立显卡,这能确保 MC 使用独立显卡进行渲染,以大幅提高帧率。" />
                     </StackPanel>
                     <local:MyHint Text="版本独立设置中还有更多高级选项可供调整。" Margin="0,5,0,10" Theme="Blue" Grid.Row="7" Grid.ColumnSpan="2"
                                   CanClose="True" RelativeSetup="HintMoreAdvancedSetup" />

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

@@ -7,7 +7,7 @@
         '重复加载部分
         PanBack.ScrollToHome()
         RefreshRam(False)
-        If McVersionCurrent Is Nothing Then
+        If McInstanceSelected Is Nothing Then
             BtnSwitch.Visibility = Visibility.Collapsed
         Else
             BtnSwitch.Visibility = Visibility.Visible
@@ -197,7 +197,7 @@
     Public Sub RefreshRam(ShowAnim As Boolean)
         If LabRamGame Is Nothing OrElse LabRamUsed Is Nothing OrElse FrmMain.PageCurrent <> FormMain.PageType.Setup OrElse FrmSetupLeft.PageID <> FormMain.PageSubType.SetupLaunch Then Return
         '获取内存情况
-        Dim RamGame As Double = Math.Round(GetRam(McVersionCurrent, False), 5)
+        Dim RamGame As Double = Math.Round(GetRam(McInstanceSelected, False), 5)
         Dim RamTotal As Double = Math.Round(My.Computer.Info.TotalPhysicalMemory / 1024 / 1024 / 1024, 1)
         Dim RamAvailable As Double = Math.Round(My.Computer.Info.AvailablePhysicalMemory / 1024 / 1024 / 1024, 1)
         Dim RamGameActual As Double = Math.Round(Math.Min(RamGame, RamAvailable), 5)
@@ -324,10 +324,10 @@
     ''' <summary>
     ''' 获取当前设置的 RAM 值。单位为 GB。
     ''' </summary>
-    Public Shared Function GetRam(Version As McVersion, UseVersionJavaSetup As Boolean, Optional Is32BitJava As Boolean? = Nothing) As Double
+    Public Shared Function GetRam(Instance As McInstance, UseVersionJavaSetup As Boolean, Optional Is32BitJava As Boolean? = Nothing) As Double
 
         '------------------------------------------
-        ' 修改下方代码时需要一并修改 PageVersionSetup
+        ' 修改下方代码时需要一并修改 PageInstanceSetup
         '------------------------------------------
 
         Dim RamGive As Double
@@ -339,16 +339,16 @@
             Dim RamTarget1 As Double '估计能勉强带动了的内存
             Dim RamTarget2 As Double '估计没啥问题了的内存
             Dim RamTarget3 As Double '放一百万个材质和 Mod 和光影需要的内存
-            If Version IsNot Nothing AndAlso Not Version.IsLoaded Then Version.Load()
-            If Version IsNot Nothing AndAlso Version.Modable Then
+            If Instance IsNot Nothing AndAlso Not Instance.IsLoaded Then Instance.Load()
+            If Instance IsNot Nothing AndAlso Instance.Modable Then
                 '可安装 Mod 的版本
-                Dim ModDir As New DirectoryInfo(Version.PathIndie & "mods\")
+                Dim ModDir As New DirectoryInfo(Instance.PathIndie & "mods\")
                 Dim ModCount As Integer = If(ModDir.Exists, ModDir.GetFiles.Length, 0)
                 RamMininum = 0.5 + ModCount / 150
                 RamTarget1 = 1.5 + ModCount / 90
                 RamTarget2 = 2.7 + ModCount / 50
                 RamTarget3 = 4.5 + ModCount / 25
-            ElseIf Version IsNot Nothing AndAlso Version.Version.HasOptiFine Then
+            ElseIf Instance IsNot Nothing AndAlso Instance.Version.HasOptiFine Then
                 'OptiFine 版本
                 RamMininum = 0.5
                 RamTarget1 = 1.5
@@ -399,7 +399,7 @@ PreFin:
             End If
         End If
         '若使用 32 位 Java,则限制为 1G
-        If If(Is32BitJava, Not JavaIs64Bit(If(UseVersionJavaSetup, Version, Nothing))) Then RamGive = Math.Min(1, RamGive)
+        If If(Is32BitJava, Not JavaIs64Bit(If(UseVersionJavaSetup, Instance, Nothing))) Then RamGive = Math.Min(1, RamGive)
         Return RamGive
     End Function
 
@@ -417,7 +417,7 @@ PreFin:
         Dim SelectedItem As MyComboBoxItem = Nothing
         Dim SelectedBySetup As String = Setup.Get("LaunchArgumentJavaSelect")
         Try
-            For Each Java In JavaList.Clone().OrderByDescending(Function(v) v.VersionCode)
+            For Each Java In JavaList.Clone().OrderByDescending(Function(v) v.MajorVersion)
                 Dim ListItem = New MyComboBoxItem With {.Content = Java.ToString, .ToolTip = Java.PathFolder, .Tag = Java}
                 ToolTipService.SetHorizontalOffset(ListItem, 400)
                 ComboArgumentJava.Items.Add(ListItem)
@@ -580,9 +580,9 @@ PreFin:
 
     '切换到版本独立设置
     Private Sub BtnSwitch_Click(sender As Object, e As MouseButtonEventArgs) Handles BtnSwitch.Click
-        McVersionCurrent.Load()
-        PageVersionLeft.Version = McVersionCurrent
-        FrmMain.PageChange(FormMain.PageType.VersionSetup, FormMain.PageSubType.VersionSetup)
+        McInstanceSelected.Load()
+        PageInstanceLeft.Instance = McInstanceSelected
+        FrmMain.PageChange(FormMain.PageType.InstanceSetup, FormMain.PageSubType.InstanceSetup)
     End Sub
 
     '去除参数中的回车

+ 0 - 2
Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml

@@ -39,8 +39,6 @@
                     <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text="自定义节点" Margin="0,0,25,0" />
                     <local:MyTextBox x:Name="TextCustomPeer" Tag="LinkCustomPeer" Grid.Column="1" MaxHeight="28" 
                         ToolTip="覆盖 PCL 所选择的节点,仅连接此处填写的节点。&#xa;如果你自己搭建了 EasyTier 节点,你可以用这个设置让 PCL 连接它。&#xa;&#xa;使用逗号分隔多个节点,例如:&#xa;tcp://public.easytier.cn:11010,tcp://public2.easytier.cn:54321&#xa;&#xa;房主和加入者必须连接到至少一个相同节点,才能互相连上。" />
-                    <local:MyCheckBox Text="老好人模式" x:Name="CheckShareMode" Grid.Row="1" Tag="LinkShareMode" Height="22" Visibility="Collapsed"
-                        ToolTip="启动联机后,用你的网络帮助其他玩家建立连接、降低延迟!&#xa;即使你不开启,开启了这个选项的其他玩家也会帮助你,不过,人人为我,我为人人嘛……" />
                     <StackPanel Orientation="Horizontal" Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Left">
                         <local:MyButton MinWidth="140" Padding="13,5" Margin="0,0,20,0" HorizontalAlignment="Left"
                             Text=" 光荣地贡献节点!" ColorType="Highlight"

+ 0 - 5
Plain Craft Launcher 2/Pages/PageSetup/PageSetupLink.xaml.vb

@@ -18,7 +18,6 @@
     End Sub
     Public Sub Reload()
         ComboLatencyMode.SelectedIndex = Setup.Get("LinkLatencyMode")
-        CheckShareMode.Checked = Setup.Get("LinkShareMode")
         TextCustomPeer.Text = Setup.Get("LinkCustomPeer")
     End Sub
 
@@ -26,7 +25,6 @@
     Public Sub Reset()
         Try
             Setup.Reset("LinkLatencyMode")
-            Setup.Reset("LinkShareMode")
             Setup.Reset("LinkCustomPeer")
 
             Log("[Setup] 已初始化联机页设置")
@@ -42,9 +40,6 @@
     Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextCustomPeer.ValidatedTextChanged
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Text)
     End Sub
-    Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckShareMode.Change
-        If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked)
-    End Sub
     Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboLatencyMode.SelectionChanged
         If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex)
     End Sub

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

@@ -248,12 +248,14 @@
                             <local:MyComboBoxItem Content="Minecraft 皮肤推荐(作者:wkea)" />
                             <local:MyComboBoxItem Content="OpenBMCLAPI 仪表盘 Lite(作者:Silverteal、Mxmilu666)" />
                             <local:MyComboBoxItem Content="PCL 主页市场(作者:凌云)" />
-                            <local:MyComboBoxItem Content="PCL 新闻速报(作者:Joker2184)" />
+                            <local:MyComboBoxItem Content="PCL 新闻速报(作者:Joker2184)" Visibility="Collapsed" />
                             <local:MyComboBoxItem Content="PCL 新功能说明书(作者:WForst-Breeze)" />
                             <local:MyComboBoxItem Content="OpenMCIM 仪表盘(作者:SALTWOOD)" Visibility="Collapsed" />
                             <local:MyComboBoxItem Content="杂志主页(作者:CreeperIsASpy)" />
                             <local:MyComboBoxItem Content="PCL GitHub 仪表盘(作者:Deep-Dark-Forest)" />
                             <local:MyComboBoxItem Content="Minecraft 更新摘要(作者:pynickle,部分由 AI 生成)" />
+                            <local:MyComboBoxItem Content="今日新闻热点(作者:EYicheng,部分由 AI 生成)" />
+                            <local:MyComboBoxItem Content="Minecraft 芝士站(作者:awaEric233,部分由 AI 生成)" />
                         </local:MyComboBox>
                     </Grid>
                 </StackPanel>
@@ -281,12 +283,12 @@
                         </Grid.RowDefinitions>
                         <TextBlock Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Left" Text="主页面" />
                         <local:MyCheckBox Height="22" VerticalAlignment="Center" Grid.Row="1" Grid.Column="2" Text="下载" x:Name="CheckHiddenPageDownload" Tag="UiHiddenPageDownload" />
-                        <local:MyCheckBox Height="22" VerticalAlignment="Center" Grid.Row="1" Grid.Column="3" Text="联机" x:Name="CheckHiddenPageLink" Tag="UiHiddenPageLink" />
+                        <local:MyCheckBox Height="22" VerticalAlignment="Center" Grid.Row="1" Grid.Column="3" Text="联机" x:Name="CheckHiddenPageLink" Tag="UiHiddenPageLink" IsEnabled="False" />
                         <local:MyCheckBox Height="22" VerticalAlignment="Center" Grid.Row="1" Grid.Column="4" Text="设置" x:Name="CheckHiddenPageSetup" Tag="UiHiddenPageSetup" />
                         <local:MyCheckBox Height="22" VerticalAlignment="Center" Grid.Row="1" Grid.Column="5" Text="更多" x:Name="CheckHiddenPageOther" Tag="UiHiddenPageOther" />
                         <TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="设置 子页面" />
                         <local:MyCheckBox Height="22" VerticalAlignment="Center" Grid.Row="2" Grid.Column="2" Text="启动" x:Name="CheckHiddenSetupLaunch" Tag="UiHiddenSetupLaunch" />
-                        <local:MyCheckBox Height="22" VerticalAlignment="Center" Grid.Row="2" Grid.Column="3" Text="联机" x:Name="CheckHiddenSetupLink" Tag="UiHiddenSetupLink" />
+                        <local:MyCheckBox Height="22" VerticalAlignment="Center" Grid.Row="2" Grid.Column="3" Text="联机" x:Name="CheckHiddenSetupLink" Tag="UiHiddenSetupLink" IsEnabled="False" />
                         <local:MyCheckBox Height="22" VerticalAlignment="Center" Grid.Row="2" Grid.Column="4" Text="个性化" x:Name="CheckHiddenSetupUI" Tag="UiHiddenSetupUi" />
                         <local:MyCheckBox Height="22" VerticalAlignment="Center" Grid.Row="2" Grid.Column="5" Text="其他" x:Name="CheckHiddenSetupSystem" Tag="UiHiddenSetupSystem" />
                         <TextBlock Grid.Row="3" VerticalAlignment="Center" HorizontalAlignment="Left" Text="更多 子页面" />

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

@@ -523,7 +523,7 @@ Refresh:
                 '顶部栏未被全部隐藏
                 FrmMain.PanTitleSelect.Visibility = Visibility.Visible
                 FrmMain.BtnTitleSelect1.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageDownload"), Visibility.Collapsed, Visibility.Visible)
-                FrmMain.BtnTitleSelect2.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageLink"), Visibility.Collapsed, Visibility.Visible)
+                FrmMain.BtnTitleSelect2.Visibility = Visibility.Collapsed 'If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageLink"), Visibility.Collapsed, Visibility.Visible)
                 FrmMain.BtnTitleSelect3.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageSetup"), Visibility.Collapsed, Visibility.Visible)
                 FrmMain.BtnTitleSelect4.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenPageOther"), Visibility.Collapsed, Visibility.Visible)
             End If
@@ -536,13 +536,13 @@ Refresh:
             If FrmSetupLeft IsNot Nothing Then
                 FrmSetupLeft.ItemLaunch.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupLaunch"), Visibility.Collapsed, Visibility.Visible)
                 FrmSetupLeft.ItemUI.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupUi"), Visibility.Collapsed, Visibility.Visible)
-                FrmSetupLeft.ItemLink.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupLink"), Visibility.Collapsed, Visibility.Visible)
+                FrmSetupLeft.ItemLink.Visibility = Visibility.Collapsed 'If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupLink"), Visibility.Collapsed, Visibility.Visible)
                 FrmSetupLeft.ItemSystem.Visibility = If(Not HiddenForceShow AndAlso Setup.Get("UiHiddenSetupSystem"), Visibility.Collapsed, Visibility.Visible)
                 '隐藏左边选择卡
                 Dim AvaliableCount As Integer = 0
                 If Not Setup.Get("UiHiddenSetupLaunch") Then AvaliableCount += 1
                 If Not Setup.Get("UiHiddenSetupUi") Then AvaliableCount += 1
-                If Not Setup.Get("UiHiddenSetupLink") Then AvaliableCount += 1
+                'If Not Setup.Get("UiHiddenSetupLink") Then AvaliableCount += 1
                 If Not Setup.Get("UiHiddenSetupSystem") Then AvaliableCount += 1
                 FrmSetupLeft.PanItem.Visibility = If(AvaliableCount < 2 AndAlso Not HiddenForceShow, Visibility.Collapsed, Visibility.Visible)
             End If
@@ -574,9 +574,9 @@ Refresh:
                 FrmMain.BtnTitleSelect4.Text = "更多"
             End If
             '各个页面的入口
-            If FrmMain.PageCurrent = FormMain.PageType.VersionSelect Then FrmSelectRight.BtnEmptyDownload_Loaded()
+            If FrmMain.PageCurrent = FormMain.PageType.InstanceSelect Then FrmSelectRight.BtnEmptyDownload_Loaded()
             If FrmMain.PageCurrent = FormMain.PageType.Launch Then FrmLaunchLeft.RefreshButtonsUI()
-            If FrmMain.PageCurrent = FormMain.PageType.VersionSetup AndAlso FrmVersionModDisabled IsNot Nothing Then FrmVersionModDisabled.BtnDownload_Loaded()
+            If FrmMain.PageCurrent = FormMain.PageType.InstanceSetup AndAlso FrmInstanceModDisabled IsNot Nothing Then FrmInstanceModDisabled.BtnDownload_Loaded()
             '备注
             If FrmSetupUI IsNot Nothing Then FrmSetupUI.CardSwitch.Title = If(HiddenForceShow, "功能隐藏(已暂时关闭,按 F12 以重新启用)", "功能隐藏")
         Catch ex As Exception

+ 30 - 42
Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj

@@ -162,6 +162,7 @@
     </Reference>
     <Reference Include="NAudio, Version=1.7.3.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
+      <HintPath>Resources\NAudio.dll</HintPath>
       <Private>False</Private>
     </Reference>
     <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
@@ -189,6 +190,10 @@
     <Reference Include="System.Numerics" />
     <Reference Include="System.Runtime.Caching" />
     <Reference Include="System.ServiceModel" />
+    <Reference Include="System.ValueTuple, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>Resources\System.ValueTuple.dll</HintPath>
+    </Reference>
     <Reference Include="System.Windows.Forms" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System" />
@@ -207,6 +212,7 @@
     </ApplicationDefinition>
     <Compile Include="Controls\Behaviors\ClipboardInterceptor.vb" />
     <Compile Include="Controls\Behaviors\Interfaces.vb" />
+    <Compile Include="Controls\Behaviors\LazyLoadBehavior.vb" />
     <Compile Include="Controls\MyComboBox.vb" />
     <Compile Include="Controls\MyComboBoxItem.vb" />
     <Compile Include="Controls\MyCard.vb" />
@@ -222,12 +228,13 @@
 
 
 
+    <Compile Include="Controls\MyVirtualizingElement.vb" />
     <Compile Include="Modules\Minecraft\ModComp.vb" />
     <Compile Include="Modules\Minecraft\ModJava.vb" />
     <Compile Include="Modules\Minecraft\ModMod.vb" />
     <Compile Include="Modules\Minecraft\ModModpack.vb" />
     <Compile Include="Modules\ThirdParty\DragHelper.vb" />
-    <Compile Include="Pages\PageVersion\MyLocalModItem.xaml.vb">
+    <Compile Include="Pages\PageInstance\MyLocalModItem.xaml.vb">
       <DependentUpon>MyLocalModItem.xaml</DependentUpon>
     </Compile>
     <Compile Include="Modules\ModEvent.vb" />
@@ -312,23 +319,23 @@
     <Compile Include="Pages\PageOther\PageOtherHelpDetail.xaml.vb">
       <DependentUpon>PageOtherHelpDetail.xaml</DependentUpon>
     </Compile>
-    <Compile Include="Pages\PageVersion\PageVersionExport.xaml.vb">
-      <DependentUpon>PageVersionExport.xaml</DependentUpon>
+    <Compile Include="Pages\PageInstance\PageInstanceExport.xaml.vb">
+      <DependentUpon>PageInstanceExport.xaml</DependentUpon>
     </Compile>
-    <Compile Include="Pages\PageVersion\PageVersionLeft.xaml.vb">
-      <DependentUpon>PageVersionLeft.xaml</DependentUpon>
+    <Compile Include="Pages\PageInstance\PageInstanceLeft.xaml.vb">
+      <DependentUpon>PageInstanceLeft.xaml</DependentUpon>
     </Compile>
-    <Compile Include="Pages\PageVersion\PageVersionMod.xaml.vb">
-      <DependentUpon>PageVersionMod.xaml</DependentUpon>
+    <Compile Include="Pages\PageInstance\PageInstanceMod.xaml.vb">
+      <DependentUpon>PageInstanceMod.xaml</DependentUpon>
     </Compile>
-    <Compile Include="Pages\PageVersion\PageVersionModDisabled.xaml.vb">
-      <DependentUpon>PageVersionModDisabled.xaml</DependentUpon>
+    <Compile Include="Pages\PageInstance\PageInstanceModDisabled.xaml.vb">
+      <DependentUpon>PageInstanceModDisabled.xaml</DependentUpon>
     </Compile>
-    <Compile Include="Pages\PageVersion\PageVersionOverall.xaml.vb">
-      <DependentUpon>PageVersionOverall.xaml</DependentUpon>
+    <Compile Include="Pages\PageInstance\PageInstanceOverall.xaml.vb">
+      <DependentUpon>PageInstanceOverall.xaml</DependentUpon>
     </Compile>
-    <Compile Include="Pages\PageVersion\PageVersionSetup.xaml.vb">
-      <DependentUpon>PageVersionSetup.xaml</DependentUpon>
+    <Compile Include="Pages\PageInstance\PageInstanceSetup.xaml.vb">
+      <DependentUpon>PageInstanceSetup.xaml</DependentUpon>
     </Compile>
     <Compile Include="Controls\MyDropShadow.vb" />
     <Compile Include="Modules\Base\ModLoader.vb" />
@@ -497,7 +504,7 @@
       <SubType>Code</SubType>
     </Compile>
 
-    <Page Include="Pages\PageVersion\MyLocalModItem.xaml">
+    <Page Include="Pages\PageInstance\MyLocalModItem.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
@@ -574,7 +581,7 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
-    <Page Include="Pages\PageVersion\PageVersionExport.xaml">
+    <Page Include="Pages\PageInstance\PageInstanceExport.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
@@ -654,23 +661,23 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
-    <Page Include="Pages\PageVersion\PageVersionLeft.xaml">
+    <Page Include="Pages\PageInstance\PageInstanceLeft.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
-    <Page Include="Pages\PageVersion\PageVersionMod.xaml">
+    <Page Include="Pages\PageInstance\PageInstanceMod.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
-    <Page Include="Pages\PageVersion\PageVersionModDisabled.xaml">
+    <Page Include="Pages\PageInstance\PageInstanceModDisabled.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
-    <Page Include="Pages\PageVersion\PageVersionOverall.xaml">
+    <Page Include="Pages\PageInstance\PageInstanceOverall.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
-    <Page Include="Pages\PageVersion\PageVersionSetup.xaml">
+    <Page Include="Pages\PageInstance\PageInstanceSetup.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
@@ -801,28 +808,6 @@
   <ItemGroup>
     <Resource Include="Images\Themes\10.png" />
   </ItemGroup>
-  <ItemGroup>
-    <PublishFile Include="NAudio">
-      <Visible>False</Visible>
-      <Group>
-      </Group>
-      <TargetPath>
-      </TargetPath>
-      <PublishState>Exclude</PublishState>
-      <IncludeHash>True</IncludeHash>
-      <FileType>Assembly</FileType>
-    </PublishFile>
-    <PublishFile Include="Newtonsoft.Json">
-      <Visible>False</Visible>
-      <Group>
-      </Group>
-      <TargetPath>
-      </TargetPath>
-      <PublishState>Exclude</PublishState>
-      <IncludeHash>True</IncludeHash>
-      <FileType>Assembly</FileType>
-    </PublishFile>
-  </ItemGroup>
   <ItemGroup>
     <Resource Include="Images\Heads\Patrick.png" />
   </ItemGroup>
@@ -936,5 +921,8 @@
   <ItemGroup>
     <Resource Include="Images\Heads\EasyTier.png" />
   </ItemGroup>
+  <ItemGroup>
+    <Content Include="Resources\System.ValueTuple.dll" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
 </Project>

BIN
Plain Craft Launcher 2/Resources/Help.zip


Dosya farkı çok büyük olduğundan ihmal edildi
+ 124 - 124
Plain Craft Launcher 2/Resources/ModData.txt


BIN
Plain Craft Launcher 2/Resources/System.ValueTuple.dll


Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor