diff --git a/Plain Craft Launcher 2/Application.xaml b/Plain Craft Launcher 2/Application.xaml index abb600d..4bfefde 100644 --- a/Plain Craft Launcher 2/Application.xaml +++ b/Plain Craft Launcher 2/Application.xaml @@ -292,7 +292,7 @@ Margin="5,0,0,0" Cursor="IBeam" /> - + @@ -345,7 +345,7 @@ - + @@ -367,7 +367,10 @@ - + diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index 70d2949..cfd1875 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/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 diff --git a/Plain Craft Launcher 2/Controls/MyComboBox.vb b/Plain Craft Launcher 2/Controls/MyComboBox.vb index b47993b..dbad5d1 100644 --- a/Plain Craft Launcher 2/Controls/MyComboBox.vb +++ b/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 diff --git a/Plain Craft Launcher 2/Controls/MyPageRight.vb b/Plain Craft Launcher 2/Controls/MyPageRight.vb index 32a7ba3..b67c64f 100644 --- a/Plain Craft Launcher 2/Controls/MyPageRight.vb +++ b/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 diff --git a/Plain Craft Launcher 2/Controls/MyScrollViewer.vb b/Plain Craft Launcher 2/Controls/MyScrollViewer.vb index c358555..666d9fa 100644 --- a/Plain Craft Launcher 2/Controls/MyScrollViewer.vb +++ b/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 diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 220a90d..678ed88 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/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 登录")) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index f6f379d..9136bd8 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/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: ''' ''' 将数组随机打乱。 ''' - 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 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb index c7f31c3..421b066 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb +++ b/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请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。") diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index bc84343..1011fe4 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/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) diff --git a/Plain Craft Launcher 2/Modules/ModMusic.vb b/Plain Craft Launcher 2/Modules/ModMusic.vb index de3d4bd..1a054a7 100644 --- a/Plain Craft Launcher 2/Modules/ModMusic.vb +++ b/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) diff --git a/Plain Craft Launcher 2/Modules/Reference/PresentationFramework.Aero/SystemDropShadowChrome.vb b/Plain Craft Launcher 2/Modules/Reference/SystemDropShadowChrome.vb similarity index 100% rename from Plain Craft Launcher 2/Modules/Reference/PresentationFramework.Aero/SystemDropShadowChrome.vb rename to Plain Craft Launcher 2/Modules/Reference/SystemDropShadowChrome.vb diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index 8e8c70a..4a4a3ea 100644 --- a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb +++ b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb @@ -51,6 +51,6 @@ Imports System.Runtime.InteropServices ' 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 ' 方法是按如下所示使用“*” - - + + diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb index de7fc70..cfd9a5d 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml.vb +++ b/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 - For Each Version As CompFile In CompFileLoader.Output - If Version Is Nothing Then - Log("[Comp] 列表中的一个版本为 Nothing,请反馈此问题", LogLevel.Feedback) - Continue For + 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 - 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 + '实际进行添加 + 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 - Catch ex As Exception - Log(ex, "准备工程下载列表出错", LogLevel.Feedback) - End Try + Next + '添加筛选的版本的卡片 + If TargetCardName <> "" Then + Dict.Add(TargetCardName, New List(Of CompFile)) + For Each Version As CompFile In CompFileLoader.Output + 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 + Next + 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 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml index 13c320b..3546c5d 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadMod.xaml @@ -33,11 +33,8 @@ + - - - - diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml index 6adf39a..01c5e6e 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadPack.xaml @@ -32,11 +32,8 @@ + - - - - diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml index 00c01a2..7e94086 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml +++ b/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"> - + mc:Ignorable="d" d:DesignWidth="302.4"> + + + + + + + + + + + - - - - - - - + Fill="{DynamicResource ColorBrush2}" Opacity="0.7" Width="40" Stretch="Uniform" Grid.ColumnSpan="2" /> + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb index fb52af4..e54eb06 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb @@ -4,12 +4,50 @@ ''' 刷新页面显示的所有信息。 ''' 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 + ''' ''' 获取当前页面的登录信息。 ''' 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 ''' ''' 当前页面的登录信息是否有效。 @@ -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") diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml index 7c24511..3841983 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml @@ -9,39 +9,42 @@ - - + + - - + + - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageSelectRight.xaml b/Plain Craft Launcher 2/Pages/PageSelectRight.xaml index e53ba5d..b9b4693 100644 --- a/Plain Craft Launcher 2/Pages/PageSelectRight.xaml +++ b/Plain Craft Launcher 2/Pages/PageSelectRight.xaml @@ -7,7 +7,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml index 4c7d840..7c45180 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml @@ -219,7 +219,7 @@ - + @@ -228,7 +228,8 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml index a84102d..407fad8 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml @@ -182,7 +182,7 @@ - + @@ -192,7 +192,8 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb index 7336fff..d729bdc 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionSetup.xaml.vb +++ b/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 登录" diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index ac4d2e2..3aa5c37 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -285,7 +285,7 @@ PageVersionSetup.xaml - +