From 70636a9a7757a79977e1f2e7e38760af52f232ac 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: Sat, 25 Jan 2025 03:00:46 +0800 Subject: [PATCH] 2.8.13 --- Plain Craft Launcher 2/App.config | 4 +- Plain Craft Launcher 2/FormMain.xaml.vb | 7 + .../Modules/Base/ModBase.vb | 11 +- Plain Craft Launcher 2/Modules/Base/ModNet.vb | 5 +- .../Modules/Minecraft/ModComp.vb | 31 +-- .../Modules/Minecraft/ModDownload.vb | 156 ++++++------- .../Modules/Minecraft/ModLaunch.vb | 25 ++- .../Modules/Minecraft/ModMinecraft.vb | 18 +- .../Modules/Minecraft/ModModpack.vb | 14 +- .../Modules/Minecraft/MyLocalModItem.xaml.vb | 28 ++- Plain Craft Launcher 2/Modules/ModDevelop.vb | 5 + .../My Project/AssemblyInfo.vb | 4 +- .../Pages/PageDownload/ModDownloadLib.vb | 2 +- .../PageDownload/PageDownloadCompDetail.xaml | 1 - .../Pages/PageLaunch/MySkin.xaml.vb | 2 +- .../Pages/PageLaunch/PageLaunchRight.xaml.vb | 6 +- .../Pages/PageLaunch/PageLoginLegacy.xaml.vb | 5 + .../Pages/PageOther/PageOtherAbout.xaml | 211 ++++++++++-------- .../Pages/PageSetup/PageSetupSystem.xaml | 16 +- .../Pages/PageSetup/PageSetupSystem.xaml.vb | 4 +- .../Pages/PageSetup/PageSetupUI.xaml | 2 +- .../Pages/PageSetup/PageSetupUI.xaml.vb | 4 +- .../Pages/PageVersion/PageVersionMod.xaml.vb | 6 +- Plain Craft Launcher 2/Resources/Help.zip | Bin 82808 -> 82821 bytes Plain Craft Launcher 2/app.manifest | 15 +- 25 files changed, 303 insertions(+), 279 deletions(-) diff --git a/Plain Craft Launcher 2/App.config b/Plain Craft Launcher 2/App.config index 57f4dae..37eb10c 100644 --- a/Plain Craft Launcher 2/App.config +++ b/Plain Craft Launcher 2/App.config @@ -9,8 +9,8 @@ - - + + diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 9f6b2f2..69191e1 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -90,6 +90,13 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- + If LastVersion < 346 Then 'Snapshot 2.8.13 + FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化网络环境不佳时,Mod、整合包页面的加载速度")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复部分电脑无法打开程序的 Bug")) + FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复可能无法识别、更新 Mod 的 Bug")) + FeatureCount += 6 + BugCount += 14 + End If If LastVersion < 346 Then 'Snapshot 2.8.12 If LastVersion = 345 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(1, "修复帮助页面报错的 Bug")) End If diff --git a/Plain Craft Launcher 2/Modules/Base/ModBase.vb b/Plain Craft Launcher 2/Modules/Base/ModBase.vb index e35880f..2f92233 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModBase.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModBase.vb @@ -12,13 +12,13 @@ Public Module ModBase #Region "声明" '下列版本信息由更新器自动修改 - Public Const VersionBaseName As String = "2.8.12" '不含分支前缀的显示用版本名 - Public Const VersionStandardCode As String = "2.8.12." & VersionBranchCode '标准格式的四段式版本号 + Public Const VersionBaseName As String = "2.8.13" '不含分支前缀的显示用版本名 + Public Const VersionStandardCode As String = "2.8.13." & VersionBranchCode '标准格式的四段式版本号 Public Const CommitHash As String = "" 'Commit Hash,由 GitHub Workflow 自动替换 #If BETA Then Public Const VersionCode As Integer = 347 'Release #Else - Public Const VersionCode As Integer = 346 'Snapshot + Public Const VersionCode As Integer = 348 'Snapshot #End If '自动生成的版本信息 Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName @@ -1975,13 +1975,12 @@ RetryDir: End Function ''' - ''' 判断当前系统语言是否为中文(中国大陆)。 + ''' 判断当前系统语言是否为 zh-CN。 ''' Public Function IsSystemLanguageChinese() As Boolean Return CultureInfo.CurrentCulture.Name = "zh-CN" OrElse CultureInfo.CurrentUICulture.Name = "zh-CN" End Function - Private Uuid As Integer = 1 Private UuidLock As Object ''' @@ -2865,4 +2864,4 @@ Retry: #End Region -End Module +End Module \ No newline at end of file diff --git a/Plain Craft Launcher 2/Modules/Base/ModNet.vb b/Plain Craft Launcher 2/Modules/Base/ModNet.vb index f046d34..f482a8a 100644 --- a/Plain Craft Launcher 2/Modules/Base/ModNet.vb +++ b/Plain Craft Launcher 2/Modules/Base/ModNet.vb @@ -1819,6 +1819,7 @@ Retry: Private Sub RefreshStat() Try Dim DeltaTime As Long = GetTimeTick() - RefreshStatLast + If DeltaTime = 0 Then Return RefreshStatLast += DeltaTime #Region "刷新整体速度" '计算瞬时速度 @@ -1884,7 +1885,7 @@ Retry: For Each File As NetFile In WaitingFiles If NetTaskThreadCount >= NetTaskThreadLimit Then Continue While '最大线程数检查 Dim NewThread = File.TryBeginThread() - If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(70) '减少 BMCLAPI 请求频率,避免 Too Many Requests + If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(100) '减少 BMCLAPI 请求频率,避免 Too Many Requests Next '为进行中的文件追加线程 If Speed >= NetTaskSpeedLimitLow Then Continue While '下载速度足够,无需新增 @@ -1904,7 +1905,7 @@ Retry: '新增线程 If PreparingCount > DownloadingCount Then Continue For '准备中的线程已多于下载中的线程,不再新增 Dim NewThread = File.TryBeginThread() - If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(70) '减少 BMCLAPI 请求频率,避免 Too Many Requests + If NewThread IsNot Nothing AndAlso NewThread.Source.Url.Contains("bmclapi") Then Thread.Sleep(100) '减少 BMCLAPI 请求频率,避免 Too Many Requests Next End While Catch ex As Exception diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb index 6723976..ebc9313 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModComp.vb @@ -434,11 +434,8 @@ Public Function ToCompItem(ShowMcVersionDesc As Boolean, ShowLoaderDesc As Boolean) As MyCompItem '获取版本描述 Dim GameVersionDescription As String - Dim AllSnapshot As Boolean = GameVersions.All(Function(v) RegexCheck(v, "[0-9]{2}w[0-9]{2}[a-z]{1}")) - If AllSnapshot Then - GameVersionDescription = "仅快照版本" - ElseIf GameVersions Is Nothing OrElse Not GameVersions.Any() Then - GameVersionDescription = "未知" + If GameVersions Is Nothing OrElse Not GameVersions.Any() Then + GameVersionDescription = "仅快照版本" '#5412 Else Dim SpaVersions As New List(Of String) Dim IsOld As Boolean = False @@ -496,17 +493,11 @@ ModLoaderDescriptionFull = "仅 " & ModLoadersForDesc.Single.ToString ModLoaderDescriptionPart = ModLoadersForDesc.Single.ToString Case Else - If ModLoaders.Contains(CompModLoaderType.Forge) AndAlso Not AllSnapshot AndAlso - (GameVersions.Max < 14 OrElse ModLoaders.Contains(CompModLoaderType.Fabric)) AndAlso - (GameVersions.Max < 20 OrElse ModLoaders.Contains(CompModLoaderType.NeoForge)) AndAlso - (GameVersions.Max < 14 OrElse ModLoaders.Contains(CompModLoaderType.Quilt) OrElse Setup.Get("ToolDownloadIgnoreQuilt")) Then - ModLoaderDescriptionFull = "任意" - ModLoaderDescriptionPart = "" - ElseIf AllSnapshot AndAlso - ModLoaders.Contains(CompModLoaderType.Forge) AndAlso - ModLoaders.Contains(CompModLoaderType.Fabric) AndAlso - ModLoaders.Contains(CompModLoaderType.NeoForge) AndAlso - (ModLoaders.Contains(CompModLoaderType.Quilt) OrElse Setup.Get("ToolDownloadIgnoreQuilt")) Then + Dim MaxVersion As Integer = If(GameVersions.Any, GameVersions.Max, 99) + If ModLoaders.Contains(CompModLoaderType.Forge) AndAlso + (MaxVersion < 14 OrElse ModLoaders.Contains(CompModLoaderType.Fabric)) AndAlso + (MaxVersion < 20 OrElse ModLoaders.Contains(CompModLoaderType.NeoForge)) AndAlso + (MaxVersion < 14 OrElse ModLoaders.Contains(CompModLoaderType.Quilt) OrElse Setup.Get("ToolDownloadIgnoreQuilt")) Then ModLoaderDescriptionFull = "任意" ModLoaderDescriptionPart = "" Else @@ -1083,7 +1074,7 @@ Retry: If RealResults.Count + Storage.Results.Count < Task.Input.TargetResultCount Then Log($"[Comp] 总结果数需求最少 {Task.Input.TargetResultCount} 个,仅获得了 {RealResults.Count + Storage.Results.Count} 个") - If Task.Input.CanContinue Then + If Task.Input.CanContinue AndAlso [Error] Is Nothing Then '如果有下载源失败则不再重试,这时候重试可能导致无限循环 Log("[Comp] 将继续尝试加载下一页") GoTo Retry Else @@ -1491,10 +1482,8 @@ Retry: If Deps.Any Then For Each DepProject In Deps.Where(Function(id) CompProjectCache.ContainsKey(id)).Select(Function(id) CompProjectCache(id)) For Each File In CompFilesCache(ProjectId) - If File.RawDependencies.Contains(DepProject.Id) AndAlso - DepProject.Id <> ProjectId AndAlso - Not File.Dependencies.Contains(DepProject.Id) Then - File.Dependencies.Add(DepProject.Id) + If File.RawDependencies.Contains(DepProject.Id) AndAlso DepProject.Id <> ProjectId Then + If Not File.Dependencies.Contains(DepProject.Id) Then File.Dependencies.Add(DepProject.Id) End If Next Next diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb index 81c1a66..2e23da0 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModDownload.vb @@ -1098,39 +1098,27 @@ ''' 调用 NetGetCodeByRequest。 ''' Public Function DlModRequest(Url As String, Optional IsJson As Boolean = False) As Object - Dim McimUrl As String = DlSourceModGet(Url) Dim Urls As New List(Of KeyValuePair(Of String, Integer)) - If McimUrl <> Url Then - Select Case Setup.Get("ToolDownloadMod") - 'TODO: 在 MCIM 源稳定后回调 - Case 0 - If ModeDebug Then - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 20)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60)) - Else - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 20)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60)) - End If - Case 1 - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 20)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60)) - Case Else - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60)) - End Select - End If + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15)) + 'Dim McimUrl As String = DlSourceModGet(Url) + 'If McimUrl <> Url Then + ' Select Case Setup.Get("ToolDownloadMod") + ' Case 0 + ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 5)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15)) + ' Case 1 + ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 5)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) + ' Case Else + ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) + ' End Select + 'End If Dim Exs As String = "" For Each Source In Urls Try @@ -1147,39 +1135,27 @@ ''' 调用 NetRequest。 ''' Public Function DlModRequest(Url As String, Method As String, Data As String, ContentType As String) As String - Dim McimUrl As String = DlSourceModGet(Url) Dim Urls As New List(Of KeyValuePair(Of String, Integer)) - If McimUrl <> Url Then - Select Case Setup.Get("ToolDownloadMod") - 'TODO: 在 MCIM 源稳定后回调 - Case 0 - If ModeDebug Then - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 20)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60)) - Else - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 20)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60)) - End If - Case 1 - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 20)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 30)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60)) - Case Else - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 30)) - Urls.Add(New KeyValuePair(Of String, Integer)(Url, 60)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60)) - Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 60)) - End Select - End If + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) + Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15)) + 'Dim McimUrl As String = DlSourceModGet(Url) + 'If McimUrl <> Url Then + ' Select Case Setup.Get("ToolDownloadMod") + ' Case 0 + ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 5)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15)) + ' Case 1 + ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 5)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) + ' Case Else + ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 5)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(Url, 15)) + ' Urls.Add(New KeyValuePair(Of String, Integer)(McimUrl, 10)) + ' End Select + 'End If Dim Exs As String = "" For Each Source In Urls Try @@ -1207,28 +1183,42 @@ End Function Public Function DlSourceLibraryGet(Original As String) As String() - Return { - Original. - Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/maven"). - Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/maven"). - Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/maven"), - Original. - Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/libraries"). - Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/libraries"). - Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries"), - Original - } + If {"minecraftforge", "fabricmc", "neoforged"}.Any(Function(k) Original.Contains(k)) Then '不添加原版源 + Return { + Original. + Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/maven"). + Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/maven"). + Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/maven"), + Original. + Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/libraries"). + Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/libraries"). + Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries") + } + Else + Return { + Original. + Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/maven"). + Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/maven"). + Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/maven"), + Original. + Replace("https://piston-data.mojang.com", "https://bmclapi2.bangbang93.com/libraries"). + Replace("https://piston-meta.mojang.com", "https://bmclapi2.bangbang93.com/libraries"). + Replace("https://libraries.minecraft.net", "https://bmclapi2.bangbang93.com/libraries"), + Original + } + End If End Function Public Function DlSourceModGet(Original As String) As String - Return Original. - Replace("api.modrinth.com", "mod.mcimirror.top/modrinth"). - Replace("staging-api.modrinth.com", "mod.mcimirror.top/modrinth"). - Replace("cdn.modrinth.com", "mod.mcimirror.top"). - Replace("api.curseforge.com", "mod.mcimirror.top/curseforge"). - Replace("edge.forgecdn.net", "mod.mcimirror.top"). - Replace("mediafilez.forgecdn.net", "mod.mcimirror.top"). - Replace("media.forgecdn.net", "mod.mcimirror.top") + Return Original + 'Return Original. + ' Replace("api.modrinth.com", "mod.mcimirror.top/modrinth"). + ' Replace("staging-api.modrinth.com", "mod.mcimirror.top/modrinth"). + ' Replace("cdn.modrinth.com", "mod.mcimirror.top"). + ' Replace("api.curseforge.com", "mod.mcimirror.top/curseforge"). + ' Replace("edge.forgecdn.net", "mod.mcimirror.top"). + ' Replace("mediafilez.forgecdn.net", "mod.mcimirror.top"). + ' Replace("media.forgecdn.net", "mod.mcimirror.top") End Function Public Function DlSourceLauncherOrMetaGet(Original As String) As String() diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb index 83e8c7d..d1df8ee 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb @@ -236,15 +236,18 @@ NextInner: '正版购买提示 If Not Setup.Get("HintBuy") AndAlso Setup.Get("LoginType") <> McLoginType.Ms Then If IsSystemLanguageChinese() Then - Select Case Setup.Get("SystemLaunchCount") - Case 3, 8, 15, 30, 50, 70, 90, 110, 130, 180, 220, 280, 330, 380, 450, 550, 660, 750, 880, 950, 1100, 1300, 1500, 1700, 1900 - If MyMsgBox("你已经启动了 " & Setup.Get("SystemLaunchCount") & " 次 Minecraft 啦!" & vbCrLf & - "如果觉得 Minecraft 还不错,可以购买正版支持一下,毕竟开发游戏也真的很不容易……不要一直白嫖啦。" & vbCrLf & vbCrLf & - "在登录一次正版账号后,就不会再出现这个提示了!", - "考虑一下正版?", "支持正版游戏!", "下次一定") = 1 Then - OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj") - End If - End Select + RunInNewThread( + Sub() + Select Case Setup.Get("SystemLaunchCount") + Case 3, 8, 15, 30, 50, 70, 90, 110, 130, 180, 220, 280, 330, 380, 450, 550, 660, 750, 880, 950, 1100, 1300, 1500, 1700, 1900 + If MyMsgBox("你已经启动了 " & Setup.Get("SystemLaunchCount") & " 次 Minecraft 啦!" & vbCrLf & + "如果觉得 Minecraft 还不错,可以购买正版支持一下,毕竟开发游戏也真的很不容易……不要一直白嫖啦。" & vbCrLf & vbCrLf & + "在登录一次正版账号后,就不会再出现这个提示了!", + "考虑一下正版?", "支持正版游戏!", "下次一定") = 1 Then + OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj") + End If + End Select + End Sub, "Buy Minecraft") ElseIf Setup.Get("LoginType") = McLoginType.Legacy Then Select Case MyMsgBox("你必须先登录正版账号,才能进行离线登录!", "正版验证", "购买正版", "试玩", "返回", Button1Action:=Sub() OpenWebsite("https://www.xbox.com/zh-cn/games/store/minecraft-java-bedrock-edition-for-pc/9nxp44l49shj")) @@ -2045,8 +2048,8 @@ IgnoreCustomSkin: "@echo off" & vbCrLf & "title 启动 - " & McVersionCurrent.Name & vbCrLf & "echo 游戏正在启动,请稍候。" & vbCrLf & - "set APPDATA=""" & PathMcFolder & """" & vbCrLf & - "cd /D """ & PathMcFolder & """" & vbCrLf & + "set APPDATA=""" & McVersionCurrent.PathIndie & """" & vbCrLf & + "cd /D """ & McVersionCurrent.PathIndie & """" & vbCrLf & CustomCommandGlobal & vbCrLf & CustomCommandVersion & vbCrLf & """" & McLaunchJavaSelected.PathJava & """ " & McLaunchArgument & vbCrLf & diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index 2d87c22..7a177e1 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -2037,8 +2037,12 @@ OnLoaded: If Checker.Check(Token.LocalPath) Is Nothing Then Continue For '文件不符合,添加下载 Dim Urls As New List(Of String) + If Token.Url Is Nothing AndAlso Token.Name = "net.minecraftforge:forge:universal" Then + '特判修复 Forge 部分 universal 文件缺失 URL(#5455) + Token.Url = "https://maven.minecraftforge.net" & Token.LocalPath.Replace(If(Token.IsJumpLoader, JumpLoaderFolder, CustomMcFolder) & "libraries", "").Replace("\", "/") + End If If Token.Url IsNot Nothing Then - '获取 Url 的真实地址 + '获取 URL 的真实地址 Urls.Add(Token.Url) If Token.Url.Contains("launcher.mojang.com/v1/objects") OrElse Token.Url.Contains("client.txt") OrElse Token.Url.Contains(".tsrg") Then @@ -2080,10 +2084,14 @@ OnLoaded: McLibGet = If(WithHead, CustomMcFolder & "libraries\", "") & Splited(0).Replace(".", "\") & "\" & Splited(1) & "\" & Splited(2) & "\" & Splited(1) & "-" & Splited(2) & ".jar" '判断 OptiFine 是否应该使用 installer - If McLibGet.Contains("optifine\OptiFine\1.12") AndAlso '仅在 1.12 OptiFine 可重现 - File.Exists(CustomMcFolder & "libraries\" & Splited(0).Replace(".", "\") & "\" & Splited(1) & "\" & Splited(2) & "\" & Splited(1) & "-" & Splited(2) & "-installer.jar") Then - Log("[Launch] 已将 " & Original & " 特判替换为对应的 Installer 文件", LogLevel.Debug) - McLibGet = McLibGet.Replace(".jar", "-installer.jar") + If McLibGet.Contains("optifine\OptiFine\1.") AndAlso Splited(2).Split(".").Count > 1 Then + Dim MajorVersion As Integer = Val(Splited(2).Split(".")(1)) + Dim MinorVersion As Integer = If(Splited(2).Split(".").Count > 1, Val(Splited(2).Split(".")(2).BeforeFirst("_")), 0) + If (MajorVersion = 12 OrElse (MajorVersion = 20 AndAlso MinorVersion >= 4) OrElse MajorVersion >= 21) AndAlso '仅在 1.12 (无法追溯) 和 1.20.4+ (#5376) 遇到此问题 + File.Exists($"{CustomMcFolder}libraries\{Splited(0).Replace(".", "\")}\{Splited(1)}\{Splited(2)}\{Splited(1)}-{Splited(2)}-installer.jar") Then + McLaunchLog("已将 " & Original & " 替换为对应的 Installer 文件") + McLibGet = McLibGet.Replace(".jar", "-installer.jar") + End If End If End Function diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 487e0e6..da6550f 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -241,9 +241,7 @@ Retry: '获取 Mod 下载信息 ModDownloadLoaders.Add(New LoaderTask(Of Integer, JArray)("获取 Mod 下载信息", Sub(Task As LoaderTask(Of Integer, JArray)) - '由于 MCIM 缺少下载信息,只使用官方源获取列表 - 'TODO: 在 MCIM 源稳定后回调回 DlModRequest - 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 作者删除,所以没法继续安装了,请向整合包作者反馈该问题") End Sub) With {.ProgressWeight = ModList.Count / 10}) '每 10 Mod 需要 1s @@ -798,14 +796,18 @@ Retry: Thread.Sleep(400) '避免文件争用 '查找解压后的 exe 文件 Dim Launcher As String = Nothing - For Each ExeFile In Directory.GetFiles(TargetFolder, "*.exe", SearchOption.AllDirectories) + For Each ExeFile In Directory.GetFiles(TargetFolder, "*.exe", SearchOption.TopDirectoryOnly) Dim Info = FileVersionInfo.GetVersionInfo(ExeFile) Log($"[Modpack] 文件 {ExeFile} 的产品名标识为 {Info.ProductName}") If Info.ProductName = "Plain Craft Launcher" Then Launcher = ExeFile - ElseIf (Info.ProductName.ContainsF("Launcher", True) OrElse Info.ProductName.ContainsF("启动器", True)) AndAlso + Log($"[Modpack] 发现整合包附带的 PCL 启动器:{ExeFile}") + ElseIf (Info.ProductName.ContainsF("Launcher", True) OrElse Info.ProductName.ContainsF("启动", True)) AndAlso Not Info.ProductName = "Plain Craft Launcher Admin Manager" Then - If Launcher Is Nothing Then Launcher = ExeFile + If Launcher Is Nothing Then + Launcher = ExeFile + Log($"[Modpack] 发现整合包附带的疑似第三方启动器:{ExeFile}") + End If End If Next Task.Progress = 0.95 diff --git a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb b/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb index 9acbea9..a7bc54b 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/MyLocalModItem.xaml.vb @@ -137,18 +137,14 @@ Public Class MyLocalModItem Exit Sub End If '计算滑动范围 - Dim Index = CType(Parent, StackPanel).Children.IndexOf(Me) - If Index < 0 OrElse Index >= CType(Parent, StackPanel).Children.Count Then Exit Sub - SwipeStart = Math.Min(SwipeStart, Index) - SwipeEnd = Math.Max(SwipeEnd, Index) - If SwipeStart < 0 Then SwipeStart = 0 - If SwipeEnd < 0 Then SwipeEnd = 0 - If SwipeStart >= CType(Parent, StackPanel).Children.Count Then SwipeStart = CType(Parent, StackPanel).Children.Count - 1 - If SwipeEnd >= CType(Parent, StackPanel).Children.Count Then SwipeEnd = CType(Parent, StackPanel).Children.Count - 1 + Dim Elements = CType(Parent, StackPanel).Children + Dim Index As Integer = Elements.IndexOf(Me) + SwipeStart = MathClamp(Math.Min(SwipeStart, Index), 0, Elements.Count - 1) + SwipeEnd = MathClamp(Math.Max(SwipeEnd, Index), 0, Elements.Count - 1) '勾选所有范围中的项 If SwipeStart = SwipeEnd Then Exit Sub For i = SwipeStart To SwipeEnd - Dim Item As MyLocalModItem = CType(Parent, StackPanel).Children(i) + Dim Item As MyLocalModItem = Elements(i) Item.InitLate(Item, e) Item.Checked = SwipToState Next @@ -466,8 +462,11 @@ Public Class MyLocalModItem End Sub '显示更新日志 - Private Sub ShowUpdateLog(sender As Object, e As MouseButtonEventArgs) Handles BtnUpdate.PreviewMouseRightButtonUp + Private Sub BtnUpdate_PreviewMouseRightButtonUp(sender As Object, e As MouseButtonEventArgs) Handles BtnUpdate.PreviewMouseRightButtonUp e.Handled = True + ShowUpdateLog() + End Sub + Private Sub ShowUpdateLog() Dim CurseForgeUrl As String = Entry.ChangelogUrls.FirstOrDefault(Function(x) x.Contains("curseforge.com")) Dim ModrinthUrl As String = Entry.ChangelogUrls.FirstOrDefault(Function(x) x.Contains("modrinth.com")) If CurseForgeUrl Is Nothing OrElse ModrinthUrl Is Nothing Then @@ -484,8 +483,13 @@ Public Class MyLocalModItem '触发更新 Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles BtnUpdate.Click - If MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "Mod 更新确认", "更新", "取消") = 2 Then Return - FrmVersionMod.UpdateMods({Entry}) + Select Case MyMsgBox($"是否要更新 {Entry.Name}?{vbCrLf}{vbCrLf}{GetUpdateCompareDescription()}", "Mod 更新确认", "更新", "查看更新日志", "取消") + Case 1 '更新 + FrmVersionMod.UpdateMods({Entry}) + Case 2 '查看更新日志 + ShowUpdateLog() + Case 3 '取消 + End Select End Sub '自适应(#4465) diff --git a/Plain Craft Launcher 2/Modules/ModDevelop.vb b/Plain Craft Launcher 2/Modules/ModDevelop.vb index 8f630e5..b1eb6f0 100644 --- a/Plain Craft Launcher 2/Modules/ModDevelop.vb +++ b/Plain Craft Launcher 2/Modules/ModDevelop.vb @@ -1,3 +1,8 @@ Public Module ModDevelop +#If DEBUG Then + Public Sub Start() + End Sub +#End If + End Module diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index 5f7dcd9..f678bce 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 ff7ec51..79704cb 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -1353,7 +1353,7 @@ Retry: '去除其中的原始 Forgelike 项 For i = 0 To Libs.Count - 1 If Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{LoaderVersion}.jar") OrElse -Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{LoaderVersion}-client.jar") Then + Libs(i).LocalPath.EndsWithF($"{LoaderName.ToLower}-{Inherit}-{LoaderVersion}-client.jar") Then Log($"[Download] 已从待下载 {LoaderName} 支持库中移除:" & Libs(i).LocalPath, LogLevel.Debug) Libs.RemoveAt(i) Exit For diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml index 1d16b98..3a52922 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCompDetail.xaml @@ -9,7 +9,6 @@ - diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb index 9660a64..e860b13 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/MySkin.xaml.vb @@ -242,7 +242,7 @@ Retry: {"Vanilla", "原版披风"}, {"Minecon2011", "Minecon 2011 参与者披风"}, {"Minecon2012", "Minecon 2012 参与者披风"}, {"Minecon2013", "Minecon 2013 参与者披风"}, {"Minecon2015", "Minecon 2015 参与者披风"}, {"Minecon2016", "Minecon 2016 参与者披风"}, {"Cherry Blossom", "樱花披风"}, {"15th Anniversary", "15 周年纪念披风"}, {"Purple Heart", "紫色心形披风"}, - {"Follower's", "追随者披风"}, {"MCC 15th Year", "MCC 15 周年披风"}, {"Minecraft Experience", "村民救援披风"}, + {"Follower's", "追随者披风"}, {"MCC 15th Year", "MCC 15 周年披风"}, {"Minecraft Experience", "村民救援披风"}, {"Mojang Office", "Mojang 办公室披风"} } Dim SelectionControl As New List(Of IMyRadio) From {New MyRadioBox With {.Text = "无披风"}} diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb index 595aecb..3a8643c 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLaunchRight.xaml.vb @@ -109,11 +109,11 @@ Download: GoTo Download Case 7 Log("[Page] 主页预设:主页市场") - Url = "https://homepage-market.pages.dev/Custom.xaml" + Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/JingHai-Lingyun/Custom.xaml" GoTo Download Case 8 Log("[Page] 主页预设:更新日志") - Url = "https://updatehomepage.pages.dev/UpdateHomepage.xaml" + Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/Joker2184/UpdateHomepage.xaml" GoTo Download Case 9 Log("[Page] 主页预设:PCL 新功能说明书") @@ -125,7 +125,7 @@ Download: GoTo Download Case 11 Log("[Page] 主页预设:杂志主页") - Url = "http://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/Ext1nguisher/Custom.xaml" + Url = "https://pclhomeplazaoss.lingyunawa.top:26994/d/Homepages/Ext1nguisher/Custom.xaml" GoTo Download End Select End Select diff --git a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb index ed91684..dc1c043 100644 --- a/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageLaunch/PageLoginLegacy.xaml.vb @@ -44,6 +44,11 @@ Public Class PageLoginLegacy Public Shared Function IsVaild(LoginData As McLoginLegacy) As String If LoginData.UserName.Trim = "" Then Return "玩家名不能为空!" If LoginData.UserName.Contains("""") Then Return "玩家名不能包含英文引号!" + If McVersionCurrent IsNot Nothing AndAlso + ((McVersionCurrent.Version.McCodeMain = 20 AndAlso McVersionCurrent.Version.McCodeSub >= 3) OrElse McVersionCurrent.Version.McCodeMain > 20) AndAlso + LoginData.UserName.Trim.Length > 16 Then + Return "自 1.20.3 起,玩家名至多只能包含 16 个字符!" + End If Return "" End Function Public Function IsVaild() As String diff --git a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml index 8142163..431ddfd 100644 --- a/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml +++ b/Plain Craft Launcher 2/Pages/PageOther/PageOtherAbout.xaml @@ -104,107 +104,120 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml index bf1c1da..65022e5 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml @@ -54,31 +54,29 @@ - - - + + + - - + - diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb index fc00a3d..c03414d 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb @@ -34,7 +34,7 @@ 'Mod 与整合包 ComboDownloadTranslate.SelectedIndex = Setup.Get("ToolDownloadTranslate") - ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod") + 'ComboDownloadMod.SelectedIndex = Setup.Get("ToolDownloadMod") ComboModLocalNameStyle.SelectedIndex = Setup.Get("ToolModLocalNameStyle") CheckDownloadIgnoreQuilt.Checked = Setup.Get("ToolDownloadIgnoreQuilt") @@ -96,7 +96,7 @@ Private Shared Sub SliderChange(sender As MySlider, e As Object) Handles SliderDebugAnim.Change, SliderDownloadThread.Change, SliderDownloadSpeed.Change If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Value) End Sub - Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboDownloadVersion.SelectionChanged, ComboModLocalNameStyle.SelectionChanged, ComboDownloadTranslate.SelectionChanged, ComboSystemUpdate.SelectionChanged, ComboSystemActivity.SelectionChanged, ComboDownloadMod.SelectionChanged + Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboDownloadVersion.SelectionChanged, ComboModLocalNameStyle.SelectionChanged, ComboDownloadTranslate.SelectionChanged, ComboSystemUpdate.SelectionChanged, ComboSystemActivity.SelectionChanged If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex) End Sub Private Shared Sub TextBoxChange(sender As MyTextBox, e As Object) Handles TextSystemCache.ValidatedTextChanged diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml index cc8949c..f05936f 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml @@ -245,7 +245,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb index f48e8ea..862c701 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupUI.xaml.vb @@ -42,8 +42,8 @@ '设置解锁 If Not RadioLauncherTheme8.IsEnabled Then LabLauncherTheme8Copy.ToolTip = "累积赞助达到 ¥23.33 后,在爱发电私信发送【解锁码】以解锁。" & vbCrLf & "右键打开赞助页面,如果觉得 PCL 做得还不错就支持一下吧 =w=!" RadioLauncherTheme8.ToolTip = "累积赞助达到 ¥23.33 后,在爱发电私信发送【解锁码】以解锁" - If Not RadioLauncherTheme9.IsEnabled Then LabLauncherTheme9Copy.ToolTip = "· 反馈一个 Bug,在标记为 [完成] 后回复识别码要求解锁(右键打开反馈页面)" & vbCrLf & "· 提交一个 Pull Request,在合并后回复识别码要求解锁" - RadioLauncherTheme9.ToolTip = "· 反馈一个 Bug,在标记为 [完成] 后回复识别码要求解锁" & vbCrLf & "· 提交一个 Pull Request,在合并后回复识别码要求解锁" + If Not RadioLauncherTheme9.IsEnabled Then LabLauncherTheme9Copy.ToolTip = "· 反馈一个 Bug,在标记为 [完成] 后回复识别码要求解锁(右键打开反馈页面)" & vbCrLf & "· 提交一个 Pull Request 或主页预设,在标记为 [完成] 后回复识别码要求解锁" + RadioLauncherTheme9.ToolTip = "· 反馈一个 Bug,在标记为 [完成] 后回复识别码要求解锁" & vbCrLf & "· 提交一个 Pull Request 或主页预设,在标记为 [完成] 后回复识别码要求解锁" '极客蓝的处理在 ThemeCheck 中 End Sub diff --git a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb index 459a65b..f2450b6 100644 --- a/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageVersion/PageVersionMod.xaml.vb @@ -356,12 +356,12 @@ Install: Try For Each ModFile In FilePathList - Dim NewFileName = GetFileNameFromPath(ModFile).Replace(".disabled", "") + Dim NewFileName = GetFileNameFromPath(ModFile).Replace(".disabled", "").Replace(".old", "") If Not NewFileName.Contains(".") Then NewFileName += ".jar" '#4227 CopyFile(ModFile, TargetVersion.PathIndie & "mods\" & NewFileName) Next If FilePathList.Count = 1 Then - Hint($"已安装 {GetFileNameFromPath(FilePathList.First).Replace(".disabled", "")}!", HintType.Finish) + Hint($"已安装 {GetFileNameFromPath(FilePathList.First).Replace(".disabled", "").Replace(".old", "")}!", HintType.Finish) Else Hint($"已安装 {FilePathList.Count} 个 Mod!", HintType.Finish) End If @@ -388,7 +388,7 @@ Install: #Region "选择" - '选择的 Mod 的路径(不含 .disabled) + '选择的 Mod 的路径(不含 .disabled 和 .old) Public SelectedMods As New List(Of String) '单项切换选择状态 diff --git a/Plain Craft Launcher 2/Resources/Help.zip b/Plain Craft Launcher 2/Resources/Help.zip index 0edd70fedb7c09a6c1156c714ebef50624ed976a..c36f288246005c63b71ff517d361a10456a04f5a 100644 GIT binary patch delta 19759 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 delta 19580 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 diff --git a/Plain Craft Launcher 2/app.manifest b/Plain Craft Launcher 2/app.manifest index 6be9dd1..498fc70 100644 --- a/Plain Craft Launcher 2/app.manifest +++ b/Plain Craft Launcher 2/app.manifest @@ -48,14 +48,15 @@ 自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需 选择加入。选择加入此设置的 Windows 窗体应用程序(目标设定为 .NET Framework 4.6 )还应 在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。--> + - - - PerMonitorV2 - true - + + + PerMonitorV2 + true +