龙腾猫跃 3 anni fa
parent
commit
cf74de5789
23 ha cambiato i file con 296 aggiunte e 171 eliminazioni
  1. 6 3
      Plain Craft Launcher 2/Application.xaml
  2. 40 37
      Plain Craft Launcher 2/Application.xaml.vb
  3. 6 0
      Plain Craft Launcher 2/Controls/MyComboBox.vb
  4. 39 13
      Plain Craft Launcher 2/Controls/MyPageRight.vb
  5. 7 0
      Plain Craft Launcher 2/Controls/MyScrollViewer.vb
  6. 17 0
      Plain Craft Launcher 2/FormMain.xaml.vb
  7. 7 7
      Plain Craft Launcher 2/Modules/Base/ModBase.vb
  8. 5 5
      Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb
  9. 10 6
      Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb
  10. 1 1
      Plain Craft Launcher 2/Modules/ModMusic.vb
  11. 0 0
      Plain Craft Launcher 2/Modules/Reference/SystemDropShadowChrome.vb
  12. 2 2
      Plain Craft Launcher 2/My Project/AssemblyInfo.vb
  13. 40 37
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb
  14. 1 4
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml
  15. 1 4
      Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml
  16. 28 12
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml
  17. 45 5
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb
  18. 31 28
      Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml
  19. 1 1
      Plain Craft Launcher 2/Pages/PageSelectRight.xaml
  20. 3 2
      Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml
  21. 3 2
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml
  22. 2 1
      Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb
  23. 1 1
      Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj

+ 6 - 3
Plain Craft Launcher 2/Application.xaml

@@ -292,7 +292,7 @@
                                            Margin="5,0,0,0" Cursor="IBeam" />
                                     <!-- 由于未知原因,TextView 会有 2,0 的 Margin -->
                                 </Border>
-                                <Border Margin="{TemplateBinding Padding}" IsHitTestVisible="False" VerticalAlignment="Center" BorderThickness="0">
+                                <Border Margin="{TemplateBinding Padding}" IsHitTestVisible="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" BorderThickness="0">
                                     <TextBlock x:Name="labHint" Foreground="{DynamicResource ColorBrush1}" Opacity="0.3" Margin="7,0,0,0" Padding="{TemplateBinding BorderThickness}" FontSize="{TemplateBinding FontSize}" FontFamily="Resources/#PCL English, Microsoft YaHei UI" />
                                 </Border>
                                 <TextBlock Grid.Row="1" x:Name="labWrong" Height="0" Foreground="{TemplateBinding BorderBrush}" Padding="0,4,0,0" />
@@ -345,7 +345,7 @@
 
             <!-- ComboBox -->
             <DataTemplate x:Key="ComboBoxItemTemplateWithDelete">
-                <local:MyListItem Title="{Binding}" FontSize="13" PaddingRight="40" MaxHeight="26" IsScaleAnimationEnabled="False" Margin="-1,0,0,0">
+                <local:MyListItem Title="{Binding}" FontSize="13" PaddingRight="40" MaxHeight="26" IsScaleAnimationEnabled="False" Margin="-3,0,0,0">
                     <local:MyListItem.Buttons>
                         <x:Array Type="local:MyIconButton">
                             <local:MyIconButton Grid.Column="1" Height="20" Width="20" VerticalAlignment="Center" Tag="{Binding}" Click="MyIconButton_Click" Logo="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" />
@@ -367,7 +367,10 @@
                             <Grid>
                                 <Border x:Name="border" Background="{TemplateBinding Background}" CornerRadius="3" BorderThickness="1" BorderBrush="{TemplateBinding Foreground}" />
                                 <ToggleButton Margin="0,0,1.5,0" Foreground="{TemplateBinding Foreground}" IsTabStop="False" SnapsToDevicePixels="False" Focusable="False" IsChecked="{Binding IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press" />
-                                <ContentPresenter Margin="8.5,0,21.5,0" IsHitTestVisible="False" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" VerticalAlignment="Center" />
+                                <ContentPresenter x:Name="PART_Content" Margin="8.5,0,21.5,0" IsHitTestVisible="False" VerticalAlignment="Center"
+                                                  Content="{TemplateBinding SelectionBoxItem}" 
+                                                  ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" 
+                                                  ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" />
                                 <Popup x:Name="PART_Popup" SnapsToDevicePixels="True" VerticalOffset="-1.5" AllowsTransparency="True" IsOpen="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Placement="Bottom" PopupAnimation="Fade">
                                     <Grid x:Name="PanPopup">
                                         <Border Background="White" CornerRadius="3" />

+ 40 - 37
Plain Craft Launcher 2/Application.xaml.vb

@@ -179,45 +179,48 @@ Public Class Application
 
     '切换窗口
 
-
     '控件模板事件
     Private Sub MyIconButton_Click(sender As Object, e As EventArgs)
-        If Setup.Get("LoginType") = McLoginType.Legacy Then
-            '离线
-            Dim Names As New List(Of String)
-            Names.AddRange(Setup.Get("LoginLegacyName").ToString.Split("¨"))
-            Names.Remove(sender.Tag)
-            Setup.Set("LoginLegacyName", Join(Names, "¨"))
-            FrmLoginLegacy.ComboName.ItemsSource = Names
-            FrmLoginLegacy.ComboName.Text = If(Names.Count > 0, Names(0), "")
-        Else
-            '非离线
-            Dim Token As String = GetStringFromEnum(Setup.Get("LoginType"))
-            Dim Dict As New Dictionary(Of String, String)
-            Dim Names As New List(Of String)
-            Dim Passs As New List(Of String)
-            If Not Setup.Get("Login" & Token & "Email") = "" Then Names.AddRange(Setup.Get("Login" & Token & "Email").ToString.Split("¨"))
-            If Not Setup.Get("Login" & Token & "Pass") = "" Then Passs.AddRange(Setup.Get("Login" & Token & "Pass").ToString.Split("¨"))
-            For i = 0 To Names.Count - 1
-                Dict.Add(Names(i), Passs(i))
-            Next
-            Dict.Remove(sender.Tag)
-            Setup.Set("Login" & Token & "Email", Join(Dict.Keys.ToArray, "¨"))
-            Setup.Set("Login" & Token & "Pass", Join(Dict.Values.ToArray, "¨"))
-            Select Case Token
-                Case "Nide"
-                    FrmLoginNide.ComboName.ItemsSource = Dict.Keys
-                    FrmLoginNide.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "")
-                    FrmLoginNide.TextPass.Password = If(Dict.Values.Count > 0, Dict.Values(0), "")
-                Case "Auth"
-                    FrmLoginAuth.ComboName.ItemsSource = Dict.Keys
-                    FrmLoginAuth.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "")
-                    FrmLoginAuth.TextPass.Password = If(Dict.Values.Count > 0, Dict.Values(0), "")
-                Case Else
-                    DebugAssert(True)
-                    Exit Sub
-            End Select
-        End If
+        Select Case Setup.Get("LoginType")
+            Case McLoginType.Ms
+                '微软
+                Dim MsJson As JObject = GetJson(Setup.Get("LoginMsJson"))
+                MsJson.Remove(sender.Tag)
+                Setup.Set("LoginMsJson", MsJson.ToString(Newtonsoft.Json.Formatting.None))
+                FrmLoginMs.ComboAccounts.Items.Remove(sender.Parent)
+            Case McLoginType.Legacy
+                '离线
+                Dim Names As New List(Of String)
+                Names.AddRange(Setup.Get("LoginLegacyName").ToString.Split("¨"))
+                Names.Remove(sender.Tag)
+                Setup.Set("LoginLegacyName", Join(Names, "¨"))
+                FrmLoginLegacy.ComboName.ItemsSource = Names
+                FrmLoginLegacy.ComboName.Text = If(Names.Count > 0, Names(0), "")
+            Case Else
+                '第三方
+                Dim Token As String = GetStringFromEnum(Setup.Get("LoginType"))
+                Dim Dict As New Dictionary(Of String, String)
+                Dim Names As New List(Of String)
+                Dim Passs As New List(Of String)
+                If Not Setup.Get("Login" & Token & "Email") = "" Then Names.AddRange(Setup.Get("Login" & Token & "Email").ToString.Split("¨"))
+                If Not Setup.Get("Login" & Token & "Pass") = "" Then Passs.AddRange(Setup.Get("Login" & Token & "Pass").ToString.Split("¨"))
+                For i = 0 To Names.Count - 1
+                    Dict.Add(Names(i), Passs(i))
+                Next
+                Dict.Remove(sender.Tag)
+                Setup.Set("Login" & Token & "Email", Join(Dict.Keys, "¨"))
+                Setup.Set("Login" & Token & "Pass", Join(Dict.Values, "¨"))
+                Select Case Token
+                    Case "Nide"
+                        FrmLoginNide.ComboName.ItemsSource = Dict.Keys
+                        FrmLoginNide.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "")
+                        FrmLoginNide.TextPass.Password = If(Dict.Values.Count > 0, Dict.Values(0), "")
+                    Case "Auth"
+                        FrmLoginAuth.ComboName.ItemsSource = Dict.Keys
+                        FrmLoginAuth.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "")
+                        FrmLoginAuth.TextPass.Password = If(Dict.Values.Count > 0, Dict.Values(0), "")
+                End Select
+        End Select
     End Sub
 
 End Class

