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 0edd70f..c36f288 100644 Binary files a/Plain Craft Launcher 2/Resources/Help.zip and b/Plain Craft Launcher 2/Resources/Help.zip differ 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 +