From fd7049ceedc0bfb554fe2b8285c992be3457a946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=99=E8=85=BE=E7=8C=AB=E8=B7=83?= <1043137532@qq.com> Date: Wed, 26 Apr 2023 04:27:52 +0800 Subject: [PATCH] 2.5.4 --- Plain Craft Launcher 2/Application.xaml.vb | 4 - .../Controls/MyIconButton.xaml.vb | 2 +- .../Controls/MyScrollViewer.vb | 10 +- Plain Craft Launcher 2/FormMain.xaml.vb | 8 +- .../Modules/Base/ModBase.vb | 26 +++- .../Modules/Base/MyBitmap.vb | 14 ++- .../Modules/Minecraft/ModComp.vb | 2 +- .../Modules/Minecraft/ModCrash.vb | 2 +- .../Modules/Minecraft/ModLaunch.vb | 114 ++++++----------- .../Modules/Minecraft/ModMinecraft.vb | 6 +- .../My Project/AssemblyInfo.vb | 4 +- .../Pages/PageDownload/ModDownloadLib.vb | 44 ++++--- .../Pages/PageLaunch/MySkin.xaml.vb | 22 ++-- .../Pages/PageLaunch/PageLaunchLeft.xaml | 10 +- .../Pages/PageLaunch/PageLaunchLeft.xaml.vb | 102 +++------------ .../Pages/PageLaunch/PageLaunchRight.xaml.vb | 6 - .../Pages/PageLaunch/PageLoginMojang.xaml | 26 ---- .../Pages/PageLaunch/PageLoginMojang.xaml.vb | 84 ------------- .../Pages/PageLaunch/PageLoginMojangSkin.xaml | 29 ----- .../PageLaunch/PageLoginMojangSkin.xaml.vb | 117 ------------------ .../Pages/PageLaunch/PageLoginMs.xaml | 14 ++- .../Pages/PageLaunch/PageLoginMs.xaml.vb | 7 +- .../Pages/PageLaunch/PageLoginMsSkin.xaml | 47 +++++-- .../Pages/PageLaunch/PageLoginMsSkin.xaml.vb | 66 +++++++--- .../Pages/PageVersion/PageVersionLeft.xaml.vb | 8 +- .../Plain Craft Launcher 2.vbproj | 14 --- 26 files changed, 249 insertions(+), 539 deletions(-) delete mode 100644 Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojang.xaml delete mode 100644 Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojang.xaml.vb delete mode 100644 Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojangSkin.xaml delete mode 100644 Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojangSkin.xaml.vb diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index b5bb048..70d2949 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -205,10 +205,6 @@ Public Class Application Setup.Set("Login" & Token & "Email", Join(Dict.Keys.ToArray, "¨")) Setup.Set("Login" & Token & "Pass", Join(Dict.Values.ToArray, "¨")) Select Case Token - Case "Mojang" - FrmLoginMojang.ComboName.ItemsSource = Dict.Keys - FrmLoginMojang.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "") - FrmLoginMojang.TextPass.Password = If(Dict.Values.Count > 0, Dict.Values(0), "") Case "Nide" FrmLoginNide.ComboName.ItemsSource = Dict.Keys FrmLoginNide.ComboName.Text = If(Dict.Keys.Count > 0, Dict.Keys(0), "") diff --git a/Plain Craft Launcher 2/Controls/MyIconButton.xaml.vb b/Plain Craft Launcher 2/Controls/MyIconButton.xaml.vb index db8e038..d599fb4 100644 --- a/Plain Craft Launcher 2/Controls/MyIconButton.xaml.vb +++ b/Plain Craft Launcher 2/Controls/MyIconButton.xaml.vb @@ -115,7 +115,7 @@ Dim AnimList As New List(Of AniData) Select Case Theme Case Themes.Color - AnimList.Add(AaColor(Path, Shape.FillProperty, "ColorBrush4", AnimationColorOut)) + AnimList.Add(AaColor(Path, Shape.FillProperty, "ColorBrush5", AnimationColorOut)) PanBack.Background = New MyColor(0, 255, 255, 255) Case Themes.White AnimList.Add(AaColor(Path, Shape.FillProperty, "ColorBrush8", AnimationColorOut)) diff --git a/Plain Craft Launcher 2/Controls/MyScrollViewer.vb b/Plain Craft Launcher 2/Controls/MyScrollViewer.vb index 83b1245..c358555 100644 --- a/Plain Craft Launcher 2/Controls/MyScrollViewer.vb +++ b/Plain Craft Launcher 2/Controls/MyScrollViewer.vb @@ -5,8 +5,14 @@ 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 - Dim SourceTypeName As String = e.Source.GetType.Name - If Content.TemplatedParent Is Nothing AndAlso (SourceTypeName.Contains("Combo") OrElse SourceTypeName = "MyTextBox") Then Exit Sub '确定可视树,防止滚动问题 + Dim SourceType = e.Source.GetType + If Content.TemplatedParent Is Nothing AndAlso + ((GetType(ComboBox).IsAssignableFrom(SourceType) AndAlso CType(e.Source, ComboBox).IsDropDownOpen) OrElse + (GetType(TextBox).IsAssignableFrom(SourceType) AndAlso CType(e.Source, TextBox).AcceptsReturn) OrElse + GetType(ComboBoxItem).IsAssignableFrom(SourceType)) Then + '如果当前是在对有滚动条的下拉框或文本框执行,则不接管操作 + Exit Sub + End If PerformVerticalOffsetDelta(-e.Delta) e.Handled = True End Sub diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 4fe2bca..220a90d 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -95,7 +95,13 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- - If LastVersion < 287 Then 'Snapshot 2.5.3 + 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 登录")) + FeatureCount += 6 + BugCount += 14 + End If + If LastVersion < 288 Then 'Snapshot 2.5.3 FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "在缺少 Java 时会自动下载所需的 Java")) FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "添加 CurseForge / Modrinth 来源筛选")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "为下载管理和音乐播放按钮添加进度条")) diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index e25534b..f6f379d 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.3" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.5.3." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.5.4" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.5.4." & VersionBranchCode '标准格式的四段式版本号 #If BETA Then Public Const VersionCode As Integer = 286 'Release #Else - Public Const VersionCode As Integer = 288 'Snapshot + Public Const VersionCode As Integer = 289 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName @@ -158,6 +158,10 @@ Public Module ModBase ''' Public Const IconButtonUser As String = "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" ''' + ''' 图标按钮,微软,0.9x + ''' + Public Const IconButtonMs As String = "M0,0h5v5h-5ZM6,0h5v5h-5v-5ZM0,6h5v5h-5v-5ZM6,6h5v5h-5v-5Z" + ''' ''' 图标,音符,1x ''' Public Const IconMusic As String = "M348.293565 716.53287V254.797913c0-41.672348 28.004174-78.358261 68.919652-90.37913L815.994435 40.826435c62.775652-18.610087 125.907478 26.579478 125.907478 89.933913v539.158261c8.013913 42.25113-8.94887 89.177043-47.014956 127.109565a232.848696 232.848696 0 0 1-170.785392 65.758609c-61.885217-2.938435-111.081739-33.435826-129.113043-80.050087-18.031304-46.614261-2.137043-102.177391 41.672348-145.853218a232.848696 232.848696 0 0 1 170.785391-65.80313c21.014261 1.024 40.514783 5.164522 57.878261 12.065391V233.338435c0-12.109913-10.551652-20.034783-20.569044-20.034783a24.620522 24.620522 0 0 0-5.787826 0.934957L439.785739 338.18713a19.545043 19.545043 0 0 0-14.825739 19.144348v438.984348H423.846957c11.53113 43.987478-5.164522 94.208-45.412174 134.322087a232.848696 232.848696 0 0 1-170.785392 65.758609c-61.885217-2.938435-111.081739-33.435826-129.113043-80.050087-18.031304-46.614261-2.137043-102.177391 41.672348-145.853218a232.848696 232.848696 0 0 1 170.785391-65.80313c20.791652 1.024 40.069565 5.075478 57.299478 11.842783z" @@ -784,7 +788,7 @@ Public Module ModBase '复制文件 File.Copy(FromPath, ToPath, True) Catch ex As Exception - Throw New Exception("复制文件出错:" & FromPath & " -> " & ToPath, ex) + Throw New Exception("复制文件出错:" & FromPath & " → " & ToPath, ex) End Try End Sub ''' @@ -1240,7 +1244,19 @@ Re: Directory.CreateDirectory(DestDirectory) If CompressFilePath.EndsWith(".zip") OrElse CompressFilePath.EndsWith(".jar") OrElse CompressFilePath.EndsWith(".mrpack") Then '以 zip 方式解压 - ZipFile.ExtractToDirectory(CompressFilePath, DestDirectory, If(Encode, Encoding.GetEncoding("GB18030"))) + Using stream As New FileStream(CompressFilePath, FileMode.Open) + Using archive As New ZipArchive(stream, ZipArchiveMode.Read, False, If(Encode, Encoding.GetEncoding("GB18030"))) + For Each entry As ZipArchiveEntry In archive.Entries + Dim destinationPath As String = IO.Path.Combine(DestDirectory, entry.FullName) + If destinationPath.EndsWith("\") OrElse destinationPath.EndsWith("/") Then + Directory.CreateDirectory(destinationPath) + Else + If File.Exists(destinationPath) Then File.Delete(destinationPath) + entry.ExtractToFile(destinationPath, True) + End If + Next + End Using + End Using Return True ElseIf CompressFilePath.EndsWith(".gz") Then '以 gz 方式解压 diff --git a/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb b/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb index e9e74f3..7cbe59f 100644 --- a/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb +++ b/Plain Craft Launcher 2/Modules/Base/MyBitmap.vb @@ -1,5 +1,7 @@ '一个万能的自动图片类型转换工具类 +Imports System.Drawing.Imaging + Public Class MyBitmap ''' @@ -29,7 +31,7 @@ Public Class MyBitmap Dim bitmapData = Bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb) Try Dim size = rect.Width * rect.Height * 4 - Return BitmapSource.Create(Bitmap.Width, Bitmap.Height, DPI, DPI, PixelFormats.Bgra32, Nothing, bitmapData.Scan0, size, bitmapData.Stride) + Return BitmapSource.Create(Bitmap.Width, Bitmap.Height, Bitmap.HorizontalResolution, Bitmap.VerticalResolution, PixelFormats.Bgra32, Nothing, bitmapData.Scan0, size, bitmapData.Stride) Finally Bitmap.UnlockBits(bitmapData) End Try @@ -109,8 +111,10 @@ Public Class MyBitmap Public Function Rotation(angle As Double) As System.Drawing.Bitmap Dim img As System.Drawing.Image = Me.Pic Dim bitSize As Single = img.Width - Dim bmp As New System.Drawing.Bitmap(CInt(bitSize), CInt(bitSize)) + Dim bmp As New System.Drawing.Bitmap(CInt(bitSize), CInt(bitSize), img.PixelFormat) + bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution) Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bmp) + g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor g.TranslateTransform(bitSize / 2, bitSize / 2) g.RotateTransform(angle) g.TranslateTransform(-bitSize / 2, -bitSize / 2) @@ -124,9 +128,11 @@ Public Class MyBitmap ''' Public Function Clip(rect As System.Drawing.Rectangle) As System.Drawing.Bitmap Dim img As System.Drawing.Image = Pic - Dim bmp As New System.Drawing.Bitmap(rect.Width, rect.Height) + Dim bmp As New System.Drawing.Bitmap(rect.Width, rect.Height, img.PixelFormat) + bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution) Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(bmp) - g.DrawImageUnscaled(img, rect) + g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor + g.DrawImageUnscaled(img, rect.X, rect.Y) End Using Return bmp End Function diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb index b903d13..0630f2c 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb @@ -181,7 +181,7 @@ Get If Not LoadedDatabase Then LoadedDatabase = True - _DatabaseEntry = CompDatabase.FirstOrDefault(Function(c) If(FromCurseForge, c.CurseForgeSlug, c.ModrinthSlug) = Slug) + If Type = CompType.Mod Then _DatabaseEntry = CompDatabase.FirstOrDefault(Function(c) If(FromCurseForge, c.CurseForgeSlug, c.ModrinthSlug) = Slug) End If Return _DatabaseEntry End Get diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb index 79bd552..9381391 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModCrash.vb @@ -505,7 +505,7 @@ Done: If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= in config \[)[^./ ]+(?=.mixins.json\] FAILED during )") If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= in config \[mixins.)[^./ ]+(?=.json\] FAILED during )") If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= in callback )[^./ ]+(?=.mixins.json:)") - If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<= in callback mixins.)[^./ ]+(?=.json:)") + If ModId Is Nothing Then ModId = RegexSeek(LogMc, "(?<=from mod )[^\] ]+(?=\] from phase)") AppendReason(CrashReason.ModMixin失败, TryAnalyzeModName(If(ModId, "").TrimEnd((vbCrLf & " ").ToCharArray))) End If If LogMc.Contains("Caught exception from ") Then AppendReason(CrashReason.确定Mod导致游戏崩溃, TryAnalyzeModName(RegexSeek(LogMc, "(?<=Caught exception from )[^\n]+?")?.TrimEnd((vbCrLf & " ").ToCharArray))) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index 36d3629..bc84343 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -181,20 +181,32 @@ NextInner: CheckResult = McLoginAble(LoginInput) End Sub) If CheckResult <> "" Then Throw New ArgumentException(CheckResult) - '求赞助 #If BETA Then + '求赞助 RunInNewThread(Sub() Select Case Setup.Get("SystemLaunchCount") - Case 20, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900, 2000 + Case 20, 50, 100, 150, 200, 250, 300, 350, 400, 450, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1700, 1900, 2100, 2300, 2500 If MyMsgBox("PCL 已经为你启动了 " & Setup.Get("SystemLaunchCount") & " 次游戏啦!" & vbCrLf & - "如果觉得 PCL 还算好用的话,也可以考虑小小地赞助一下作者呢 qwq……" & vbCrLf & - "毕竟一个人开发也不容易(小声)……", + "如果觉得 PCL 还算好用的话,也可以考虑赞助一下作者……一点心意也行……" & vbCrLf & + "毕竟一个人开发也不容易(悲)……", "求赞助啦……", "这就赞助!", "但是我拒绝") = 1 Then - OpenWebsite("https://afdian.net/a/LTCat/plan") + OpenWebsite("https://afdian.net/a/LTCat") End If End Select End Sub, "Donate") #End If + '正版购买提示 + If Not Setup.Get("HintBuy") AndAlso Setup.Get("LoginType") <> McLoginType.Ms Then + Select Case Setup.Get("SystemLaunchCount") + Case 10, 35, 75, 125, 175, 225, 275, 325, 375, 425, 475, 550, 650, 750, 850, 950, 1050, 1150, 1250, 1350, 1450, 1600, 1800, 2000, 2200, 2400 + If MyMsgBox("你已经启动了 " & Setup.Get("SystemLaunchCount") & " 次 Minecraft 啦!" & vbCrLf & + "如果觉得 Minecraft 还不错,也可以考虑购买正版支持一下,毕竟开发游戏也很不容易……" & vbCrLf & + "在你登录一次正版账号后,就不会再出现这个提示了。", + "考虑一下正版?", "购买正版游戏", "下次一定") = 1 Then + OpenWebsite("https://www.minecraft.net/store/checkout/minecraft-java-bedrock-edition-pc") + End If + End Select + End If End Sub #End Region @@ -204,7 +216,6 @@ NextInner: '登录方式 Public Enum McLoginType Legacy = 0 - Mojang = 1 Nide = 2 Auth = 3 Ms = 5 @@ -304,15 +315,8 @@ NextInner: Public Uuid As String Public AccessToken As String Public Type As String - ''' - ''' 仅用于登录方式为 Mojang 正版时的 Refresh Login,其余时间为一个无意义的 ID(一般为玩家的 UUID)。 - ''' Public ClientToken As String ''' - ''' 用于登录的邮箱。仅用于登录方式为 Mojang 正版时的 launcher_profile 更新。 - ''' - Public Email As String - ''' ''' 进行微软登录时返回的 profile 信息。 ''' Public ProfileJson As String @@ -324,8 +328,6 @@ NextInner: Public Function McLoginName() As String '根据当前登录方式优先返回 Select Case Setup.Get("LoginType") - Case McLoginType.Mojang - If Setup.Get("CacheMojangName") <> "" Then Return Setup.Get("CacheMojangName") Case McLoginType.Ms If Setup.Get("CacheMsName") <> "" Then Return Setup.Get("CacheMsName") Case McLoginType.Legacy @@ -337,7 +339,6 @@ NextInner: End Select '查找所有可能的项 If Setup.Get("CacheMsName") <> "" Then Return Setup.Get("CacheMsName") - If Setup.Get("CacheMojangName") <> "" Then Return Setup.Get("CacheMojangName") If Setup.Get("CacheNideName") <> "" Then Return Setup.Get("CacheNideName") If Setup.Get("CacheAuthName") <> "" Then Return Setup.Get("CacheAuthName") If Setup.Get("LoginLegacyName") <> "" Then Return Setup.Get("LoginLegacyName").ToString.Split("¨")(0) @@ -348,12 +349,6 @@ NextInner: ''' Public Function McLoginAble() As String Select Case Setup.Get("LoginType") - Case McLoginType.Mojang - If Setup.Get("CacheMojangAccess") = "" Then - Return FrmLoginMojang.IsVaild() - Else - Return "" - End If Case McLoginType.Ms If Setup.Get("CacheMsOAuthRefresh") = "" Then Return FrmLoginMs.IsVaild() @@ -383,8 +378,6 @@ NextInner: ''' Public Function McLoginAble(LoginData As McLoginData) As String Select Case LoginData.Type - Case McLoginType.Mojang - Return PageLoginMojang.IsVaild(LoginData) Case McLoginType.Ms Return PageLoginMs.IsVaild(LoginData) Case McLoginType.Legacy @@ -407,12 +400,6 @@ NextInner: Select Case LoginType Case McLoginType.Legacy LoginData = PageLoginLegacy.GetLoginData() - Case McLoginType.Mojang - If Setup.Get("CacheMojangAccess") = "" Then - LoginData = PageLoginMojang.GetLoginData() - Else - LoginData = PageLoginMojangSkin.GetLoginData() - End If Case McLoginType.Ms If Setup.Get("CacheMsOAuthRefresh") = "" Then LoginData = PageLoginMs.GetLoginData() @@ -445,8 +432,6 @@ NextInner: '获取对应加载器 Dim Loader As LoaderBase = Nothing Select Case Data.Input.Type - Case McLoginType.Mojang - Loader = McLoginMojangLoader Case McLoginType.Ms Loader = McLoginMsLoader Case McLoginType.Legacy @@ -473,7 +458,6 @@ NextInner: #Region "分方式登录模块" '各个登录方式的主对象与输入构造 - Public McLoginMojangLoader As New LoaderTask(Of McLoginServer, McLoginResult)("Loader Login Mojang", AddressOf McLoginServerStart) With {.ReloadTimeout = 60000} Public McLoginMsLoader As New LoaderTask(Of McLoginMs, McLoginResult)("Loader Login Ms", AddressOf McLoginMsStart) With {.ReloadTimeout = 300000} Public McLoginLegacyLoader As New LoaderTask(Of McLoginLegacy, McLoginResult)("Loader Login Legacy", AddressOf McLoginLegacyStart) Public McLoginNideLoader As New LoaderTask(Of McLoginServer, McLoginResult)("Loader Login Nide", AddressOf McLoginServerStart) With {.ReloadTimeout = 60000} @@ -484,7 +468,7 @@ NextInner: Private Sub McLoginMsStart(Data As LoaderTask(Of McLoginMs, McLoginResult)) Dim Input As McLoginMs = Data.Input Dim LogUsername As String = Input.UserName - McLaunchLog("登录方式:微软正版(" & If(LogUsername = "", "尚未登录", LogUsername) & ")") + McLaunchLog("登录方式:正版(" & If(LogUsername = "", "尚未登录", LogUsername) & ")") Data.Progress = 0.05 '检查是否已经登录完成 If Input.AccessToken <> "" AndAlso Not Data.IsForceRestarting Then @@ -531,6 +515,7 @@ Relogin: '解锁主题 SkipLogin: McLaunchLog("微软登录完成") + Setup.Set("HintBuy", True) '关闭正版购买提示 Data.Progress = 0.95 If ThemeUnlock(10, False) Then MyMsgBox("感谢你对正版游戏的支持!" & vbCrLf & "隐藏主题 跳票红 已解锁!", "提示") End Sub @@ -617,11 +602,7 @@ LoginFinish: .Type = "Legacy" End With '将结果扩展到所有项目中 - 'Data.Output.AccessToken = Setup.Get("CacheMojangAccess") '不能优先使用缓存的 AccessToken,这会导致离线用户名设置失效 - 'If Data.Output.AccessToken.Length < 300 Then Data.Output.AccessToken = Data.Output.Uuid - 'Data.Output.ClientToken = Setup.Get("CacheMojangClient") - 'If Data.Output.AccessToken.Length <> 32 Then Data.Output.ClientToken = Data.Output.Uuid '保存启动记录 Dim Names As New List(Of String) @@ -649,7 +630,6 @@ LoginFinish: Data.Output.Name = LoginJson("selectedProfile")("name").ToString Data.Output.Uuid = LoginJson("selectedProfile")("id").ToString Data.Output.Type = "Auth" - Data.Output.Email = Data.Input.UserName McLaunchLog("登录成功(Login, HiPer)") '保存启动记录 Dim Names As New List(Of String) @@ -691,7 +671,6 @@ LoginFinish: Data.Output.Uuid = Uuid Data.Output.Name = Name Data.Output.Type = Data.Input.Token - Data.Output.Email = Data.Input.UserName '不更改缓存,直接结束 McLaunchLog("验证登录成功(Validate, " & Data.Input.Token & ")") End Sub @@ -716,7 +695,6 @@ LoginFinish: Data.Output.Uuid = LoginJson("selectedProfile")("id").ToString Data.Output.Name = LoginJson("selectedProfile")("name").ToString Data.Output.Type = Data.Input.Token - Data.Output.Email = Data.Input.UserName '保存缓存 Setup.Set("Cache" & Data.Input.Token & "Access", Data.Output.AccessToken) Setup.Set("Cache" & Data.Input.Token & "Client", Data.Output.ClientToken) @@ -737,12 +715,8 @@ LoginFinish: ContentType:="application/json; charset=utf-8")) '检查登录结果 If LoginJson("availableProfiles").Count = 0 Then - If Data.Input.Type = McLoginType.Auth Then - If Data.Input.ForceReselectProfile Then Hint("你还没有创建角色,无法更换!", HintType.Critical) - Throw New Exception("$你还没有创建角色,请在创建角色后再试!") - Else - Throw New Exception("$你还没有购买 Minecraft 正版,请在购买后再试!") - End If + If Data.Input.ForceReselectProfile Then Hint("你还没有创建角色,无法更换!", HintType.Critical) + Throw New Exception("$你还没有创建角色,请在创建角色后再试!") ElseIf Data.Input.ForceReselectProfile AndAlso LoginJson("availableProfiles").Count = 1 Then Hint("你的账户中只有一个角色,无法更换!", HintType.Critical) End If @@ -785,7 +759,6 @@ LoginFinish: Data.Output.Name = SelectedName Data.Output.Uuid = SelectedId Data.Output.Type = Data.Input.Token - Data.Output.Email = Data.Input.UserName '保存缓存 Setup.Set("Cache" & Data.Input.Token & "Access", Data.Output.AccessToken) Setup.Set("Cache" & Data.Input.Token & "Client", Data.Output.ClientToken) @@ -798,27 +771,13 @@ LoginFinish: Catch ex As Exception Dim AllMessage As String = GetExceptionSummary(ex) Log(ex, "登录失败原始错误信息", LogLevel.Normal) - If AllMessage.Contains("410") AndAlso AllMessage.Contains("Migrated") Then - Throw New Exception("$登录失败:该 Mojang 账号已迁移至微软账号,请在上方的登录方式中选择 微软 并再次尝试登录!") - ElseIf AllMessage.Contains("403") Then + If AllMessage.Contains("403") Then Select Case Data.Input.Type Case McLoginType.Auth Throw New Exception("$登录失败,以下为可能的原因:" & vbCrLf & " - 输入的账号或密码错误。" & vbCrLf & " - 登录尝试过于频繁,导致被暂时屏蔽。请不要操作,等待 10 分钟后再试。" & vbCrLf & " - 只注册了账号,但没有在皮肤站新建角色。") - Case McLoginType.Legacy - Throw - Case McLoginType.Mojang - If AllMessage.Contains("Invalid username or password") Then - Throw New Exception("$登录失败:输入的账号或密码有误。") - Else - Throw New Exception("$登录尝试过于频繁,导致被 Mojang 暂时屏蔽。请不要操作,等待 10 分钟后再试。") - End If - Case McLoginType.Ms - Throw New Exception("$登录失败,以下为可能的原因:" & vbCrLf & - " - 登录尝试过于频繁,导致被暂时屏蔽。请不要操作,等待 10 分钟后再试。" & vbCrLf & - " - 账号类别错误。如果你在使用 Mojang 账号,请将登录方式切换为 Mojang。") Case McLoginType.Nide Throw New Exception("$登录失败,以下为可能的原因:" & vbCrLf & " - 输入的账号或密码错误。" & vbCrLf & @@ -1037,8 +996,8 @@ SystemBrowser: ElseIf Message.Contains("(404)") Then Log(ex, "微软登录第 6 步汇报 404") RunInNewThread(Sub() - Select Case MyMsgBox("你可能没有在 Minecraft 官网创建档案,或者没有购买 Minecraft。" & vbCrLf & - "如果你已经购买了游戏,请在官网上创建档案后再试。", "登录失败", "创建档案", "购买 Minecraft", "取消") + Select Case MyMsgBox("你可能没有在 Minecraft 官网创建档案,XBox Game Pass 已到期,或者还没有购买 Minecraft。" & vbCrLf & + "如果你确认拥有 Minecraft,请在官网上创建档案后再试。", "登录失败", "创建档案", "购买 Minecraft", "取消") Case 1 OpenWebsite("https://www.minecraft.net/zh-hans/msaprofile/mygames/editprofile") Case 2 @@ -1180,6 +1139,9 @@ SystemBrowser: ElseIf McVersionCurrent.Version.McCodeMain >= 18 AndAlso McVersionCurrent.Version.McCodeMain < 99 AndAlso McVersionCurrent.Version.HasOptiFine Then '#305 '1.18+:若安装了 OptiFine,最高 Java 18 MaxVer = New Version(1, 18, 999, 999) + ElseIf McVersionCurrent.Version.McCodeMain >= 19 AndAlso McVersionCurrent.Version.McCodeMain < 99 Then + '1.19+:最高 Java 19 + MaxVer = New Version(1, 19, 999, 999) End If End If @@ -1708,7 +1670,7 @@ NextVersion: '更新 launcher_profiles.json Try '确保可用 - If Not (McLoginLoader.Output.Type = "Mojang" OrElse McLoginLoader.Output.Type = "Microsoft") Then Exit Try + If Not McLoginLoader.Output.Type = "Microsoft" Then Exit Try McFolderLauncherProfilesJsonCreate(PathMcFolder) '构建需要替换的 Json 对象 Dim ReplaceJsonString As String = " @@ -1716,7 +1678,7 @@ NextVersion: ""authenticationDatabase"": { ""00000111112222233333444445555566"": { ""accessToken"": """ & McLoginLoader.Output.AccessToken & """, - ""username"": """ & If(McLoginLoader.Output.Email, McLoginLoader.Output.Name).Replace("""", "-") & """, + ""username"": """ & McLoginLoader.Output.Name.Replace("""", "-") & """, ""profiles"": { ""66666555554444433333222221111100"": { ""displayName"": """ & McLoginLoader.Output.Name & """ @@ -1747,7 +1709,7 @@ NextVersion: ""authenticationDatabase"": { ""00000111112222233333444445555566"": { ""accessToken"": """ & McLoginLoader.Output.AccessToken & """, - ""username"": """ & If(McLoginLoader.Output.Email, McLoginLoader.Output.Name).Replace("""", "-") & """, + ""username"": """ & McLoginLoader.Output.Name.Replace("""", "-") & """, ""profiles"": { ""66666555554444433333222221111100"": { ""displayName"": """ & McLoginLoader.Output.Name & """ @@ -1851,7 +1813,7 @@ NextVersion: End If Case 19 If McVersionCurrent.Version.McCodeSub <= 3 Then - PackFormat = 10 + PackFormat = 9 Else PackFormat = 12 End If @@ -1989,7 +1951,7 @@ IgnoreCustomSkin: Try CustomProcess.StartInfo.FileName = "cmd.exe" CustomProcess.StartInfo.Arguments = "/c """ & CustomCommandGlobal & """" - CustomProcess.StartInfo.WorkingDirectory = Path + CustomProcess.StartInfo.WorkingDirectory = PathMcFolder CustomProcess.StartInfo.UseShellExecute = False CustomProcess.StartInfo.CreateNoWindow = True CustomProcess.Start() @@ -2013,7 +1975,7 @@ IgnoreCustomSkin: Try CustomProcess.StartInfo.FileName = "cmd.exe" CustomProcess.StartInfo.Arguments = "/c """ & CustomCommandVersion & """" - CustomProcess.StartInfo.WorkingDirectory = Path + CustomProcess.StartInfo.WorkingDirectory = PathMcFolder CustomProcess.StartInfo.UseShellExecute = False CustomProcess.StartInfo.CreateNoWindow = True CustomProcess.Start() @@ -2061,12 +2023,16 @@ IgnoreCustomSkin: '开始进程 GameProcess.Start() McLaunchLog("已启动游戏进程:" & McLaunchJavaSelected.PathJavaw) + If Loader.IsAborted Then + McLaunchLog("由于取消启动,已强制结束游戏进程") '#1631 + GameProcess.Kill() + Exit Sub + End If Loader.Output = GameProcess McLaunchProcess = GameProcess '进程优先级处理 Try - If GameProcess.HasExited Then Exit Try '可能在启动游戏进程的同时刚好取消了启动 GameProcess.PriorityBoostEnabled = True Select Case Setup.Get("LaunchArgumentPriority") Case 0 '高 @@ -2177,10 +2143,8 @@ IgnoreCustomSkin: Else Raw = Raw.Replace("{login}", "离线") End If - Case McLoginType.Mojang - Raw = Raw.Replace("{login}", "Mojang 正版") Case McLoginType.Ms - Raw = Raw.Replace("{login}", "微软正版") + Raw = Raw.Replace("{login}", "正版") Case McLoginType.Nide Raw = Raw.Replace("{login}", "统一通行证") Case McLoginType.Auth diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index 4930468..d97c827 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -147,7 +147,7 @@ Public Module ModMinecraft #Region "版本处理" - Public Const McVersionCacheVersion As Integer = 25 + Public Const McVersionCacheVersion As Integer = 26 Private _McVersionCurrent As McVersion Private _McVersionLast = 0 '为 0 以保证与 Nothing 不相同,使得 UI 显示可以正常初始化 @@ -742,8 +742,10 @@ ExitDataLoad: If CustomInfo = "" Then Select Case State Case McVersionState.Snapshot - If Version.McName.ToLower.Contains("pre") OrElse Version.McName.ToLower.Contains("rc") Then + If Version.McName.ToLower.Contains("pre") Then Info = "预发布版 " & Version.McName + ElseIf Version.McName.ToLower.Contains("rc") Then + Info = "发布候选 " & Version.McName ElseIf Version.McName.Contains("experimental") OrElse Version.McName = "pending" Then Info = "实验性快照" Else diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index fece523..8e8c70a 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/ModDownloadLib.vb b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb index 70028e7..31f6bf0 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -3,10 +3,14 @@ Public Module ModDownloadLib ''' - ''' 如果 OptiFine 与 Forge 同时开始安装,就会导致 Forge 安装失败,所以在这里添加一个锁。 + ''' 如果 OptiFine 与 Forge 同时开始安装,就会导致 Forge 安装失败。 ''' Private InstallSyncLock As New Object ''' + ''' 如果 OptiFine 与 Forge 同时复制原版 Jar,就会导致复制文件时冲突。 + ''' + Private VanillaSyncLock As New Object + ''' ''' 最高的 Minecraft 大版本号,-1 代表尚未获取。 ''' Public McVersionHighest As Integer = -1 @@ -548,16 +552,18 @@ Public Module ModDownloadLib If Task.IsAborted Then Exit Sub '拷贝原版文件 If Not IsCustomFolder Then Exit Sub - Dim ClientName As String = New DirectoryInfo(ClientDownloadLoader.Input).Name - Directory.CreateDirectory(McFolder & "versions\" & DownloadInfo.Inherit) - If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") Then - CopyFile(ClientDownloadLoader.Input & ClientName & ".json", + SyncLock VanillaSyncLock + Dim ClientName As String = New DirectoryInfo(ClientDownloadLoader.Input).Name + Directory.CreateDirectory(McFolder & "versions\" & DownloadInfo.Inherit) + If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") Then + CopyFile(ClientDownloadLoader.Input & ClientName & ".json", McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".json") - End If - If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".jar") Then - CopyFile(ClientDownloadLoader.Input & ClientName & ".jar", - McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".jar") - End If + End If + If Not File.Exists(McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".jar") Then + CopyFile(ClientDownloadLoader.Input & ClientName & ".jar", + McFolder & "versions\" & DownloadInfo.Inherit & "\" & DownloadInfo.Inherit & ".jar") + End If + End SyncLock End Sub) With {.ProgressWeight = 0.1, .Show = False}) '安装(新旧方式均需要原版 Jar 和 Json) @@ -1379,14 +1385,16 @@ Public Module ModDownloadLib If Task.IsAborted Then Exit Sub '拷贝原版文件 If Not IsCustomFolder Then Exit Sub - Dim ClientName As String = New DirectoryInfo(ClientDownloadLoader.Input).Name - Directory.CreateDirectory(McFolder & "versions\" & Inherit) - If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".json") Then - CopyFile(ClientDownloadLoader.Input & ClientName & ".json", McFolder & "versions\" & Inherit & "\" & Inherit & ".json") - End If - If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".jar") Then - CopyFile(ClientDownloadLoader.Input & ClientName & ".jar", McFolder & "versions\" & Inherit & "\" & Inherit & ".jar") - End If + SyncLock VanillaSyncLock + Dim ClientName As String = New DirectoryInfo(ClientDownloadLoader.Input).Name + Directory.CreateDirectory(McFolder & "versions\" & Inherit) + If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".json") Then + CopyFile(ClientDownloadLoader.Input & ClientName & ".json", McFolder & "versions\" & Inherit & "\" & Inherit & ".json") + End If + If Not File.Exists(McFolder & "versions\" & Inherit & "\" & Inherit & ".jar") Then + CopyFile(ClientDownloadLoader.Input & ClientName & ".jar", McFolder & "versions\" & Inherit & "\" & Inherit & ".jar") + End If + End SyncLock #End Region End Sub) With {.ProgressWeight = 0.1, .Show = False}) Loaders.Add(New LoaderTask(Of Boolean, Boolean)("安装 Mod 加载器(方式 A)", diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index 4b6b4c4..6cbaffa 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -41,7 +41,7 @@ End Sub '保存皮肤 - Private Sub BtnSkinSave_Click(sender As Object, e As RoutedEventArgs) Handles BtnSkinSave.Click + Public Sub BtnSkinSave_Click() Handles BtnSkinSave.Click Save(Loader) End Sub Public Shared Sub Save(Loader As LoaderTask(Of EqualableList(Of String), String)) @@ -121,7 +121,7 @@ End Sub '刷新缓存 - Private Sub RefreshClick(sender As MyMenuItem, e As EventArgs) Handles BtnSkinRefresh.Click + Public Sub RefreshClick() Handles BtnSkinRefresh.Click RefreshCache(Loader) End Sub ''' @@ -140,21 +140,20 @@ Else RunInThread(Sub() Try - Hint("正在刷新皮肤……") + Hint("正在刷新头像……") '清空缓存 Log("[Skin] 正在清空皮肤缓存") If Directory.Exists(PathTemp & "Cache\Skin") Then DeleteDirectory(PathTemp & "Cache\Skin") If Directory.Exists(PathTemp & "Cache\Uuid") Then DeleteDirectory(PathTemp & "Cache\Uuid") - IniClearCache(PathTemp & "Cache\Skin\IndexMojang.ini") IniClearCache(PathTemp & "Cache\Skin\IndexMs.ini") IniClearCache(PathTemp & "Cache\Skin\IndexNide.ini") IniClearCache(PathTemp & "Cache\Skin\IndexAuth.ini") IniClearCache(PathTemp & "Cache\Uuid\Mojang.ini") '刷新控件 - For Each SkinLoader In If(sender IsNot Nothing, {sender}, {PageLaunchLeft.SkinMojang, PageLaunchLeft.SkinLegacy, PageLaunchLeft.SkinMs}) + For Each SkinLoader In If(sender IsNot Nothing, {sender}, {PageLaunchLeft.SkinLegacy, PageLaunchLeft.SkinMs}) SkinLoader.WaitForExit(IsForceRestart:=True) Next - Hint("已刷新皮肤!", HintType.Finish) + Hint("已刷新头像!", HintType.Finish) Catch ex As Exception Log(ex, "刷新皮肤缓存失败", LogLevel.Msgbox) End Try @@ -165,15 +164,14 @@ ''' 在更换正版皮肤后,刷新正版皮肤。 ''' ''' 新的正版皮肤完整地址。 - Public Shared Sub ReloadCache(SkinAddress As String, IsMsLogin As Boolean) + Public Shared Sub ReloadCache(SkinAddress As String) RunInThread(Sub() Try '更新缓存 - Dim LoginType As String = If(IsMsLogin, "Ms", "Mojang") - WriteIni(PathTemp & "Cache\Skin\Index" & LoginType & ".ini", Setup.Get("Cache" & LoginType & "Uuid"), SkinAddress) - Log(String.Format("[Skin] 已写入皮肤地址缓存 {0} -> {1}", Setup.Get("Cache" & LoginType & "Uuid"), SkinAddress)) + WriteIni(PathTemp & "Cache\Skin\IndexMs.ini", Setup.Get("CacheMsUuid"), SkinAddress) + Log(String.Format("[Skin] 已写入皮肤地址缓存 {0} -> {1}", Setup.Get("CacheMsUuid"), SkinAddress)) '刷新控件 - For Each SkinLoader In If(IsMsLogin, {PageLaunchLeft.SkinMs, PageLaunchLeft.SkinLegacy}, {PageLaunchLeft.SkinMojang, PageLaunchLeft.SkinLegacy}) + For Each SkinLoader In {PageLaunchLeft.SkinMs, PageLaunchLeft.SkinLegacy} SkinLoader.WaitForExit(IsForceRestart:=True) Next '完成提示 @@ -198,7 +196,7 @@ End Set End Property Private IsChanging As Boolean = False - Private Sub BtnSkinCape_Click(sender As Object, e As RoutedEventArgs) Handles BtnSkinCape.Click + Public Sub BtnSkinCape_Click() Handles BtnSkinCape.Click '检查条件,获取新披风 If IsChanging Then Hint("正在更改披风中,请稍候!") diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml index 4a36097..488a381 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml @@ -33,7 +33,7 @@ - + @@ -48,12 +48,10 @@ - - + + LogoScale="0.85" Logo="M533.293176 788.841412a60.235294 60.235294 0 1 1 85.202824 85.202823l-42.616471 42.586353c-129.355294 129.385412-339.124706 129.385412-468.510117 0-129.385412-129.385412-129.385412-339.124706 0-468.510117l42.586353-42.616471a60.235294 60.235294 0 1 1 85.202823 85.202824l-42.61647 42.586352a210.823529 210.823529 0 1 0 298.164706 298.164706l42.586352-42.61647z m255.548236-255.548236l42.61647-42.586352a210.823529 210.823529 0 1 0-298.164706-298.164706l-42.586352 42.61647a60.235294 60.235294 0 1 1-85.202824-85.202823l42.616471-42.586353c129.355294-129.385412 339.124706-129.385412 468.510117 0 129.385412 129.385412 129.385412 339.124706 0 468.510117l-42.586353 42.616471a60.235294 60.235294 0 1 1-85.202823-85.202824zM192.542118 192.542118a60.235294 60.235294 0 0 1 85.202823 0l553.712941 553.712941a60.235294 60.235294 0 0 1-85.202823 85.202823L192.542118 277.744941a60.235294 60.235294 0 0 1 0-85.202823z" /> diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb index 705c102..f692003 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchLeft.xaml.vb @@ -67,7 +67,7 @@ '改变页面 Dim LoginType As McLoginType = Setup.Get("LoginType") - If LoginType = McLoginType.Legacy OrElse LoginType = McLoginType.Mojang OrElse LoginType = McLoginType.Ms Then CType(FindName("RadioLoginType" & LoginType), MyRadioButton).Checked = True + If LoginType = McLoginType.Legacy OrElse LoginType = McLoginType.Ms Then CType(FindName("RadioLoginType" & LoginType), MyRadioButton).Checked = True RefreshPage(False, False) AniControlEnabled -= 1 @@ -117,8 +117,6 @@ Private Enum PageType None - Mojang - MojangSkin Legacy Nide NideSkin @@ -134,12 +132,6 @@ Private Function PageGet(Type As PageType) Select Case Type - Case PageType.Mojang - If IsNothing(FrmLoginMojang) Then FrmLoginMojang = New PageLoginMojang - Return FrmLoginMojang - Case PageType.MojangSkin - If IsNothing(FrmLoginMojangSkin) Then FrmLoginMojangSkin = New PageLoginMojangSkin - Return FrmLoginMojangSkin Case PageType.Legacy If IsNothing(FrmLoginLegacy) Then FrmLoginLegacy = New PageLoginLegacy Return FrmLoginLegacy @@ -171,7 +163,7 @@ ''' 新页面的种类。 ''' 是否显示动画。 Private Function PageChange(Type As PageType, Anim As Boolean) - Dim PageNew As Object = FrmLoginMojang '初始化一个东西,避免在执行时出现异常导致雪崩 + Dim PageNew As Object = FrmLoginMs '初始化一个东西,避免在执行时出现异常导致雪崩 Try #Region "确定更改的页面实例并实例化" @@ -232,14 +224,7 @@ Select Case LoginPageType Case 0 '正版或离线 UnknownType: - If RadioLoginType1.Checked Then - If Setup.Get("CacheMojangAccess") = "" Then - Type = PageType.Mojang - Else - Type = PageType.MojangSkin - End If - Setup.Set("LoginType", McLoginType.Mojang) - ElseIf RadioLoginType5.Checked Then + If RadioLoginType5.Checked Then If Setup.Get("CacheMsAccess") = "" Then Type = PageType.Ms Else @@ -252,28 +237,19 @@ UnknownType: End If PanType.Visibility = Visibility.Visible PanTypeOne.Visibility = Visibility.Collapsed - RadioLoginType1.Visibility = Visibility.Visible RadioLoginType5.Visibility = Visibility.Visible RadioLoginType0.Visibility = Visibility.Visible Case 1 '仅正版 - If RadioLoginType1.Checked Then - If Setup.Get("CacheMojangAccess") = "" Then - Type = PageType.Mojang - Else - Type = PageType.MojangSkin - End If - Setup.Set("LoginType", McLoginType.Mojang) + If Setup.Get("CacheMsAccess") = "" Then + Type = PageType.Ms Else - If Setup.Get("CacheMsAccess") = "" Then - Type = PageType.Ms - Else - Type = PageType.MsSkin - End If - Setup.Set("LoginType", McLoginType.Ms) + Type = PageType.MsSkin End If - PanType.Visibility = Visibility.Visible - PanTypeOne.Visibility = Visibility.Collapsed - RadioLoginType1.Visibility = Visibility.Visible + Setup.Set("LoginType", McLoginType.Ms) + PanType.Visibility = Visibility.Collapsed + PanTypeOne.Visibility = Visibility.Visible + PathTypeOne.Data = (New GeometryConverter).ConvertFromString(Logo.IconButtonMs) + LabTypeOne.Text = "正版登录" RadioLoginType5.Visibility = Visibility.Visible RadioLoginType0.Visibility = Visibility.Collapsed Case 2 '仅离线 @@ -316,7 +292,7 @@ UnknownType: Dim Control As MyRadioButton = FindName("RadioLoginType" & Setup.Get("LoginType")) If Control IsNot Nothing Then Control.Checked = True End Sub - Private Sub RadioLoginType_Change(sender As Object, raiseByMouse As Boolean) Handles RadioLoginType0.Check, RadioLoginType1.Check, RadioLoginType5.Check + Private Sub RadioLoginType_Change(sender As Object, raiseByMouse As Boolean) Handles RadioLoginType0.Check, RadioLoginType5.Check If raiseByMouse Then RefreshPage(True, True) End Sub @@ -324,54 +300,6 @@ UnknownType: #Region "皮肤" - 'Mojang 正版皮肤 - Public Shared SkinMojang As New LoaderTask(Of EqualableList(Of String), String)("Loader Skin Mojang", AddressOf SkinMojangLoad, AddressOf SkinMojangInput, ThreadPriority.AboveNormal) - Private Shared Function SkinMojangInput() As EqualableList(Of String) - '获取名称 - Return New EqualableList(Of String) From {Setup.Get("CacheMojangName"), Setup.Get("CacheMojangUuid")} - End Function - Private Shared Sub SkinMojangLoad(Data As LoaderTask(Of EqualableList(Of String), String)) - '清空已有皮肤 - '如果在输入时清空皮肤,若输入内容一样则不会执行 Load 方法,导致皮肤不被加载 - RunInUi(Sub() If FrmLoginMojangSkin IsNot Nothing AndAlso FrmLoginMojangSkin.Skin IsNot Nothing Then FrmLoginMojangSkin.Skin.Clear()) - '获取 Url - Dim UserName As String = Data.Input(0) - Dim Uuid As String = Data.Input(1) - If UserName = "" Then - Data.Output = PathImage & "Skins/" & McSkinSex(McLoginLegacyUuid(UserName)) & ".png" - Log("[Minecraft] 获取正版皮肤失败,ID 为空") - GoTo Finish - End If - Try - Dim Result As String = McSkinGetAddress(Uuid, "Mojang") - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) - Result = McSkinDownload(Result) - If Data.IsAborted Then Throw New ThreadInterruptedException("当前任务已取消:" & UserName) - Data.Output = Result - Catch ex As Exception - If ex.GetType.Name = "ThreadInterruptedException" Then - Data.Output = "" - Exit Sub - ElseIf GetExceptionSummary(ex).Contains("429") Then - Data.Output = PathImage & "Skins/" & McSkinSex(McLoginLegacyUuid(UserName)) & ".png" - Log("[Minecraft] 获取正版皮肤失败(" & UserName & "):获取皮肤太过频繁,请 5 分钟后再试!", LogLevel.Hint) - ElseIf GetExceptionSummary(ex).Contains("未设置自定义皮肤") Then - Data.Output = PathImage & "Skins/" & McSkinSex(McLoginLegacyUuid(UserName)) & ".png" - Log("[Minecraft] 用户未设置自定义皮肤,跳过皮肤加载") - Else - Data.Output = PathImage & "Skins/" & McSkinSex(McLoginLegacyUuid(UserName)) & ".png" - Log(ex, "获取正版皮肤失败(" & UserName & ")", LogLevel.Hint) - End If - End Try -Finish: - '刷新显示 - If FrmLoginMojangSkin IsNot Nothing Then - RunInUi(AddressOf FrmLoginMojangSkin.Skin.Load) - ElseIf Not Data.IsAborted Then '如果已经中断,Input 也被清空,就不会再次刷新 - Data.Input = Nothing '清空输入,因为皮肤实际上没有被渲染,如果不清空切换到页面的 Start 会由于输入相同而不渲染 - End If - End Sub - '微软正版皮肤 Public Shared SkinMs As New LoaderTask(Of EqualableList(Of String), String)("Loader Skin Ms", AddressOf SkinMsLoad, AddressOf SkinMsInput, ThreadPriority.AboveNormal) Private Shared Function SkinMsInput() As EqualableList(Of String) @@ -592,7 +520,7 @@ Finish: '全部皮肤加载器 '需要放在其中元素的后面,否则会因为它提前被加载而莫名其妙变成 Nothing - Public Shared SkinLoaders As New List(Of LoaderTask(Of EqualableList(Of String), String)) From {SkinMojang, SkinMs, SkinLegacy, SkinNide, SkinAuth} + Public Shared SkinLoaders As New List(Of LoaderTask(Of EqualableList(Of String), String)) From {SkinMs, SkinLegacy, SkinNide, SkinAuth} #End Region @@ -713,10 +641,8 @@ ExitRefresh: Else LabLaunchingMethod.Text = "离线登录" End If - Case McLoginType.Mojang - LabLaunchingMethod.Text = "Mojang 正版登录" Case McLoginType.Ms - LabLaunchingMethod.Text = "微软正版登录" + LabLaunchingMethod.Text = "正版登录" Case McLoginType.Nide LabLaunchingMethod.Text = "统一通行证" Case McLoginType.Auth diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb index 11b9ba3..10c0ad2 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb @@ -99,10 +99,4 @@ Init() End Sub - Public Shared Sub StartMigration() - MyMsgBox("在迁移过程中,你可能需要设置你的档案信息,此时请注意让年龄大于 18 岁,否则可能导致无法登录!" & vbCrLf & - "在迁移完成后,请在上方选择 微软 登录方式而非 Mojang。", "迁移提示", "继续", ForceWait:=True) - OpenWebsite("https://www.minecraft.net/zh-hans/account-security") - End Sub - End Class diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojang.xaml b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojang.xaml deleted file mode 100644 index 6e9dc04..0000000 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojang.xaml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojang.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojang.xaml.vb deleted file mode 100644 index 7ee4d1f..0000000 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojang.xaml.vb +++ /dev/null @@ -1,84 +0,0 @@ -Public Class PageLoginMojang - - Private IsFirstLoad As Boolean = True - ''' - ''' 刷新页面显示的所有信息。 - ''' - Public Sub Reload(KeepInput As Boolean) - '记住密码 - CheckRemember.Checked = Setup.Get("LoginRemember") - If KeepInput AndAlso Not IsFirstLoad Then '避免第一次就以 KeepInput 的方式加载,导致文本框里没东西 - '保留输入,只刷新下拉框列表 - Dim Input As String = ComboName.Text - ComboName.ItemsSource = If(Setup.Get("LoginMojangEmail") = "", Nothing, Setup.Get("LoginMojangEmail").ToString.Split("¨")) - ComboName.Text = Input - Else - '不保留输入,刷新列表后自动选择第一项 - If Setup.Get("LoginMojangEmail") = "" Then - ComboName.ItemsSource = Nothing - Else - ComboName.ItemsSource = Setup.Get("LoginMojangEmail").ToString.Split("¨") - ComboName.Text = Setup.Get("LoginMojangEmail").ToString.Split("¨")(0) - If Setup.Get("LoginRemember") Then TextPass.Password = Setup.Get("LoginMojangPass").ToString.Split("¨")(0).Trim - End If - End If - IsFirstLoad = False - End Sub - ''' - ''' 获取当前页面的登录信息。 - ''' - Public Shared Function GetLoginData() As McLoginServer - If FrmLoginMojang Is Nothing Then - Return New McLoginServer(McLoginType.Mojang) With {.BaseUrl = "https://authserver.mojang.com", .Token = "Mojang", .UserName = "", .Password = "", .Type = McLoginType.Mojang, .Description = "Mojang 正版"} - Else - Return New McLoginServer(McLoginType.Mojang) With {.BaseUrl = "https://authserver.mojang.com", .Token = "Mojang", .UserName = If(FrmLoginMojang.ComboName.Text, "").Replace("¨", "").Trim(), .Password = If(FrmLoginMojang.TextPass.Password, "").Replace("¨", "").Trim(), .Type = McLoginType.Mojang, .Description = "Mojang 正版"} - End If - End Function - ''' - ''' 当前页面的登录信息是否有效。 - ''' - Public Shared Function IsVaild(LoginData As McLoginServer) As String - If LoginData.UserName = "" Then Return "邮箱不能为空!" - If Not LoginData.UserName.Contains("@") Then Return "邮箱格式错误!" - If LoginData.Password = "" Then Return "密码不能为空!" - Return "" - End Function - Public Function IsVaild() As String - Return IsVaild(GetLoginData()) - End Function - - '保存输入信息 - Private Sub ComboMojangName_TextChanged(sender As Object, e As TextChangedEventArgs) Handles ComboName.TextChanged - If sender.Text = "" Then TextPass.Password = "" - If AniControlEnabled = 0 Then Setup.Set("CacheMojangAccess", "") '迫使其不进行 Validate - End Sub - Private Sub TextMojangPass_PasswordChanged(sender As Object, e As RoutedEventArgs) Handles TextPass.PasswordChanged - If AniControlEnabled = 0 Then Setup.Set("CacheMojangAccess", "") - End Sub - Private Sub ComboMojangName_SelectionChanged(sender As MyComboBox, e As SelectionChangedEventArgs) Handles ComboName.SelectionChanged - If sender.SelectedIndex = -1 OrElse Not Setup.Get("LoginRemember") Then - TextPass.Password = "" - Else - TextPass.Password = Setup.Get("LoginMojangPass").ToString.Split("¨")(sender.SelectedIndex).Trim - End If - End Sub - Private Sub CheckRememberChange(sender As MyCheckBox, e As Object) Handles CheckRemember.Change - If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked) - End Sub - - '链接处理 - Private Sub InputChanged() Handles ComboName.TextChanged, TextPass.PasswordChanged - BtnLink.Content = If(ComboName.Text = "" AndAlso TextPass.Password = "", "购买正版", "找回密码") - End Sub - Private Sub BtnMojang_Click(sender As Object, e As EventArgs) Handles BtnLink.Click - If BtnLink.Content = "购买正版" Then - OpenWebsite("https://www.minecraft.net/zh-hans/store/checkout/minecraft-java-bedrock-edition-pc") - Else - OpenWebsite("https://www.minecraft.net/zh-hans/password/forgot") - End If - End Sub - Private Sub HintMigration_Click() Handles HintMigration.MouseLeftButtonUp - PageLaunchRight.StartMigration() - End Sub - -End Class diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojangSkin.xaml b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojangSkin.xaml deleted file mode 100644 index 2eb038f..0000000 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojangSkin.xaml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojangSkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojangSkin.xaml.vb deleted file mode 100644 index b1539c0..0000000 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMojangSkin.xaml.vb +++ /dev/null @@ -1,117 +0,0 @@ -Public Class PageLoginMojangSkin - - Public Sub New() - InitializeComponent() - Skin.Loader = PageLaunchLeft.SkinMojang - End Sub - Private Sub PageLoginLegacy_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded - Skin.Loader.Start() - End Sub - - ''' - ''' 刷新页面显示的所有信息。 - ''' - Public Sub Reload(KeepInput As Boolean) - TextName.Text = Setup.Get("CacheMojangName") - TextEmail.Text = Setup.Get("CacheMojangUsername") - TextEmail.Visibility = If(Setup.Get("UiLauncherEmail"), Visibility.Collapsed, Visibility.Visible) - '皮肤在 Loaded 加载 - End Sub - ''' - ''' 获取当前页面的登录信息。 - ''' - Public Shared Function GetLoginData() As McLoginServer - Return New McLoginServer(McLoginType.Mojang) With {.BaseUrl = "https://authserver.mojang.com", .Token = "Mojang", .UserName = Setup.Get("CacheMojangUsername"), .Password = Setup.Get("CacheMojangPass"), .Description = "Mojang 正版", .Type = McLoginType.Mojang} - End Function - - Private Sub PageLoginMojangSkin_MouseEnter(sender As Object, e As MouseEventArgs) Handles PanData.MouseEnter - AniStart({ - AaOpacity(BtnEdit, 1 - BtnEdit.Opacity, 80), - AaHeight(BtnEdit, 25.5 - BtnEdit.Height, 140,, New AniEaseOutFluent), - AaHeight(BtnEdit, -1.5, 50, 140, New AniEaseInFluent), - AaOpacity(BtnExit, 1 - BtnExit.Opacity, 80), - AaHeight(BtnExit, 25.5 - BtnExit.Height, 140,, New AniEaseOutFluent), - AaHeight(BtnExit, -1.5, 50, 140, New AniEaseInFluent) - }, "PageLoginMojangSkin Button") - End Sub - Private Sub PageLoginMojangSkin_MouseLeave(sender As Object, e As MouseEventArgs) Handles PanData.MouseLeave - AniStart({ - AaOpacity(BtnEdit, -BtnEdit.Opacity, 120,, New AniEaseOutFluent), - AaHeight(BtnEdit, 14 - BtnEdit.Height, 120,, New AniEaseInFluent), - AaOpacity(BtnExit, -BtnExit.Opacity, 120,, New AniEaseOutFluent), - AaHeight(BtnExit, 14 - BtnExit.Height, 120,, New AniEaseInFluent) - }, "PageLoginMojangSkin Button") - End Sub - - Private Sub BtnEdit_Click(sender As Object, e As EventArgs) Handles BtnEdit.Click - Select Case MyMsgBox("你希望通过哪种途径更改密码?" & vbCrLf & "首次通过个人档案修改密码可能需要验证你的密保问题。", "更改密码", "个人档案", "密保邮箱", "取消") - Case 1 - '个人档案 - OpenWebsite("https://www.minecraft.net/zh-hans/msaprofile") - Case 2 - '密保邮箱 - OpenWebsite("https://account.mojang.com/password") - Case 3 - '取消 - End Select - End Sub - Private Sub BtnExit_Click() Handles BtnExit.Click - Setup.Set("CacheMojangAccess", "") - FrmLaunchLeft.RefreshPage(False, True) - End Sub - - Private Sub Skin_Click(sender As Object, e As MouseButtonEventArgs) Handles Skin.Click - If McLoginLoader.State = LoadState.Failed Then - Hint("登录失败,无法更改皮肤!", HintType.Critical) - Exit Sub - End If - Dim SkinInfo As McSkinInfo = McSkinSelect() - If Not SkinInfo.IsVaild Then Exit Sub - Hint("正在更改皮肤……") - RunInNewThread(Async Sub() - Try - - If McLoginLoader.State = LoadState.Loading Then McLoginLoader.WaitForExit() '等待登录结束 - Dim AccessToken As String = Setup.Get("CacheMojangAccess") - Dim Uuid As String = Setup.Get("CacheMojangUuid") - - Dim Client As New Net.Http.HttpClient With {.Timeout = New TimeSpan(0, 0, 10)} - Client.DefaultRequestHeaders.Authorization = New Net.Http.Headers.AuthenticationHeaderValue("Bearer", AccessToken) - Client.DefaultRequestHeaders.Accept.Add(New Net.Http.Headers.MediaTypeWithQualityHeaderValue("*/*")) - Client.DefaultRequestHeaders.UserAgent.Add(New Net.Http.Headers.ProductInfoHeaderValue("MojangSharp", "0.1")) - Dim Contents As New Net.Http.MultipartFormDataContent From { - {New Net.Http.StringContent(If(SkinInfo.IsSlim, "slim", "")), "model"}, - {New Net.Http.ByteArrayContent(File.ReadAllBytes(SkinInfo.LocalFile)), "file", GetFileNameFromPath(SkinInfo.LocalFile)} - } - Dim Result As String = Await (Await Client.PutAsync(New Uri("https://api.mojang.com/user/profile/" & Uuid & "/skin"), Contents)).Content.ReadAsStringAsync - If RegexCheck(Result, "^[0-9a-f]{59,64}$") Then - MySkin.ReloadCache("http://textures.minecraft.net/texture/" & Result, False) - ElseIf Result.ToLower.Contains("ip not secured") Then - If MyMsgBox("首次操作需要在官网验证密保问题。" & vbCrLf & "验证完成后,你即可使用 PCL 更改皮肤,且无需再次验证。", "验证密保问题", "开始验证", "取消") = 1 Then - OpenWebsite("https://www.minecraft.net/zh-hans/profile/skin") - End If - ElseIf Result.Contains("request requires user authentication") Then - Hint("正在重新登录,请稍后再次尝试更改皮肤!") - RunInUi(Sub() - BtnExit_Click() - If String.IsNullOrEmpty(McLoginAble()) Then McLoginLoader.Start() - End Sub) - ElseIf Result.Contains("""errorMessage""") Then - Hint("更改皮肤失败:" & GetJson(Result)("errorMessage"), HintType.Critical) - Else - Throw New Exception("未知错误(" & Result & ")") - End If - Catch ex As Exception - If ex.GetType.Equals(GetType(Tasks.TaskCanceledException)) Then - Hint("更改皮肤失败:与 Mojang 皮肤服务器的连接超时,请检查你的网络是否通畅!", HintType.Critical) - Else - Log(ex, "更改皮肤失败", LogLevel.Hint) - End If - End Try - End Sub, "Mojang Skin Upload") - End Sub - Private Sub HintMigration_Click() Handles HintMigration.MouseLeftButtonUp - PageLaunchRight.StartMigration() - End Sub - -End Class diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml index 86b4386..00c01a2 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml @@ -6,11 +6,15 @@ xmlns:local="clr-namespace:PCL" mc:Ignorable="d" d:DesignWidth="302.4" Margin="0,0,0,-2"> - - - + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb index e3d0b79..fb52af4 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMs.xaml.vb @@ -16,7 +16,7 @@ ''' Public Shared Function IsVaild(LoginData As McLoginMs) As String If LoginData.OAuthRefreshToken = "" Then - Return "请在登录账号后再继续!" + Return "请在登录账号后再启动游戏!" Else Return "" End If @@ -61,5 +61,10 @@ End Try End Sub, "Ms Login") End Sub + '账号迁移入口 + Private Sub BtnMigration_Click(sender As Object, e As EventArgs) Handles BtnMigration.Click + MyMsgBox("在迁移过程中,你可能需要设置你的档案信息,此时请注意让年龄大于 18 岁,否则可能导致无法登录!", "迁移提示", "继续", ForceWait:=True) + OpenWebsite("https://www.minecraft.net/zh-hans/account-security") + End Sub End Class diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml index 35a0521..7c24511 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml @@ -4,21 +4,44 @@ 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="297.6" Margin="0,19,0,5"> - - - - - - + mc:Ignorable="d" d:DesignWidth="297.6" Margin="0,60,0,5"> + - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb index bac4073..a70bbf3 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginMsSkin.xaml.vb @@ -26,28 +26,29 @@ End If End Function - Private Sub PageLoginMsSkin_MouseEnter(sender As Object, e As MouseEventArgs) Handles PanData.MouseEnter - AniStart({ - AaOpacity(BtnEdit, 1 - BtnEdit.Opacity, 80), - AaHeight(BtnEdit, 25.5 - BtnEdit.Height, 140,, New AniEaseOutFluent), - AaHeight(BtnEdit, -1.5, 50, 140, New AniEaseInFluent), - AaOpacity(BtnExit, 1 - BtnExit.Opacity, 80), - AaHeight(BtnExit, 25.5 - BtnExit.Height, 140,, New AniEaseOutFluent), - AaHeight(BtnExit, -1.5, 50, 140, New AniEaseInFluent) - }, "PageLoginMsSkin Button") +#Region "下边栏其他内容" + + '显示/隐藏控制 + Private Sub ShowPanel(sender As Object, e As MouseEventArgs) Handles PanData.MouseEnter + AniStart(AaOpacity(PanButtons, 1 - PanButtons.Opacity, 120), "PageLoginMsSkin Button") End Sub - Private Sub PageLoginMsSkin_MouseLeave(sender As Object, e As MouseEventArgs) Handles PanData.MouseLeave - AniStart({ - AaOpacity(BtnEdit, -BtnEdit.Opacity, 120,, New AniEaseOutFluent), - AaHeight(BtnEdit, 14 - BtnEdit.Height, 120,, New AniEaseInFluent), - AaOpacity(BtnExit, -BtnExit.Opacity, 120,, New AniEaseOutFluent), - AaHeight(BtnExit, 14 - BtnExit.Height, 120,, New AniEaseInFluent) - }, "PageLoginMsSkin Button") + Public Sub HidePanel() Handles PanData.MouseLeave + If BtnEdit.ContextMenu.IsOpen OrElse BtnSkin.ContextMenu.IsOpen OrElse PanData.IsMouseOver Then Exit Sub + AniStart(AaOpacity(PanButtons, -PanButtons.Opacity, 120), "PageLoginMsSkin Button") End Sub + '修改账号信息 Private Sub BtnEdit_Click(sender As Object, e As EventArgs) Handles BtnEdit.Click - OpenWebsite("https://account.microsoft.com/security") + BtnEdit.ContextMenu.IsOpen = True End Sub + Public Sub BtnEditPassword_Click(sender As Object, e As RoutedEventArgs) + OpenWebsite("https://account.live.com/password/Change") + End Sub + Public Sub BtnEditName_Click(sender As Object, e As RoutedEventArgs) + OpenWebsite("https://www.minecraft.net/en-us/msaprofile/mygames/editprofile") + End Sub + + '退出登录 Private Sub BtnExit_Click() Handles BtnExit.Click Setup.Set("CacheMsOAuthRefresh", "") Setup.Set("CacheMsAccess", "") @@ -58,8 +59,18 @@ FrmLaunchLeft.RefreshPage(False, True) End Sub +#End Region + +#Region "皮肤/披风" + + '展开 + Private Sub BtnSkin_Click(sender As Object, e As RoutedEventArgs) Handles BtnSkin.Click + BtnSkin.ContextMenu.IsOpen = True + End Sub + + '修改皮肤 Private IsChanging As Boolean = False - Private Sub Skin_Click(sender As Object, e As MouseButtonEventArgs) Handles Skin.Click + Public Sub BtnSkinEdit_Click(sender As Object, e As RoutedEventArgs) '检查条件,获取新皮肤 If IsChanging Then Hint("正在更改皮肤中,请稍候!") @@ -103,7 +114,7 @@ Retry: Dim ResultJson As JObject = GetJson(Result) For Each Skin As JObject In ResultJson("skins") If Skin("state").ToString = "ACTIVE" Then - MySkin.ReloadCache(Skin("url"), True) + MySkin.ReloadCache(Skin("url")) Exit Sub End If Next @@ -120,4 +131,21 @@ Retry: End Sub, "Ms Skin Upload") End Sub + '保存皮肤 + Public Sub BtnSkinSave_Click(sender As Object, e As RoutedEventArgs) + Skin.BtnSkinSave_Click() + End Sub + + '刷新头像 + Public Sub BtnSkinRefresh_Click(sender As Object, e As RoutedEventArgs) + Skin.RefreshClick() + End Sub + + '修改披风 + Public Sub BtnSkinCape_Click(sender As Object, e As RoutedEventArgs) + Skin.BtnSkinCape_Click() + End Sub + +#End Region + End Class diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb index d360428..4059675 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionLeft.xaml.vb @@ -7,11 +7,11 @@ Public Sub RefreshModDisabled() Handles Me.Loaded If Version IsNot Nothing AndAlso Version.Modable Then - ItemMod.Height = 36 - ItemModDisabled.Height = 0 + ItemMod.Visibility = Visibility.Visible + ItemModDisabled.Visibility = Visibility.Collapsed Else - ItemMod.Height = 0 - ItemModDisabled.Height = 36 + ItemMod.Visibility = Visibility.Collapsed + ItemModDisabled.Visibility = Visibility.Visible End If End Sub diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 9e2f1bb..ac4d2e2 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -313,12 +313,6 @@ PageLoginLegacy.xaml - - PageLoginMojang.xaml - - - PageLoginMojangSkin.xaml - PageSelectRight.xaml @@ -570,14 +564,6 @@ Designer MSBuild:Compile - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - MSBuild:Compile Designer