+ 6 - 0
Plain Craft Launcher 2/Controls/MyComboBox.vb

@@ -128,4 +128,10 @@
         End If
     End Sub
 
+    Public ReadOnly Property ContentPresenter As ContentPresenter
+        Get
+            Return Template.FindName("PART_Content", Me)
+        End Get
+    End Property
+
 End Class

+ 39 - 13
Plain Craft Launcher 2/Controls/MyPageRight.vb

@@ -68,7 +68,7 @@
                     Loop
                     RunInUiWait(Sub() FinishedInvoke(RealLoader))
                     Thread.Sleep(20) '由于大量初始化控件会导致掉帧,延迟触发 State 改变事件
-            End Sub
+                End Sub
         End If
         AddHandler RealLoader.OnStateChangedUi, Sub(Loader As LoaderBase, NewState As LoadState, OldState As LoadState) RunInUi(Sub() PageLoaderState(Loader, NewState, OldState))
         '隐藏 UI
@@ -325,17 +325,13 @@
 
     '逐个进入动画
     Public Sub TriggerEnterAnimation(ParamArray Elements As FrameworkElement())
-        '去除 Nothing 项
-        Dim RealElements As New List(Of FrameworkElement)
-        For Each Element In Elements
-            If Element IsNot Nothing Then RealElements.Add(Element)
-        Next
-
+        Dim RealElements = Elements.Where(Function(e) e IsNot Nothing)
         For Each Element In RealElements
             Element.Visibility = Visibility.Visible '页面均处于默认的隐藏状态
         Next
         Dim AniList As New List(Of AniData)
         Dim Delay As Integer = 0
+        '基础动画
         For Each Element In RealElements
             For Each Control As FrameworkElement In GetAllAnimControls(Element, True)
                 '还原被隐藏的卡片的消失动画
@@ -351,18 +347,20 @@
                 Delay += 40
             Next
         Next
+        '滚动条动画
+        Dim Scroll As MyScrollBar = GetFirstScrollViewer(RealElements)
+        If Scroll IsNot Nothing Then
+            If TypeOf Scroll.RenderTransform IsNot TranslateTransform Then Scroll.RenderTransform = New TranslateTransform(10, 0)
+            AniList.Add(AaTranslateX(Scroll, -CType(Scroll.RenderTransform, TranslateTransform).X, 350, 0, New AniEaseOutFluent))
+        End If
+        '结束
         AniList.Add(AaCode(Sub() PageOnEnterAnimationFinished(),, True))
         AniStart(AniList, "PageRight PageChange " & PageUuid)
     End Sub
 
     '逐个退出动画
     Public Sub TriggerExitAnimation(ParamArray Elements As FrameworkElement())
-        '去除 Nothing 项
-        Dim RealElements As New List(Of FrameworkElement)
-        For Each Element In Elements
-            If Element IsNot Nothing Then RealElements.Add(Element)
-        Next
-
+        Dim RealElements = Elements.Where(Function(e) e IsNot Nothing)
         Dim AniList As New List(Of AniData)
         Dim Delay As Integer = 0
         For Each Element In RealElements
@@ -373,6 +371,13 @@
                 Delay += 20
             Next
         Next
+        '滚动条动画
+        Dim Scroll As MyScrollBar = GetFirstScrollViewer(RealElements)
+        If Scroll IsNot Nothing Then
+            If TypeOf Scroll.RenderTransform IsNot TranslateTransform Then Scroll.RenderTransform = New TranslateTransform
+            AniList.Add(AaTranslateX(Scroll, 10 - CType(Scroll.RenderTransform, TranslateTransform).X, 90, 0, New AniEaseInFluent))
+        End If
+        '结束
         AniList.Add(AaCode(Sub()
                                For Each Element In RealElements
                                    Element.Visibility = Visibility.Collapsed
@@ -402,6 +407,27 @@
         End If
     End Sub
 
+    '查找列表中的第一个滚动条
+    Private Function GetFirstScrollViewer(Elements As IEnumerable(Of FrameworkElement)) As MyScrollBar
+        Dim Viewer As MyScrollViewer = Nothing
+        For Each Element In Elements
+            If TypeOf Element Is MyScrollViewer Then
+                Viewer = Element
+                GoTo FindViewer
+            End If
+            For Each Control In LogicalTreeHelper.GetChildren(Element)
+                If TypeOf Control Is MyScrollViewer Then
+                    Viewer = Control
+                    GoTo FindViewer
+                End If
+            Next
+        Next
+        Return Nothing
+FindViewer:
+        If Viewer.ComputedVerticalScrollBarVisibility <> Visibility.Visible Then Return Nothing
+        Return Viewer.ScrollBar
+    End Function
+
 #End Region
 
 End Class

+ 7 - 0
Plain Craft Launcher 2/Controls/MyScrollViewer.vb

@@ -2,6 +2,8 @@
     Inherits ScrollViewer
 
     Public Property DeltaMuity As Double = 1
+
+
     Private RealOffset As Double
     Private Sub MyScrollViewer_PreviewMouseWheel(sender As Object, e As MouseWheelEventArgs) Handles Me.PreviewMouseWheel
         If e.Delta = 0 OrElse ActualHeight = 0 OrElse ScrollableHeight = 0 Then Exit Sub
@@ -30,4 +32,9 @@
         FrmMain.BtnExtraBack.ShowRefresh()
     End Sub
 
+    Public ScrollBar As MyScrollBar
+    Private Sub Load() Handles Me.Loaded
+        ScrollBar = GetTemplateChild("PART_VerticalScrollBar")
+    End Sub
+
 End Class

+ 17 - 0
Plain Craft Launcher 2/FormMain.xaml.vb

@@ -10,6 +10,17 @@ Public Class FormMain
         Dim FeatureList As New List(Of KeyValuePair(Of Integer, String))
         '统计更新日志条目
 #If BETA Then
+        If LastVersion < 291 Then 'Release 2.6.0
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "支持在多个正版账号间切换"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "在缺少 Java 时会自动下载所需的 Java"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "重新制作正版登录页面"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "彻底移除 Mojang 登录"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "添加 CurseForge / Modrinth 来源筛选"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "Mod / 整合包下载会单独列出筛选的版本"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "为下载管理和音乐播放按钮添加进度条"))
+            FeatureCount += 24
+            BugCount += 24
+        End If
         If LastVersion < 286 Then 'Release 2.5.2
             FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "支持搜索、安装 Modrinth 的 Mod 与整合包"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "资源搜索页面支持翻页"))
