diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index 568af5a..b3e296c 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -96,6 +96,12 @@ Public Class Application End If '动态 DLL 调用 AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf AssemblyResolve + SetDllDirectory(Path & "PCL\") + If Is32BitSystem Then + File.WriteAllBytes(Path & "PCL\libwebp.dll", GetResources("libwebp32")) + Else + File.WriteAllBytes(Path & "PCL\libwebp.dll", GetResources("libwebp64")) + End If '日志初始化 LogStart() '添加日志 @@ -171,9 +177,11 @@ Public Class Application Private Shared AssemblyNAudio As Assembly Private Shared AssemblyJson As Assembly Private Shared AssemblyDialog As Assembly + Private Shared AssemblyWebp As Assembly Private Shared ReadOnly AssemblyNAudioLock As New Object Private Shared ReadOnly AssemblyJsonLock As New Object Private Shared ReadOnly AssemblyDialogLock As New Object + Private Shared ReadOnly AssemblyWebpLock As New Object Public Shared Function AssemblyResolve(sender As Object, args As ResolveEventArgs) As Assembly If args.Name.StartsWithF("NAudio") Then SyncLock AssemblyNAudioLock @@ -199,6 +207,14 @@ Public Class Application End If Return AssemblyDialog End SyncLock + ElseIf args.Name.StartsWithF("Imazen.WebP") Then + SyncLock AssemblyWebpLock + If AssemblyWebp Is Nothing Then + Log("[Start] 加载 DLL:Imazen.WebP") + AssemblyWebp = Assembly.Load(GetResources("WebP")) + End If + Return AssemblyWebp + End SyncLock Else Return Nothing End If diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index ee69501..e57bc96 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -10,6 +10,16 @@ Public Class FormMain Dim FeatureList As New List(Of KeyValuePair(Of Integer, String)) '统计更新日志条目 #If BETA Then + If LastVersion < 336 Then 'Release 2.8.6 + FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "下载 Mod 时会使用 MCIM 国内镜像源")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "Mod 管理页面允许筛选可更新/启用/禁用的 Mod")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "打开 PCL 时会自动安装同目录下的 modpack.zip")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "爱发电域名迁移至 afdian.com")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复 1.20.1+ 离线登录使用正版皮肤时无法保存游戏的 Bug")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复安装的 1.14~1.15 Forge+OptiFine 无法进入世界的 Bug")) + FeatureCount += 19 + BugCount += 24 + End If If LastVersion < 332 Then 'Release 2.8.3 If LastVersion = 330 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复部分玩家无法启动 MC 的 Bug")) End If @@ -124,6 +134,9 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- + If LastVersion < 335 Then 'Snapshot 2.8.6 + BugCount += 2 + End If If LastVersion < 334 Then 'Snapshot 2.8.5 FeatureList.Add(New KeyValuePair(Of Integer, String)(4, "Mod 管理页面允许筛选可更新/启用/禁用的 Mod")) If LastVersion = 333 Then diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index 2bad9a6..4538e22 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -11,13 +11,13 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.8.5" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.8.5." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.8.6" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.8.6." & VersionBranchCode '标准格式的四段式版本号 Public Const CommitHash As String = "" 'Commit Hash #If BETA Then - Public Const VersionCode As Integer = 332 'Release + Public Const VersionCode As Integer = 336 'Release #Else - Public Const VersionCode As Integer = 334 'Snapshot + Public Const VersionCode As Integer = 335 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index c614d63..26cd470 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -506,6 +506,7 @@ NextInner: End If '尝试登录 Dim OAuthTokens As String() + Dim ClientId As String = "" If Input.OAuthRefreshToken = "" Then '无 RefreshToken Relogin: @@ -513,10 +514,10 @@ Relogin: If OAuthCode = "Cancel" Then Exit Sub If Data.IsAborted Then Throw New ThreadInterruptedException Data.Progress = 0.2 - OAuthTokens = MsLoginStep2(OAuthCode, False) + OAuthTokens = MsLoginStep2(OAuthCode, False, ClientId) Else '有 RefreshToken - OAuthTokens = MsLoginStep2(Input.OAuthRefreshToken, True) + OAuthTokens = MsLoginStep2(Input.OAuthRefreshToken, True, ClientId) End If '要求重新打开登录网页认证 If OAuthTokens(0) = "Cancel" Then Exit Sub @@ -837,39 +838,59 @@ LoginFinish: Return RegexSeek(Result, "(?<=code\=)[^&]+") End If End Function + '微软登录步骤 2:从 OAuth Code 或 OAuth RefreshToken 获取 {OAuth AccessToken, OAuth RefreshToken} - Private Function MsLoginStep2(Code As String, IsRefresh As Boolean) As String() + Private Function MsLoginStep2(Code As String, IsRefresh As Boolean, ClientId As String, Optional ExpiresIn As String = "900") As String() McLaunchLog("开始微软登录步骤 2(" & If(IsRefresh, "", "非") & "刷新登录)") Dim Request As String If IsRefresh Then - Request = "client_id=00000000402b5328" & "&" & + Request = "grant_type=refresh_token" & "&" & + "client_id=" & ClientId & "&" & + "device_code=" & Code & "&" & "refresh_token=" & Uri.EscapeDataString(Code) & "&" & - "grant_type=refresh_token" & "&" & - "redirect_uri=" & Uri.EscapeDataString("https://login.live.com/oauth20_desktop.srf") & "&" & - "scope=" & Uri.EscapeDataString("service::user.auth.xboxlive.com::MBI_SSL") + "scope=XboxLive.signin%20offline_access" Else - Request = "client_id=00000000402b5328" & "&" & - "code=" & Uri.EscapeDataString(Code) & "&" & - "grant_type=authorization_code" & "&" & - "redirect_uri=" & Uri.EscapeDataString("https://login.live.com/oauth20_desktop.srf") & "&" & - "scope=" & Uri.EscapeDataString("service::user.auth.xboxlive.com::MBI_SSL") + Request = "grant_type=urn:ietf:params:oauth:grant-type:device_code" & "&" & + "client_id=" & ClientId & "&" & + "device_code=" & Code & "&" & + "scope=XboxLive.signin%20offline_access" End If Dim Result As String - Try - Result = NetRequestMulty("https://login.live.com/oauth20_token.srf", "POST", Request, "application/x-www-form-urlencoded", 2) - Catch ex As Exception - If ex.Message.Contains("must sign in again") OrElse ex.Message.Contains("invalid_grant") Then '#269 - Return {"Relogin", ""} - Else - Throw + Dim stopwatch As Stopwatch = Stopwatch.StartNew() + + While stopwatch.Elapsed < TimeSpan.FromSeconds(ExpiresIn) + Try + Result = NetRequestMulty("https://login.microsoftonline.com/consumers/oauth2/v2.0/token", "POST", Request, "application/x-www-form-urlencoded", 2) + Catch ex As Exception + If ex.Message.Contains("must sign in again") OrElse ex.Message.Contains("invalid_grant") Then '#269 + Return {"Relogin", ""} + ElseIf ex.Message.Contains("authorization_declined") Then + Hint("你拒绝了 PCL2 的访问权限申请,验证过程被中断!") + Return {"Cancel", ""} + ElseIf ex.Message.Contains("expired_token") Then + Hint("Token 已过期,请尝试重新验证!") + Exit While + ElseIf ex.Message.Contains("AADSTS70016") Then + Continue While + Else + Throw + End If + End Try + + If Result IsNot Nothing Then + Dim ResultJson As JObject = GetJson(Result) + Dim AccessToken As String = ResultJson("access_token").ToString + Dim RefreshToken As String = ResultJson("refresh_token").ToString + Return {AccessToken, RefreshToken} End If - End Try + + Thread.Sleep(1000) + End While + + Hint("验证超时,请尝试重新验证!") + Return {"Cancel", ""} - Dim ResultJson As JObject = GetJson(Result) - Dim AccessToken As String = ResultJson("access_token").ToString - Dim RefreshToken As String = ResultJson("refresh_token").ToString - Return {AccessToken, RefreshToken} End Function ''微软登录步骤 1:获取 DeviceCode 并显示验证提示 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 27b9f87..4b82a94 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -260,7 +260,7 @@ Retry: '获取 Mod 下载信息 ModDownloadLoaders.Add(New LoaderTask(Of Integer, JArray)("获取 Mod 下载信息", Sub(Task As LoaderTask(Of Integer, JArray)) - Task.Output = GetJson(NetRequestRetry("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(ModList, ",") & "]}", "application/json"))("data") + Task.Output = GetJson(DlModRequest("https://api.curseforge.com/v1/mods/files", "POST", "{""fileIds"": [" & Join(ModList, ",") & "]}", "application/json"))("data") '如果文件已被删除,则 API 会跳过那一项 If ModList.Count > Task.Output.Count Then Throw New Exception("整合包所需要的部分 Mod 版本已被 Mod 作者删除,因此无法完成整合包安装,请联系整合包作者更新整合包中的 Mod 版本") End Sub) With {.ProgressWeight = ModList.Count / 10}) '每 10 Mod 需要 1s diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb b/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb index 6bf0f72..ee52b36 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/MyCompItem.xaml.vb @@ -18,9 +18,6 @@ '网络图片 If File.Exists(FileAddress) Then PathLogo.Source = New MyBitmap(FileAddress) - ElseIf _Logo.EndsWithF(".webp", True) Then 'Modrinth 林业 Mod 使用了不支持的 WebP 格式 Logo - Log($"[Comp] 发现不支持的 WebP 格式图标,已更改为默认图标:{_Logo}") - PathLogo.Source = New MyBitmap(PathImage & "Icons/NoIcon.png") Else PathLogo.Source = New MyBitmap(PathImage & "Icons/NoIcon.png") RunInNewThread(Sub() LogoLoader(FileAddress), "Comp Logo Loader " & Uuid & "#", ThreadPriority.BelowNormal) @@ -58,6 +55,12 @@ RetryStart: End If '下载图片 NetDownload(Url, LocalFileAddress & DownloadEnd, True) + If Url.EndsWithF("webp") Then + Log($"[Comp] Webp 格式转换:{LocalFileAddress}") + Dim dec = New Imazen.WebP.SimpleDecoder() + Dim picFile = File.ReadAllBytes(LocalFileAddress & DownloadEnd) + dec.DecodeFromBytes(picFile, picFile.Length).Save(LocalFileAddress & DownloadEnd) + End If Dim LoadError As Exception = Nothing RunInUiWait( Sub() diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb b/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb index 016f81a..a623f04 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb @@ -20,9 +20,6 @@ Public Class MyLocalModItem '网络图片 If File.Exists(FileAddress) Then PathLogo.Source = New MyBitmap(FileAddress) - ElseIf _Logo.EndsWithF(".webp", True) Then 'Modrinth 林业 Mod 使用了不支持的 WebP 格式 Logo - Log($"[LocalModItem] 发现不支持的 WebP 格式图标,已更改为默认图标:{_Logo}") - PathLogo.Source = New MyBitmap(PathImage & "Icons/NoIcon.png") Else PathLogo.Source = New MyBitmap(PathImage & "Icons/NoIcon.png") RunInNewThread(Sub() LogoLoader(FileAddress), "Comp Logo Loader " & Uuid & "#", ThreadPriority.BelowNormal) @@ -60,6 +57,12 @@ RetryStart: End If '下载图片 NetDownload(Url, LocalFileAddress & DownloadEnd, True) + If Url.EndsWithF("webp") Then + Log($"[Comp] Webp 格式转换:{LocalFileAddress}") + Dim dec = New Imazen.WebP.SimpleDecoder() + Dim picFile = File.ReadAllBytes(LocalFileAddress & DownloadEnd) + dec.DecodeFromBytes(picFile, picFile.Length).Save(LocalFileAddress & DownloadEnd) + End If Dim LoadError As Exception = Nothing RunInUiWait( Sub() diff --git a/Plain Craft Launcher 2/Modules/ModMain.vb b/Plain Craft Launcher 2/Modules/ModMain.vb index a971886..2136213 100644 --- a/Plain Craft Launcher 2/Modules/ModMain.vb +++ b/Plain Craft Launcher 2/Modules/ModMain.vb @@ -798,6 +798,8 @@ NextFile: Public Declare Function SetForegroundWindow Lib "user32" (hWnd As IntPtr) As Integer Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (hWnd As IntPtr, msg As UInteger, wParam As Long, lParam As Long) As Boolean + Public Declare Function SetDllDirectory Lib "kernel32" Alias "SetDllDirectoryA" (lpPathName As String) As Boolean + #End Region Public DragControl = Nothing diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index 1f07bf5..205f3ba 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/My Project/Resources.Designer.vb b/Plain Craft Launcher 2/My Project/Resources.Designer.vb index 033f910..990f9b4 100644 --- a/Plain Craft Launcher 2/My Project/Resources.Designer.vb +++ b/Plain Craft Launcher 2/My Project/Resources.Designer.vb @@ -120,6 +120,26 @@ Namespace My.Resources End Get End Property + ''' + ''' 查找 System.Byte[] 类型的本地化资源。 + ''' + Friend ReadOnly Property libwebp32() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("libwebp32", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + + ''' + ''' 查找 System.Byte[] 类型的本地化资源。 + ''' + Friend ReadOnly Property libwebp64() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("libwebp64", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + ''' ''' 查找 System.Byte[] 类型的本地化资源。 ''' @@ -149,5 +169,15 @@ Namespace My.Resources Return CType(obj,Byte()) End Get End Property + + ''' + ''' 查找 System.Byte[] 类型的本地化资源。 + ''' + Friend ReadOnly Property WebP() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("WebP", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property End Module End Namespace diff --git a/Plain Craft Launcher 2/My Project/Resources.resx b/Plain Craft Launcher 2/My Project/Resources.resx index 66663f3..d15494b 100644 --- a/Plain Craft Launcher 2/My Project/Resources.resx +++ b/Plain Craft Launcher 2/My Project/Resources.resx @@ -136,6 +136,12 @@ ..\Resources\Newtonsoft.Json.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\libwebp32.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\libwebp64.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\Resources\ModData.txt;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -145,4 +151,7 @@ ..\Resources\transformer.jar;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\Imazen.WebP.dll;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml index f693f70..0398d5e 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml @@ -104,91 +104,81 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb index 1e335a0..468908d 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/ModSetup.vb @@ -86,7 +86,7 @@ {"LaunchArgumentWindowHeight", New SetupEntry(480)}, {"LaunchArgumentWindowType", New SetupEntry(1)}, {"LaunchArgumentRam", New SetupEntry(False, Source:=SetupSource.Registry)}, - {"LaunchAdvanceJvm", New SetupEntry("-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true")}, + {"LaunchAdvanceJvm", New SetupEntry("-XX:+UseG1GC -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Djdk.lang.Process.allowAmbiguousCommands=true -Dfml.ignoreInvalidMinecraftCertificates=True -Dfml.ignorePatchDiscrepancies=True -Dlog4j2.formatMsgNoLookups=true")}, {"LaunchAdvanceGame", New SetupEntry("")}, {"LaunchAdvanceRun", New SetupEntry("")}, {"LaunchAdvanceRunWait", New SetupEntry(True)}, diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb index 0bf1a50..a7a81f4 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb @@ -647,6 +647,7 @@ SelectedMods.Remove(ModEntity.RawFileName) '更改 Loader 和 UI 中的列表 McModLoader.Output.Remove(ModEntity) + SearchResult?.Remove(ModEntity) ModItems.Remove(ModEntity.RawFileName) Dim IndexOfUi As Integer = PanList.Children.IndexOf(PanList.Children.OfType(Of MyLocalModItem).FirstOrDefault(Function(i) i.Entry.Equals(ModEntity))) If IndexOfUi >= 0 Then PanList.Children.RemoveAt(IndexOfUi) diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 8246a85..bc74b16 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -140,6 +140,10 @@ false + + False + Resources\Imazen.WebP.dll + False False @@ -185,9 +189,6 @@ MyIconTextButton.xaml - - - @@ -472,7 +473,6 @@ FormMain.xaml Code - MSBuild:Compile Designer @@ -927,7 +927,9 @@ - + + + diff --git a/Plain Craft Launcher 2/Resources/Imazen.WebP.dll b/Plain Craft Launcher 2/Resources/Imazen.WebP.dll new file mode 100644 index 0000000..ac7cf07 Binary files /dev/null and b/Plain Craft Launcher 2/Resources/Imazen.WebP.dll differ diff --git a/Plain Craft Launcher 2/Resources/libwebp32.dll b/Plain Craft Launcher 2/Resources/libwebp32.dll new file mode 100644 index 0000000..9ebce90 Binary files /dev/null and b/Plain Craft Launcher 2/Resources/libwebp32.dll differ diff --git a/Plain Craft Launcher 2/Resources/libwebp64.dll b/Plain Craft Launcher 2/Resources/libwebp64.dll new file mode 100644 index 0000000..d3e2d47 Binary files /dev/null and b/Plain Craft Launcher 2/Resources/libwebp64.dll differ diff --git a/最新正式版.zip b/最新正式版.zip index f4ca635..252209c 100644 Binary files a/最新正式版.zip and b/最新正式版.zip differ