@@ -95,6 +106,12 @@ Public Class FormMain
         '3:BUG+ IMP* FEAT-
         '2:BUG* IMP-
         '1:BUG-
+        If LastVersion < 290 Then 'Snapshot 2.6.0
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "支持在多个正版账号间切换"))
+            FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "Mod / 整合包下载会单独列出筛选的版本"))
+            FeatureCount += 10
+            BugCount += 2
+        End If
         If LastVersion < 289 Then 'Snapshot 2.5.4
             FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "重新制作正版登录页面"))
             FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "彻底移除 Mojang 登录"))

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

@@ -11,12 +11,12 @@ Public Module ModBase
 #Region "声明"
 
     '下列版本信息由更新器自动修改
-    Public Const VersionBaseName As String = "2.5.4" '不含分支前缀的显示用版本名
-    Public Const VersionStandardCode As String = "2.5.4." & VersionBranchCode '标准格式的四段式版本号
+    Public Const VersionBaseName As String = "2.6.0" '不含分支前缀的显示用版本名
+    Public Const VersionStandardCode As String = "2.6.0." & VersionBranchCode '标准格式的四段式版本号
 #If BETA Then
-    Public Const VersionCode As Integer = 286 'Release
+    Public Const VersionCode As Integer = 291 'Release
 #Else
-    Public Const VersionCode As Integer = 289 'Snapshot
+    Public Const VersionCode As Integer = 290 'Snapshot
 #End If
     '自动生成的版本信息
     Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
@@ -2606,11 +2606,11 @@ Retry:
     ''' <summary>
     ''' 将数组随机打乱。
     ''' </summary>
-    Public Function RandomChaos(Of T)(array As IList(Of T)) As IList(Of T)
-        RandomChaos = New List(Of T)
+    Public Function Shuffle(Of T)(array As IList(Of T)) As IList(Of T)
+        Shuffle = New List(Of T)
         Do While array.Count > 0
             Dim i As Integer = RandomInteger(0, array.Count - 1)
-            RandomChaos.Add(array(i))
+            Shuffle.Add(array(i))
             array.RemoveAt(i)
         Loop
     End Function

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

@@ -361,7 +361,7 @@
         低版本Forge与高版本Java不兼容
         版本Json中存在多个Forge
         Mod过多导致超出ID限制
-        NightConfig库问题
+        NightConfig的Bug
         ShadersMod与Optifine同时安装
         Forge安装不完整
     End Enum
@@ -489,7 +489,7 @@ Done:
             If LogMc.Contains("Maybe try a lower resolution resourcepack?") Then AppendReason(CrashReason.材质过大或显卡配置不足)
             If LogMc.Contains("java.lang.NoSuchMethodError: net.minecraft.world.server.ChunkManager$ProxyTicketManager.shouldForceTicks(J)Z") AndAlso LogMc.Contains("OptiFine") Then AppendReason(CrashReason.OptiFine导致无法加载世界)
             If LogMc.Contains("Unsupported class file major version") Then AppendReason(CrashReason.Java版本不兼容)
-            If LogMc.Contains("com.electronwill.nightconfig.core.io.ParsingException: Not enough data available") Then AppendReason(CrashReason.NightConfig库问题)
+            If LogMc.Contains("com.electronwill.nightconfig.core.io.ParsingException: Not enough data available") Then AppendReason(CrashReason.NightConfig的Bug)
             If LogMc.Contains("Cannot find launch target fmlclient, unable to launch") Then AppendReason(CrashReason.Forge安装不完整)
             If LogMc.Contains("Invalid module name: '' is not a Java identifier") Then AppendReason(CrashReason.Mod名称包含特殊字符)
             If LogMc.Contains("java.lang.UnsupportedClassVersionError: net/fabricmc/loader/impl/launch/knot/KnotClient : Unsupported major.minor version") Then AppendReason(CrashReason.Java版本不兼容)
@@ -874,7 +874,7 @@ NextStack:
                 Case CrashReason.OptiFine与Forge不兼容
                     Results.Add("由于 OptiFine 与当前版本的 Forge 不兼容,导致了游戏崩溃。\n\n请前往 OptiFine 官网(https://optifine.net/downloads)查看 OptiFine 所兼容的 Forge 版本,并严格按照对应版本重新安装游戏。")
                 Case CrashReason.ShadersMod与Optifine同时安装
-                    Results.Add("当前游戏因为同时安装了 Optifine 和 Shaders Mod,无法继续运行。\n\n因为 Optifine 已集成 Shaders Mod 的功能,只需删除 Shaders Mod 即可。")
+                    Results.Add("无需同时安装 Optifine 和 Shaders Mod,Optifine 已经集成了 Shaders Mod 的功能。\n在删除 Shaders Mod 后,游戏即可正常运行。")
                 Case CrashReason.低版本Forge与高版本Java不兼容
                     Results.Add("由于低版本 Forge 与当前 Java 不兼容,导致了游戏崩溃。\n\n请尝试以下解决方案:\n - 更新 Forge 到 36.2.26 或更高版本\n - 换用版本低于 8.0.320 的 Java")
                 Case CrashReason.版本Json中存在多个Forge
@@ -894,7 +894,7 @@ NextStack:
                 Case CrashReason.材质过大或显卡配置不足
                     Results.Add("你所使用的材质分辨率过高,或显卡配置不足,导致游戏无法继续运行。\n\n如果你正在使用高清材质,请将它移除。\n如果你没有使用材质,那么你可能需要更新显卡驱动,或者换个更好的显卡……\h")
                 Case CrashReason.材质过大或显卡配置不足
-                    Results.Add("当前游戏因为 Night Config 库的一些问题,无法继续运行。\n\n你可以尝试安装 Night Config Fixes 模组,这或许能帮助你解决这个问题。\n可访问该模组的 GitHub 仓库了解更多。\h")
+                    Results.Add("由于 Night Config 存在问题,导致了游戏崩溃。\n你可以尝试安装 Night Config Fixes 模组,这或许能解决此问题。\h")
                 Case CrashReason.光影或资源包导致OpenGL1282错误
                     Results.Add("你所使用的光影或材质导致游戏出现了一些问题……\n\n请尝试删除你所添加的这些额外资源。\h")
                 Case CrashReason.Mod过多导致超出ID限制
@@ -902,7 +902,7 @@ NextStack:
                 Case CrashReason.文件或内容校验失败
                     Results.Add("部分文件或内容校验失败,导致游戏出现了问题。\n\n请尝试删除游戏(包括 Mod)并重新下载,或尝试在重新下载时使用 VPN。\h")
                 Case CrashReason.Forge安装不完整
-                    Results.Add("当前游戏因为 Forge 安装不完整,无法继续运行。\n\n请尝试重新全新安装 Forge\h")
+                    Results.Add("由于 Forge 安装不完整,导致游戏无法正常运行。\n请尝试重新安装 Forge。\h")
                 Case CrashReason.Fabric报错
                     If Additional.Count = 1 Then
                         Results.Add("Fabric 提供了以下错误信息:\n" & Additional.First & "\n\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。")

+ 10 - 6
Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb

@@ -203,7 +203,7 @@ NextInner:
                                 "如果觉得 Minecraft 还不错,也可以考虑购买正版支持一下,毕竟开发游戏也很不容易……" & vbCrLf &
                                 "在你登录一次正版账号后,就不会再出现这个提示了。",
                                 "考虑一下正版?", "购买正版游戏", "下次一定") = 1 Then
-                        OpenWebsite("https://www.minecraft.net/store/checkout/minecraft-java-bedrock-edition-pc")
+                        OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj")
                     End If
             End Select
         End If
@@ -478,7 +478,7 @@ NextInner:
         End If
         '尝试登录
         Dim OAuthTokens As String()
-        If Setup.Get("CacheMsOAuthRefresh") = "" Then
+        If Input.OAuthRefreshToken = "" Then
             '无 RefreshToken
 Relogin:
             Dim OAuthCode As String = MsLoginStep1(Data)
@@ -487,7 +487,7 @@ Relogin:
             OAuthTokens = MsLoginStep2(OAuthCode, False)
         Else
             '有 RefreshToken
-            OAuthTokens = MsLoginStep2(Setup.Get("CacheMsOAuthRefresh"), True)
+            OAuthTokens = MsLoginStep2(Input.OAuthRefreshToken, True)
         End If
         '要求重新打开登录网页认证
         If OAuthTokens(0) = "Relogin" Then GoTo Relogin
@@ -511,6 +511,10 @@ Relogin:
         Setup.Set("CacheMsUuid", Result(0))
         Setup.Set("CacheMsName", Result(1))
         Setup.Set("CacheMsProfileJson", Result(2))
+        Dim MsJson As JObject = GetJson(Setup.Get("LoginMsJson"))
+        MsJson.Remove(Input.UserName) '如果更改了玩家名……
+        MsJson(Result(1)) = OAuthRefreshToken
+        Setup.Set("LoginMsJson", MsJson.ToString(Newtonsoft.Json.Formatting.None))
         Data.Output = New McLoginResult With {.AccessToken = AccessToken, .Name = Result(1), .Uuid = Result(0), .Type = "Microsoft", .ClientToken = Result(0), .ProfileJson = Result(2)}
         '解锁主题
 SkipLogin:
@@ -1001,7 +1005,7 @@ SystemBrowser:
                                        Case 1
                                            OpenWebsite("https://www.minecraft.net/zh-hans/msaprofile/mygames/editprofile")
                                        Case 2
-                                           OpenWebsite("https://www.minecraft.net/store/checkout/minecraft-java-bedrock-edition-pc")
+                                           OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj")
                                    End Select
                                End Sub, "Login Failed: Create Profile")
                 Throw New Exception("$$")
@@ -1818,9 +1822,9 @@ NextVersion:
                             PackFormat = 12
                         End If
                     Case 20, 99 '99 是快照版
-                        PackFormat = 13
+                        PackFormat = 15
                     Case Else
-                        PackFormat = 14
+                        PackFormat = 16
                         'https://minecraft.fandom.com/zh/wiki/数据包#数据包版本
                 End Select
                 McLaunchLog("正在构建自定义皮肤资源包,格式为:" & PackFormat)

+ 1 - 1
Plain Craft Launcher 2/Modules/ModMusic.vb

@@ -31,7 +31,7 @@
                 Next
             End If
             '打乱顺序播放
-            MusicToplayList = RandomChaos(New List(Of String)(MusicAllList))
+            MusicToplayList = If(Setup.Get("UiMusicRandom"), Shuffle(New List(Of String)(MusicAllList)), New List(Of String)(MusicAllList))
             If Not IgnoreFirst = "" AndAlso Not MusicToplayList.Count = 0 AndAlso MusicToplayList(0) = IgnoreFirst Then
                 '若需要避免成为第一项的为第一项,则将它放在最后
                 MusicToplayList.RemoveAt(0)

+ 0 - 0
Plain Craft Launcher 2/Modules/Reference/PresentationFramework.Aero/SystemDropShadowChrome.vb → Plain Craft Launcher 2/Modules/Reference/SystemDropShadowChrome.vb


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

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

+ 40 - 37
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb

@@ -39,51 +39,54 @@
         End Sub
     End Class
     Private Sub Load_OnFinish()
-
-        '初始化字典,并将当前版本排在最上面
-        Dim TopVersion As String
+        '获取目标版本与 Mod 加载器
+        Dim TargetVersion As String = ""
         Select Case Project.Type
             Case CompType.Mod
-                TopVersion = If(PageDownloadMod.Loader.Input.GameVersion, "")
+                TargetVersion = If(PageDownloadMod.Loader.Input.GameVersion, "")
             Case CompType.ModPack
-                TopVersion = If(PageDownloadPack.Loader.Input.GameVersion, "")
+                TargetVersion = If(PageDownloadPack.Loader.Input.GameVersion, "")
             Case Else 'CompType.ResourcePack
                 'FUTURE: Res
-                TopVersion = Nothing 'If(PageDownloadResource.Loader.Input.GameVersion, "")
+                TargetVersion = "" 'If(PageDownloadResource.Loader.Input.GameVersion, "")
         End Select
-        Dim Dict As New SortedDictionary(Of String, List(Of CompFile))(New VersionSorterWithSelect(TopVersion))
-        '#8826 汇报了奇怪的这个 Try 块里出现 NPE 的问题,但实在找不到,就瞎加点检测
-        Try
-            Dict.Add("未知版本", New List(Of CompFile))
-            If CompFileLoader.Output Is Nothing Then
-                Log("[Comp] 列表加载输出为 Nothing,请反馈此问题", LogLevel.Feedback)
-                Exit Try
-            End If
+        Dim TargetLoader = CompModLoaderType.Any
+        If Project.Type = CompType.Mod AndAlso PageDownloadMod.Loader.Input.ModLoader <> CompModLoaderType.Any Then
+            TargetLoader = PageDownloadMod.Loader.Input.ModLoader
+        End If
+        Dim TargetCardName As String = If(TargetVersion <> "" OrElse TargetLoader <> CompModLoaderType.Any,
+            $"目标PCL2版本:{TargetVersion} {If(TargetLoader <> CompModLoaderType.Any, TargetLoader, "")}", "")
+        '初始化字典
+        Dim Dict As New SortedDictionary(Of String, List(Of CompFile))(New VersionSorterWithSelect(TargetCardName))
+        Dict.Add("未知版本", New List(Of CompFile))
+        For Each Version As CompFile In CompFileLoader.Output
+            For Each GameVersion In Version.GameVersions
+                '决定添加到哪个版本
+                Dim TargetCard As String
+                If GameVersion Is Nothing Then
+                    TargetCard = "未知版本"
+                ElseIf GameVersion.Contains("w") OrElse GameVersion.Contains("pre") OrElse GameVersion.Contains("rc") Then
+                    TargetCard = "快照版本"
+                ElseIf GameVersion.Split(".").Count >= 2 Then
+                    TargetCard = GameVersion
+                Else
+                    TargetCard = "未知版本"
+                End If
+                '实际进行添加
+                If Not Dict.ContainsKey(TargetCard) Then Dict.Add(TargetCard, New List(Of CompFile))
+                If Not Dict(TargetCard).Contains(Version) Then Dict(TargetCard).Add(Version)
+            Next
+        Next
+        '添加筛选的版本的卡片
+        If TargetCardName <> "" Then
+            Dict.Add(TargetCardName, New List(Of CompFile))
             For Each Version As CompFile In CompFileLoader.Output
-                If Version Is Nothing Then
-                    Log("[Comp] 列表中的一个版本为 Nothing,请反馈此问题", LogLevel.Feedback)
-                    Continue For
+                If Version.GameVersions.Contains(TargetVersion) AndAlso
+                   (TargetLoader = CompModLoaderType.Any OrElse Version.ModLoaders.Contains(TargetLoader)) Then
+                    If Not Dict(TargetCardName).Contains(Version) Then Dict(TargetCardName).Add(Version)
                 End If
-                For Each GameVersion In Version.GameVersions
-                    '决定添加到哪个版本
-                    Dim TargetVersion As String
-                    If GameVersion Is Nothing Then
-                        TargetVersion = "未知版本"
-                    ElseIf GameVersion.Contains("w") Then
-                        TargetVersion = "快照版本"
-                    ElseIf GameVersion.Split(".").Count >= 2 Then
-                        TargetVersion = GameVersion
-                    Else
-                        TargetVersion = "未知版本"
-                    End If
-                    '实际进行添加
-                    If Not Dict.ContainsKey(TargetVersion) Then Dict.Add(TargetVersion, New List(Of CompFile))
-                    If Not Dict(TargetVersion).Contains(Version) Then Dict(TargetVersion).Add(Version)
-                Next
             Next
-        Catch ex As Exception
-            Log(ex, "准备工程下载列表出错", LogLevel.Feedback)
-        End Try
+        End If
 
 #Region "转化为 UI"
         Try
@@ -99,7 +102,7 @@
                 NewCard.SwapControl = NewStack
                 PanMain.Children.Add(NewCard)
                 '确定卡片是否展开
-                If Pair.Key = TopVersion Then
+                If Pair.Key = TargetCardName Then
                     MyCard.StackInstall(NewStack, If(Project.Type = CompType.ModPack, 9, 8), Pair.Key) 'FUTURE: Res
                 Else
                     NewCard.IsSwaped = True

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

@@ -33,11 +33,8 @@
                         <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.20" />
                             <local:MyComboBoxItem Content="1.19.4" />
-                            <local:MyComboBoxItem Content="1.19.3" />
-                            <local:MyComboBoxItem Content="1.19.2" />
-                            <local:MyComboBoxItem Content="1.19.1" />
-                            <local:MyComboBoxItem Content="1.19" />
                             <local:MyComboBoxItem Content="1.18.2" />
                             <local:MyComboBoxItem Content="1.17.1" />
                             <local:MyComboBoxItem Content="1.16.5" />

+ 1 - 4
Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml

@@ -32,11 +32,8 @@
                         <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" IsEditable="True" MaxDropDownHeight="320">
                             <local:MyComboBoxItem Content="全部 (也可自行输入)" IsSelected="True" />
+                            <local:MyComboBoxItem Content="1.20" />
                             <local:MyComboBoxItem Content="1.19.4" />
-                            <local:MyComboBoxItem Content="1.19.3" />
-                            <local:MyComboBoxItem Content="1.19.2" />
-                            <local:MyComboBoxItem Content="1.19.1" />
-                            <local:MyComboBoxItem Content="1.19" />
                             <local:MyComboBoxItem Content="1.18.2" />
                             <local:MyComboBoxItem Content="1.17.1" />
                             <local:MyComboBoxItem Content="1.16.5" />

+ 28 - 12
Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml

@@ -4,17 +4,33 @@
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       xmlns:local="clr-namespace:PCL"
-      mc:Ignorable="d" d:DesignWidth="302.4" Margin="0,0,0,-2">
-    <StackPanel x:Name="PanEmpty">
+      mc:Ignorable="d" d:DesignWidth="302.4">
+    <Grid x:Name="PanEmpty" Margin="0,10,0,0">
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="1*" />
+            <ColumnDefinition Width="Auto" />
+        </Grid.ColumnDefinitions>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="Auto" />
+            <RowDefinition Height="25" />
+            <RowDefinition Height="Auto" />
+            <RowDefinition Height="Auto" />
+        </Grid.RowDefinitions>
         <Path Data="M660.338 528.065c63.61-46.825 105.131-121.964 105.131-206.83 0-141.7-115.29-256.987-256.997-256.987-141.706 0-256.998 115.288-256.998 256.987 0 85.901 42.52 161.887 107.456 208.562-152.1 59.92-260.185 207.961-260.185 381.077 0 21.276 17.253 38.53 38.53 38.53 21.278 0 38.53-17.254 38.53-38.53 0-183.426 149.232-332.671 332.667-332.671 1.589 0 3.113-0.207 4.694-0.244 0.8 0.056 1.553 0.244 2.362 0.244 183.434 0 332.664 149.245 332.664 332.671 0 21.276 17.255 38.53 38.533 38.53 21.277 0 38.53-17.254 38.53-38.53 0-174.885-110.354-324.13-264.917-382.809z m-331.803-206.83c0-99.22 80.72-179.927 179.935-179.927s179.937 80.708 179.937 179.927c0 99.203-80.721 179.91-179.937 179.91s-179.935-80.708-179.935-179.91z"
-          Fill="{DynamicResource ColorBrush1}" Opacity="0.3"
-          Width="40" Stretch="Uniform"/>
-        <TextBlock Text="没有已登录的账号" HorizontalAlignment="Center" Margin="0,15,0,40"
-               Foreground="{DynamicResource ColorBrush1}" Opacity="0.5" />
-        <local:MyButton Text="登录" x:Name="BtnLogin" ColorType="Highlight" Height="35" HorizontalAlignment="Center" Width="150" />
-        <StackPanel Orientation="Horizontal" Margin="0,16,0,0" HorizontalAlignment="Center" Opacity="0.7">
-            <local:MyTextButton Text="购买正版" Margin="0,0,15,0" EventType="打开网页" EventData="https://www.minecraft.net/store/checkout/minecraft-java-bedrock-edition-pc" />
-            <local:MyTextButton Text="老账号迁移" Margin="15,0,0,0" x:Name="BtnMigration" />
-        </StackPanel>
-    </StackPanel>
+            Fill="{DynamicResource ColorBrush2}" Opacity="0.7" Width="40" Stretch="Uniform" Grid.ColumnSpan="2" />
+        <local:MyComboBox x:Name="ComboAccounts" Grid.Row="2" />
+        <local:MyButton Text="登录" x:Name="BtnLogin" ColorType="Highlight" 
+                        Height="28" Width="60" Margin="10,0,0,0" Grid.Row="2" Grid.Column="1" />
+        <Grid Grid.Row="4" Grid.ColumnSpan="2" Opacity="0.3" Margin="2,30,2,0" HorizontalAlignment="Center">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="Auto" />
+                <ColumnDefinition Width="30" />
+                <ColumnDefinition Width="Auto" />
+            </Grid.ColumnDefinitions>
+            <local:MyTextButton Text="»  购买正版" EventType="打开网页" EventData="https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj"
+                            Grid.Column="0" />
+            <local:MyTextButton Text="»  老账号迁移" x:Name="BtnMigration"
+                            Grid.Column="2" />
+        </Grid>
+    </Grid>
 </StackPanel>

+ 45 - 5
Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb

@@ -4,12 +4,50 @@
     ''' 刷新页面显示的所有信息。
     ''' </summary>
     Public Sub Reload(KeepInput As Boolean)
+        Dim IndexBefore = ComboAccounts.SelectedIndex
+        '刷新下拉框列表
+        ComboAccounts.Items.Clear()
+        ComboAccounts.Items.Add(New MyComboBoxItem With {.Content = "添加新账号"})
+        Try
+            Dim MsJson As JObject = GetJson(Setup.Get("LoginMsJson"))
+            For Each Account In MsJson
+                Dim Item As MyListItem = CType(FindResource("ComboBoxItemTemplateWithDelete"), DataTemplate).LoadContent()
+                Item.Tag = Account.Value.ToString
+                Item.Title = Account.Key
+                CType(Item.Buttons(0), MyIconButton).Tag = Account.Key
+                ComboAccounts.Items.Add(Item)
+            Next
+        Catch ex As Exception
+            Log(ex, $"微软登录信息出错,登录信息已被重置({Setup.Get("LoginMsJson")})", LogLevel.Hint)
+            Setup.Set("LoginMsJson", "{}")
+        End Try
+        '如果不保留输入,刷新列表后自动选择第一项
+        ComboAccounts.SelectedIndex = If(KeepInput, Math.Max(0, IndexBefore), 0)
     End Sub
+    Private Sub ComboAccounts_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles ComboAccounts.SelectionChanged
+        If AniControlEnabled <> 0 OrElse ComboAccounts.SelectedItem Is Nothing Then Exit Sub
+        If TypeOf ComboAccounts.SelectedItem Is MyListItem Then
+            ComboAccounts.ContentPresenter.Content = CType(ComboAccounts.SelectedItem, MyListItem).Title
+        ElseIf TypeOf ComboAccounts.SelectedItem Is MyComboBoxItem Then
+            ComboAccounts.ContentPresenter.Content = CType(ComboAccounts.SelectedItem, MyComboBoxItem).Content
+        End If
+    End Sub
+
     ''' <summary>
     ''' 获取当前页面的登录信息。
     ''' </summary>
     Public Shared Function GetLoginData() As McLoginMs
-        Return New McLoginMs With {.OAuthRefreshToken = Setup.Get("CacheMsOAuthRefresh"), .UserName = Setup.Get("CacheMsName")}
+        If FrmLoginMs Is Nothing Then Return New McLoginMs With {.OAuthRefreshToken = Setup.Get("CacheMsOAuthRefresh"), .UserName = Setup.Get("CacheMsName")}
+        Dim Result As McLoginMs = Nothing
+        RunInUiWait(Sub()
+                        If FrmLoginMs.ComboAccounts.SelectedIndex = 0 Then
+                            Result = New McLoginMs
+                        Else
+                            Dim Item As MyListItem = FrmLoginMs.ComboAccounts.SelectedItem
+                            Result = New McLoginMs With {.OAuthRefreshToken = Item.Tag, .UserName = Item.Title}
+                        End If
+                    End Sub)
+        Return Result
     End Function
     ''' <summary>
     ''' 当前页面的登录信息是否有效。
@@ -26,13 +64,14 @@
     End Function
 
     Private Sub BtnLogin_Click(sender As Object, e As EventArgs) Handles BtnLogin.Click
+        ComboAccounts.IsEnabled = False
         BtnLogin.IsEnabled = False
-        BtnLogin.Text = "登录中 0%"
+        BtnLogin.Text = "0%"
         RunInNewThread(Sub()
                            Try
                                McLoginMsLoader.Start(GetLoginData(), IsForceRestart:=True)
                                Do While McLoginMsLoader.State = LoadState.Loading
-                                   RunInUi(Sub() BtnLogin.Text = "登录中 " & Math.Round(McLoginMsLoader.Progress * 100) & "%")
+                                   RunInUi(Sub() BtnLogin.Text = Math.Round(McLoginMsLoader.Progress * 100) & "%")
                                    Thread.Sleep(50)
                                Loop
                                If McLoginMsLoader.State = LoadState.Finished Then
@@ -45,7 +84,7 @@
                                    Throw New Exception(McLoginMsLoader.Error.Message, McLoginMsLoader.Error)
                                End If
                            Catch ex As ThreadInterruptedException
-                               Hint("登录已取消!")
+                               Hint("已取消登录!")
                            Catch ex As Exception
                                If ex.Message = "$$" Then
                                ElseIf ex.Message.StartsWith("$") Then
@@ -55,8 +94,9 @@
                                End If
                            Finally
                                RunInUi(Sub()
+                                           ComboAccounts.IsEnabled = True
                                            BtnLogin.IsEnabled = True
-                                           BtnLogin.Text = "添加账号"
+                                           BtnLogin.Text = "登录"
                                        End Sub)
                            End Try
                        End Sub, "Ms Login")

+ 31 - 28
Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml

@@ -9,39 +9,42 @@
         <Grid.RowDefinitions>
             <RowDefinition Height="75" />
             <RowDefinition Height="Auto" MinHeight="30" />
-            <RowDefinition Height="19" />
-            <RowDefinition Height="24" />
+            <RowDefinition Height="13" />
+            <RowDefinition Height="30" />
             <RowDefinition Height="19" />
         </Grid.RowDefinitions>
         <TextBlock Grid.Row="1" VerticalAlignment="Center" Name="TextName" Text="加载中" Margin="8,0" FontSize="17" HorizontalAlignment="Center" TextTrimming="CharacterEllipsis" />
-        <StackPanel Orientation="Horizontal" Grid.Row="3" HorizontalAlignment="Center" x:Name="PanButtons" Opacity="0">
-            <local:MyIconButton Height="24" Margin="0,0.5,15,0"  x:Name="BtnSkin"
-                                ToolTip="皮肤/披风" ToolTipService.Placement="Center" ToolTipService.VerticalOffset="40" ToolTipService.InitialShowDelay="50" ToolTipService.ShowDuration="1000000" 
+        <Border Grid.Row="3" HorizontalAlignment="Center" x:Name="PanButtons" Opacity="0"
+                CornerRadius="5" Background="{DynamicResource ColorBrush8}" Padding="10,3,9,3">
+            <StackPanel Orientation="Horizontal">
+                <local:MyIconButton Height="24" Margin="0,0.5,9,0"  x:Name="BtnSkin"
+                                ToolTip="皮肤与披风" ToolTipService.Placement="Center" ToolTipService.VerticalOffset="40" ToolTipService.InitialShowDelay="50" ToolTipService.ShowDuration="1000000" 
                                 LogoScale="1.08" Logo="M764.0003 0.076794a215.433442 215.433442 0 0 0-76.282279 13.950954l-9.06172 3.686123c-49.148314 20.734445-88.518161 30.53851-115.498538 30.53851-27.031573 0-66.478214-9.855261-116.676049-31.050471a217.583681 217.583681 0 0 0-72.186586-16.766743l-9.138515-0.307177-3.839712-0.051196-8.626553 0.307177-4.223683 0.281579A160.755943 160.755943 0 0 0 250.477214 45.385396l-219.32435 212.438467a102.392321 102.392321 0 0 0-11.263156 134.210734l106.360023 144.552359 3.378947 4.351674a102.469115 102.469115 0 0 0 112.810739 31.690423l5.657176-2.175837V883.210559a140.789441 140.789441 0 0 0 140.789441 140.789441h372.170487l5.657175-0.102392a140.789441 140.789441 0 0 0 135.132266-140.687049l-0.025599-318.6705 1.177512 0.716747a102.392321 102.392321 0 0 0 141.941355-44.233483l70.906682-144.39877a102.392321 102.392321 0 0 0-20.657651-118.647101L875.86391 45.385396A160.730345 160.730345 0 0 0 764.0003 0.076794z m-357.349199 111.454041C468.444867 137.615279 520.562558 150.644702 563.157763 150.644702c42.492813 0 94.584906-12.978227 156.199485-38.985876A112.580356 112.580356 0 0 1 764.0003 102.469115c15.154063 0 29.693773 5.887558 40.598555 16.433967L1023.923206 331.495138l-70.906682 144.39877-93.023423-65.684674a38.39712 38.39712 0 0 0-60.53946 31.383247V883.210559a38.39712 38.39712 0 0 1-38.39712 38.39712H388.886034a38.39712 38.39712 0 0 1-38.397121-38.39712V445.176212a38.39712 38.39712 0 0 0-61.691373-30.487314l-80.070795 61.20501L102.392321 331.341549l219.32435-212.438467a58.363623 58.363623 0 0 1 35.581332-16.229183L362.110442 102.469115l6.322726 0.179186a115.191361 115.191361 0 0 1 38.217933 8.882534z">
-                <local:MyIconButton.ContextMenu>
-                    <ContextMenu Closed="HidePanel" HorizontalOffset="10" VerticalOffset="18">
-                        <local:MyMenuItem Click="BtnSkinEdit_Click" Header="修改皮肤"/>
-                        <local:MyMenuItem Click="BtnSkinSave_Click" Header="保存皮肤"/>
-                        <local:MyMenuItem Click="BtnSkinRefresh_Click" Header="刷新头像"/>
-                        <Separator />
-                        <local:MyMenuItem Click="BtnSkinCape_Click" Header="修改披风"/>
-                    </ContextMenu>
-                </local:MyIconButton.ContextMenu>
-            </local:MyIconButton>
-            <local:MyIconButton Height="24" Margin="0,0,16,0" x:Name="BtnEdit"
-                                ToolTip="账号信息" ToolTipService.Placement="Center" ToolTipService.VerticalOffset="40" ToolTipService.InitialShowDelay="50" ToolTipService.ShowDuration="1000000" 
+                    <local:MyIconButton.ContextMenu>
+                        <ContextMenu Closed="HidePanel" HorizontalOffset="10" VerticalOffset="18">
+                            <local:MyMenuItem Click="BtnSkinEdit_Click" Header="修改皮肤"/>
+                            <local:MyMenuItem Click="BtnSkinSave_Click" Header="保存皮肤"/>
+                            <local:MyMenuItem Click="BtnSkinRefresh_Click" Header="刷新头像"/>
+                            <Separator />
+                            <local:MyMenuItem Click="BtnSkinCape_Click" Header="修改披风"/>
+                        </ContextMenu>
+                    </local:MyIconButton.ContextMenu>
+                </local:MyIconButton>
+                <local:MyIconButton Height="24" Margin="0,0,9,0" x:Name="BtnEdit"
+                                ToolTip="修改信息" ToolTipService.Placement="Center" ToolTipService.VerticalOffset="40" ToolTipService.InitialShowDelay="50" ToolTipService.ShowDuration="1000000" 
                                 LogoScale="1.1" Logo="M462.336 924.891429L73.142857 950.857143l25.965714-389.193143 467.017143-467.017143a73.398857 73.398857 0 0 1 103.789715 0l259.437714 259.437714a73.398857 73.398857 0 0 1 0 103.789715l-467.017143 467.017143z m155.684571-778.349715L202.861714 561.664l259.474286 259.474286L877.458286 405.942857 618.057143 146.541714zM151.003429 873.033143l233.508571-25.965714-207.579429-207.579429-25.965714 233.545143z m544.841142-492.982857l51.894858 51.894857-233.508572 233.508571-51.931428-51.894857 233.545142-233.508571z">
-                <local:MyIconButton.ContextMenu>
-                    <ContextMenu Closed="HidePanel" HorizontalOffset="10" VerticalOffset="18">
-                        <local:MyMenuItem Click="BtnEditPassword_Click" Header="修改密码" />
-                        <local:MyMenuItem Click="BtnEditName_Click" Header="修改玩家名" />
-                    </ContextMenu>
-                </local:MyIconButton.ContextMenu>
-            </local:MyIconButton>
-            <local:MyIconButton Height="24" x:Name="BtnExit" Margin="0,0,0,0"
-                                ToolTip="退出登录" ToolTipService.Placement="Center" ToolTipService.VerticalOffset="40" ToolTipService.InitialShowDelay="50" ToolTipService.ShowDuration="1000000" 
-                                Logo="M533.333333 64a21.333333 21.333333 0 0 1 21.333334 21.333333v42.666667a21.333333 21.333333 0 0 1-21.333334 21.333333H170.666667v725.333334h362.666666a21.333333 21.333333 0 0 1 21.333334 21.333333v42.666667a21.333333 21.333333 0 0 1-21.333334 21.333333H170.666667a85.333333 85.333333 0 0 1-85.226667-81.066667L85.333333 874.666667V149.333333a85.333333 85.333333 0 0 1 81.066667-85.226666L170.666667 64h362.666666z m194.581334 219.584l183.168 183.168a64 64 0 0 1 2.88 87.424l-2.88 3.072-183.168 183.168a21.333333 21.333333 0 0 1-30.165334 0l-30.165333-30.165333a21.333333 21.333333 0 0 1 0-30.165334L792.96 554.666667H362.666667a21.333333 21.333333 0 0 1-21.333334-21.333334v-42.666666a21.333333 21.333333 0 0 1 21.333334-21.333334h430.293333l-125.376-125.418666a21.333333 21.333333 0 0 1 0-30.165334l30.165333-30.165333a21.333333 21.333333 0 0 1 30.165334 0z" />
-        </StackPanel>
+                    <local:MyIconButton.ContextMenu>
+                        <ContextMenu Closed="HidePanel" HorizontalOffset="10" VerticalOffset="18">
+                            <local:MyMenuItem Click="BtnEditPassword_Click" Header="修改密码" />
+                            <local:MyMenuItem Click="BtnEditName_Click" Header="修改玩家名" />
+                        </ContextMenu>
+                    </local:MyIconButton.ContextMenu>
+                </local:MyIconButton>
+                <local:MyIconButton Height="24" x:Name="BtnExit" Margin="0,0,0,0"
+                                ToolTip="切换账号" ToolTipService.Placement="Center" ToolTipService.VerticalOffset="40" ToolTipService.InitialShowDelay="50" ToolTipService.ShowDuration="1000000" 
+                                LogoScale="1.15" Logo="M512 0A512 512 0 1 0 1024 512 512 512 0 0 0 512 0z m0 941.407086A429.407086 429.407086 0 1 1 941.407086 512 429.407086 429.407086 0 0 1 512 941.407086z m235.139657-368.64H264.045714a43.505371 43.505371 0 0 0-31.246628 72.060343l159.305143 166.765714a41.281829 41.281829 0 1 0 59.626057-56.788114l-94.997943-99.474286H747.227429a41.311086 41.311086 0 1 0 0-82.622172zM262.670629 450.940343H745.764571a43.505371 43.505371 0 0 0 31.246629-72.352914l-159.305143-166.765715a41.281829 41.281829 0 1 0-59.713828 57.022172l94.968685 99.474285H262.670629a41.281829 41.281829 0 0 0 0 82.563658z" />
+            </StackPanel>
+        </Border>
     </Grid>
     <local:MySkin HorizontalAlignment="Center" VerticalAlignment="Top" x:Name="Skin" HasCape="True" IsHitTestVisible="False" />
 </Grid>

+ 1 - 1
Plain Craft Launcher 2/Pages/PageSelectRight.xaml

@@ -7,7 +7,7 @@
     <Grid>
         <Grid x:Name="PanAllBack">
             <local:MyScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" x:Name="PanBack">
-                <VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling" Name="PanMain" Margin="25,25,25,10" Grid.IsSharedSizeScope="True" />
+                <StackPanel Name="PanMain" Margin="25,25,25,10" Grid.IsSharedSizeScope="True" />
             </local:MyScrollViewer>
             <local:MyCard HorizontalAlignment="Center" VerticalAlignment="Center" Margin="40" x:Name="PanEmpty" UseAnimation="False">
                 <StackPanel Margin="20,17">

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

@@ -219,7 +219,7 @@
                         <ColumnDefinition Width="1*" />
                     </Grid.ColumnDefinitions>
                     <Grid.RowDefinitions>
-                        <RowDefinition Height="28" />
+                        <RowDefinition Height="Auto" />
                         <RowDefinition Height="9" />
                         <RowDefinition Height="28" />
                         <RowDefinition Height="9" />
@@ -228,7 +228,8 @@
                         <RowDefinition Height="Auto" />
                     </Grid.RowDefinitions>
                     <TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="JVM 参数头" Margin="0,0,25,0" />
-                    <local:MyTextBox x:Name="TextAdvanceJvm" Grid.Row="0" Grid.ColumnSpan="2" Tag="LaunchAdvanceJvm" Grid.Column="1" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,在没有确定把握的情况下请不要尝试修改。&#xa;你可以通过点击左侧选项卡的初始化按钮来恢复到默认设置。" Text="-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true" />
+                    <local:MyTextBox x:Name="TextAdvanceJvm" Grid.Row="0" Grid.ColumnSpan="2" Tag="LaunchAdvanceJvm" Grid.Column="1" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,在没有确定把握的情况下请不要尝试修改。&#xa;你可以通过点击左侧选项卡的初始化按钮来恢复到默认设置。" Text="-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true" 
+                                     Height="57" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" Padding="0,5" />
                     <TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="JVM 参数尾" Margin="0,0,25,0" />
                     <local:MyTextBox x:Name="TextAdvanceGame" Grid.Row="2" Grid.ColumnSpan="2" Tag="LaunchAdvanceGame" Grid.Column="1" ToolTip="文本框中的内容将会被直接拼合在启动参数的末尾。&#xa;例如输入 --demo 则会以试玩模式启动游戏。" />
                     <TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="启动前执行命令" Margin="0,0,25,0" />

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

@@ -182,7 +182,7 @@
                         <ColumnDefinition Width="60" />
                     </Grid.ColumnDefinitions>
                     <Grid.RowDefinitions>
-                        <RowDefinition Height="28" />
+                        <RowDefinition Height="Auto" />
                         <RowDefinition Height="9" />
                         <RowDefinition Height="28" />
                         <RowDefinition Height="9" />
@@ -192,7 +192,8 @@
                         <RowDefinition Height="Auto" />
                     </Grid.RowDefinitions>
                     <TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" Text="JVM 参数头" Margin="0,0,25,0" />
-                    <local:MyTextBox x:Name="TextAdvanceJvm" Grid.Row="0" Grid.ColumnSpan="2" Tag="VersionAdvanceJvm" Grid.Column="1" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,在没有确定把握的情况下请不要尝试修改。&#xa;若留空,则使用全局设置的值。" HintText="使用全局设置" />
+                    <local:MyTextBox x:Name="TextAdvanceJvm" Grid.Row="0" Grid.ColumnSpan="2" Tag="VersionAdvanceJvm" Grid.Column="1" ToolTip="启动 Minecraft 时使用的额外 JVM 参数,在没有确定把握的情况下请不要尝试修改。&#xa;若留空,则使用全局设置的值。" HintText="使用全局设置"
+                                     Height="57" AcceptsReturn="True" TextWrapping="Wrap" VerticalContentAlignment="Top" Padding="0,5" />
                     <TextBlock Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Left" Text="JVM 参数尾" Margin="0,0,25,0" />
                     <local:MyTextBox x:Name="TextAdvanceGame" Grid.Row="2" Grid.ColumnSpan="2" Tag="VersionAdvanceGame" Grid.Column="1" ToolTip="文本框中的内容将会被直接拼合在启动参数的末尾。&#xa;例如输入 --demo 则会以试玩模式启动游戏。&#xa;若留空,则使用全局设置的值。" HintText="使用全局设置" />
                     <TextBlock Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Left" Text="文件校验" Margin="0,0,25,0" />

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

@@ -396,7 +396,8 @@ PreFin:
 
     'LittleSkin
     Private Sub BtnServerAuthLittle_Click(sender As Object, e As EventArgs) Handles BtnServerAuthLittle.Click
-        If MyMsgBox("即将把第三方登录设置覆盖为自动使用 LittleSkin 登录,是否继续?", "覆盖确认", "确定", "取消") = 2 Then Exit Sub
+        If TextServerAuthServer.Text <> "" AndAlso TextServerAuthServer.Text <> "https://littleskin.cn/api/yggdrasil" AndAlso
+            MyMsgBox("即将把第三方登录设置覆盖为自动使用 LittleSkin 登录,是否继续?", "覆盖确认", "确定", "取消") = 2 Then Exit Sub
         TextServerAuthServer.Text = "https://littleskin.cn/api/yggdrasil"
         TextServerAuthRegister.Text = "https://littleskin.cn/auth/register"
         TextServerAuthName.Text = "LittleSkin 登录"

+ 1 - 1
Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj

@@ -285,7 +285,7 @@
     <Compile Include="Pages\PageVersion\PageVersionSetup.xaml.vb">
       <DependentUpon>PageVersionSetup.xaml</DependentUpon>
     </Compile>
-    <Compile Include="Modules\Reference\PresentationFramework.Aero\SystemDropShadowChrome.vb" />
+    <Compile Include="Modules\Reference\SystemDropShadowChrome.vb" />
     <Compile Include="Modules\Base\ModLoader.vb" />
     <Compile Include="Modules\Base\ModNet.vb" />
     <Compile Include="Modules\Base\ModValidate.vb" />