From 97c536710887071d786510d555b04c396fa55a2b 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: Tue, 8 Nov 2022 19:17:11 +0800 Subject: [PATCH] 2.4.2 --- .../Controls/MyButton.xaml.vb | 2 +- Plain Craft Launcher 2/FormMain.xaml.vb | 11 +++- Plain Craft Launcher 2/Images/Heads/noin.png | Bin 434 -> 0 bytes .../Modules/Base/ModBase.vb | 6 +- .../Modules/Minecraft/ModDownload.vb | 5 +- .../Modules/Minecraft/ModMinecraft.vb | 58 ++++++++++-------- .../Modules/Minecraft/ModModpack.vb | 8 +++ .../My Project/AssemblyInfo.vb | 4 +- .../Pages/PageDownload/ModDownloadLib.vb | 25 ++++---- .../PageDownload/PageDownloadCfDetail.xaml.vb | 6 +- .../Pages/PageDownload/PageDownloadLeft.xaml | 2 +- .../Pages/PageSetup/PageSetupLaunch.xaml | 40 ++++++------ .../Pages/PageSetup/PageSetupLaunch.xaml.vb | 4 +- .../Pages/PageSetup/PageSetupSystem.xaml.vb | 4 +- .../Plain Craft Launcher 2.vbproj | 3 - Plain Craft Launcher 2/Resources/Help.zip | Bin 72553 -> 69242 bytes 16 files changed, 101 insertions(+), 77 deletions(-) delete mode 100644 Plain Craft Launcher 2/Images/Heads/noin.png diff --git a/Plain Craft Launcher 2/Controls/MyButton.xaml.vb b/Plain Craft Launcher 2/Controls/MyButton.xaml.vb index 686b855..370b399 100644 --- a/Plain Craft Launcher 2/Controls/MyButton.xaml.vb +++ b/Plain Craft Launcher 2/Controls/MyButton.xaml.vb @@ -1,7 +1,7 @@ Public Class MyButton '声明 - Public Event Click(sender As Object, e As EventArgs) '自定义事件 + Public Event Click(sender As Object, e As MouseButtonEventArgs) '自定义事件 '自定义属性 Public Uuid As Integer = GetUuid() diff --git a/Plain Craft Launcher 2/FormMain.xaml.vb b/Plain Craft Launcher 2/FormMain.xaml.vb index 15a7e73..2283842 100644 --- a/Plain Craft Launcher 2/FormMain.xaml.vb +++ b/Plain Craft Launcher 2/FormMain.xaml.vb @@ -10,15 +10,15 @@ Public Class FormMain Dim FeatureList As New List(Of KeyValuePair(Of Integer, String)) '统计更新日志条目 #If BETA Then - If LastVersion < 268 Then 'Release 2.4.1 + If LastVersion < 268 Then 'Release 2.4.2 FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "暂时关闭了联机功能")) FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "游戏崩溃的弹窗添加了直接查看日志的选项")) FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "在更多分类下添加了新功能投票选项")) FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "自动安装时支持检查 OptiFine 对 Forge 的具体版本需求")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化自动 Java 选择的准确度")) FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "优化 Mod 中文名的显示")) - FeatureCount += 12 - BugCount += 30 + FeatureCount += 14 + BugCount += 33 End If If LastVersion < 265 Then 'Release 2.3.5 FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复部分情况下无法启动路径带有中文的游戏的 Bug")) @@ -100,6 +100,11 @@ Public Class FormMain '3:BUG+ IMP* FEAT- '2:BUG* IMP- '1:BUG- + If LastVersion < 269 Then 'Snapshot 2.4.2 + If LastVersion = 267 Then FeatureList.Add(New KeyValuePair(Of Integer, String)(2, "修复无法下载 CurseForge 整合包的 Bug")) + FeatureCount += 2 + BugCount += 3 + End If If LastVersion < 267 Then 'Snapshot 2.4.1 FeatureList.Add(New KeyValuePair(Of Integer, String)(5, "暂时关闭了联机功能")) FeatureList.Add(New KeyValuePair(Of Integer, String)(3, "自动安装时支持检查 OptiFine 对 Forge 的具体版本需求")) diff --git a/Plain Craft Launcher 2/Images/Heads/noin.png b/Plain Craft Launcher 2/Images/Heads/noin.png deleted file mode 100644 index d0b9afd50c541ebdc0ae608d056c5ab1b00a8d16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434 zcmV;j0ZsmiP)LIP-bt%qUT`XwjT* z3Ur(AE0uwinrUBUrd4!P{W$Z~{nMWyM*S>1j{urqoGOsw=dgdF_>~qdQ~LcBE2qlp zWjy2(_SvHh4T>s|3@ldG;Q9Uav_m!)fDbuV4}$=;cVpq-0Bd`p^`R{~cLOvy2&+3= zlx_kh7#z^DMPVo43bpXmutjHfKm+<_A4Lf{L1AkENdOwOY&oz6%*b^FobU-%vlcwQ zLP>{63BVP410=kNp=gu+}Myvj%p*fp-Ereds!fKp`3j )[^<]+") Category = "universal" - Else + ElseIf VersionCode.Contains("client.zip") Then '类型为 client.zip,支持范围 182~ (1.3.2 部分 ~) VersionCode = VersionCode.Substring(VersionCode.IndexOf("client.zip")) MD5 = RegexSeek(VersionCode, "(?<=MD5: )[^<]+") Category = "client" + Else + '没有任何下载(1.6.4 有一部分这种情况) + Continue For End If '添加进列表 Versions.Add(New DlForgeVersionEntry With {.Category = Category, .Version = Name, .IsRecommended = IsRecommended, .Hash = MD5.Trim(vbCr, vbLf), .Inherit = Inherit, .ReleaseTime = ReleaseTime, .Branch = Branch}) diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb index b458f1a..9f5f63a 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb @@ -458,9 +458,6 @@ RetryGet: GoTo RetryGet End If - '若依然未找到适合的 Java,直接返回 - If AllowedJavaList.Count = 0 Then Return Nothing - '检查用户指定的 Java Dim UserSetup As String = Setup.Get("LaunchArgumentJavaSelect") If RelatedVersion IsNot Nothing Then @@ -495,17 +492,24 @@ RetryGet: Dim Right As String = MaxVersion.Minor & If(MaxVersion.MinorRevision < 99, "." & MaxVersion.MinorRevision & "." & MaxVersion.Revision, "") Requirement = "需要 Java " & If(Left = Right, Left, Left & " ~ " & Right) End If - If MyMsgBox("你在启动设置中指定了使用 Java " & UserJava.VersionCode & ",但当前版本" & Requirement & "。" & vbCrLf & - "如果强制使用该 Java,可能会导致游戏崩溃。" & vbCrLf & - vbCrLf & - " - 指定的 Java:" & UserJava.ToString, - "Java 兼容性警告", "让 PCL2 自动选择", "强制使用该 Java") = 2 Then + If Setup.Get("LaunchAdvanceJava") Then + '直接跳过弹窗 + Hint("设置中指定了使用 Java " & UserJava.VersionCode & ",但当前版本" & Requirement & ",这可能会导致游戏崩溃!", HintType.Critical) + AllowedJavaList = New List(Of JavaEntry) From {UserJava} + ElseIf MyMsgBox("你在启动设置中指定了使用 Java " & UserJava.VersionCode & ",但当前版本" & Requirement & "。" & vbCrLf & + "如果强制使用该 Java,可能会导致游戏崩溃。" & vbCrLf & + vbCrLf & + " - 指定的 Java:" & UserJava.ToString, + "Java 兼容性警告", "让 PCL2 自动选择", "强制使用该 Java") = 2 Then '强制使用指定的 Java Log("[Java] 已强制使用用户指定的不兼容 Java") AllowedJavaList = New List(Of JavaEntry) From {UserJava} End If End If + '若依然未找到适合的 Java,直接返回 + If AllowedJavaList.Count = 0 Then Return Nothing + '检查特定的 Java For Each Java In AllowedJavaList If TargetJavaList.Contains(Java) Then @@ -2508,24 +2512,26 @@ NextVersion: If Setup.Get("VersionServerLogin", Version:=Version) = 4 OrElse (PageLinkHiper.HiperState = LoadState.Finished AndAlso Setup.Get("LoginType") = McLoginType.Legacy) Then 'HiPer 登录转接 Dim TargetFile = PathAppdata & "authlib-injector.jar" - Dim DownloadInfo As JObject = Nothing - '获取下载信息 - Try - Log("[Minecraft] 开始获取 Authlib-Injector 下载信息") - DownloadInfo = GetJson(NetGetCodeByDownload({"https://download.mcbbs.net/mirrors/authlib-injector/artifact/latest.json", "https://bmclapi2.bangbang93.com/mirrors/authlib-injector/artifact/latest.json"}, IsJson:=True)) - Catch ex As Exception - Log(ex, "获取 Authlib-Injector 下载信息失败") - End Try - '校验文件 - If DownloadInfo IsNot Nothing Then - Dim Checker As New FileChecker(Hash:=DownloadInfo("checksums")("sha256").ToString) - If (IsSetupSkip AndAlso File.Exists(TargetFile)) OrElse Checker.Check(TargetFile) IsNot Nothing Then - '开始下载 - Dim DownloadAddress As String = DownloadInfo("download_url") - Log("[Minecraft] Authlib-Injector 需要更新:" & DownloadAddress) - Result.Add(New NetFile({ - DownloadAddress.Replace("bmclapi2.bangbang93.com", "download.mcbbs.net"), DownloadAddress - }, TargetFile, New FileChecker(Hash:=DownloadInfo("checksums")("sha256").ToString))) + If Not (IsSetupSkip AndAlso File.Exists(TargetFile)) Then + Dim DownloadInfo As JObject = Nothing + '获取下载信息 + Try + Log("[Minecraft] 开始获取 Authlib-Injector 下载信息") + DownloadInfo = GetJson(NetGetCodeByDownload({"https://download.mcbbs.net/mirrors/authlib-injector/artifact/latest.json", "https://bmclapi2.bangbang93.com/mirrors/authlib-injector/artifact/latest.json"}, IsJson:=True)) + Catch ex As Exception + Log(ex, "获取 Authlib-Injector 下载信息失败") + End Try + '校验文件 + If DownloadInfo IsNot Nothing Then + Dim Checker As New FileChecker(Hash:=DownloadInfo("checksums")("sha256").ToString) + If (IsSetupSkip AndAlso File.Exists(TargetFile)) OrElse Checker.Check(TargetFile) IsNot Nothing Then + '开始下载 + Dim DownloadAddress As String = DownloadInfo("download_url") + Log("[Minecraft] Authlib-Injector 需要更新:" & DownloadAddress) + Result.Add(New NetFile({ + DownloadAddress.Replace("bmclapi2.bangbang93.com", "download.mcbbs.net"), DownloadAddress + }, TargetFile, New FileChecker(Hash:=DownloadInfo("checksums")("sha256").ToString))) + End If End If End If End If diff --git a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb index 3780f92..a383530 100644 --- a/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb +++ b/Plain Craft Launcher 2/Modules/Minecraft/ModModpack.vb @@ -276,6 +276,14 @@ Retry: Loaders.Add(New LoaderCombo(Of String)("整合包安装", InstallLoaders) With {.Show = False, .Block = False, .ProgressWeight = InstallExpectTime}) Loaders.Add(New LoaderCombo(Of String)("游戏安装", MergeLoaders) With {.Show = False, .ProgressWeight = MergeExpectTime}) Loaders.Add(New LoaderCombo(Of String)("下载游戏支持库文件", LoadersLib) With {.ProgressWeight = 8}) + Loaders.Add(New LoaderTask(Of String, String)("清理安装文件", + Sub(Task As LoaderTask(Of String, String)) + Dim Target As String = PathMcFolder & "versions\" & VersionName & "\原始整合包.zip" + If Not Setup.Get("ToolDownloadKeepModpack") AndAlso File.Exists(Target) Then + Log("[Download] 根据设置要求删除原始整合包文件:" & Target) + File.Delete(Target) + End If + End Sub) With {.ProgressWeight = 0.1, .Show = False}) '重复任务检查 Dim LoaderName As String = "CurseForge 整合包安装:" & VersionName & " " diff --git a/Plain Craft Launcher 2/My Project/AssemblyInfo.vb b/Plain Craft Launcher 2/My Project/AssemblyInfo.vb index b8bdb0a..af43c2a 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 5f0320a..2e05909 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/ModDownloadLib.vb @@ -2074,20 +2074,23 @@ Public Module ModDownloadLib #Region "处理 Json 文件" '获取 minecraftArguments Dim AllArguments As String = - If(MinecraftJson("minecraftArguments"), " ").ToString & - If(OptiFineJson IsNot Nothing, If(OptiFineJson("minecraftArguments"), " ").ToString, " ") & - If(ForgeJson IsNot Nothing, If(ForgeJson("minecraftArguments"), " ").ToString, " ") & + If(MinecraftJson("minecraftArguments"), " ").ToString & " " & + If(OptiFineJson IsNot Nothing, If(OptiFineJson("minecraftArguments"), " ").ToString, " ") & " " & + If(ForgeJson IsNot Nothing, If(ForgeJson("minecraftArguments"), " ").ToString, " ") & " " & If(LiteLoaderJson IsNot Nothing, If(LiteLoaderJson("minecraftArguments"), " ").ToString, " ") + '分割参数字符串 + Dim RawArguments As List(Of String) = AllArguments.Split(" ").Where(Function(l) l <> "").Select(Function(l) l.Trim).ToList Dim SplitArguments As New List(Of String) - For Each Argument In AllArguments.Split("--") - Argument = Argument.Trim - If Argument <> "" Then SplitArguments.Add(Argument) + For i = 0 To RawArguments.Count - 1 + If RawArguments(i).StartsWith("-") Then + SplitArguments.Add(RawArguments(i)) + ElseIf SplitArguments.Count > 0 AndAlso SplitArguments.Last.StartsWith("-") AndAlso Not SplitArguments.Last.Contains(" ") Then + SplitArguments(SplitArguments.Count - 1) = SplitArguments.Last & " " & RawArguments(i) + Else + SplitArguments.Add(RawArguments(i)) + End If Next - SplitArguments = ArrayNoDouble(SplitArguments) - Dim RealArguments As String = Nothing - If SplitArguments.Count > 0 Then - RealArguments = If(AllArguments.StartsWith("--"), "--", "") & Join(SplitArguments, " --") - End If + Dim RealArguments As String = Join(ArrayNoDouble(SplitArguments), " ") '合并 OutputJson = MinecraftJson If HasOptiFine Then diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCfDetail.xaml.vb b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCfDetail.xaml.vb index c162eff..ea650e2 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCfDetail.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadCfDetail.xaml.vb @@ -167,11 +167,7 @@ Loaders.Add(New LoaderDownload("下载整合包文件", New List(Of NetFile) From {File.GetDownloadFile(Target, True)}) With {.ProgressWeight = 10, .Block = True}) Loaders.Add(New LoaderTask(Of Integer, Integer)("准备安装整合包", Sub() - If Not ModpackInstall(Target, VersionName) Then Throw New Exception("整合包安装过程中出现异常!") - If Not Setup.Get("ToolDownloadKeepModpack") Then - Log("[Download] 根据设置要求删除原始整合包文件:" & Target) - IO.File.Delete(Target) - End If + If Not ModpackInstall(Target, VersionName) Then Throw New Exception("整合包安装出现异常!") End Sub) With {.ProgressWeight = 0.1}) '启动 diff --git a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml index 4526793..600f861 100644 --- a/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml +++ b/Plain Craft Launcher 2/Pages/PageDownload/PageDownloadLeft.xaml @@ -15,7 +15,7 @@ - + diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml index 827e79e..1a060f8 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml @@ -211,24 +211,28 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb index e9fadeb..3a56605 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupLaunch.xaml.vb @@ -48,6 +48,7 @@ TextAdvanceJvm.Text = Setup.Get("LaunchAdvanceJvm") TextAdvanceGame.Text = Setup.Get("LaunchAdvanceGame") CheckAdvanceAssets.Checked = Setup.Get("LaunchAdvanceAssets") + CheckAdvanceJava.Checked = Setup.Get("LaunchAdvanceJava") Catch ex As NullReferenceException Log(ex, "启动设置项存在异常,已被自动重置", LogLevel.Msgbox) @@ -74,6 +75,7 @@ Setup.Reset("LaunchSkinID") Setup.Reset("LaunchAdvanceJvm") Setup.Reset("LaunchAdvanceGame") + Setup.Reset("LaunchAdvanceJava") Setup.Reset("LaunchAdvanceAssets") Setup.Reset("LaunchArgumentJavaAll") @@ -102,7 +104,7 @@ Private Shared Sub ComboChange(sender As MyComboBox, e As Object) Handles ComboArgumentIndie.SelectionChanged, ComboArgumentVisibie.SelectionChanged, ComboArgumentWindowType.SelectionChanged, ComboArgumentPriority.SelectionChanged If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.SelectedIndex) End Sub - Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceAssets.Change + Private Shared Sub CheckBoxChange(sender As MyCheckBox, e As Object) Handles CheckAdvanceAssets.Change, CheckAdvanceJava.Change If AniControlEnabled = 0 Then Setup.Set(sender.Tag, sender.Checked) End Sub diff --git a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb index 19dbfc6..891c259 100644 --- a/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb +++ b/Plain Craft Launcher 2/Pages/PageSetup/PageSetupSystem.xaml.vb @@ -208,7 +208,7 @@ If MyMsgBox("若选择此项,即使在将来出现严重问题时,你也无法获取相关通知。" & vbCrLf & "例如,如果发现某个版本游戏存在严重 Bug,你可能就会因为无法得到通知而导致无法预知的后果。" & vbCrLf & vbCrLf & "一般选择 仅在有重要通知时显示公告 就可以让你尽量不受打扰了。" & vbCrLf & - "除非你在制作服务器整合包,或时常手动更新启动器,否则极度不推荐选择此项!", "警告", "继续", "取消") = 2 Then + "除非你在制作服务器整合包,或时常手动更新启动器,否则极度不推荐选择此项!", "警告", "我知道我在做什么", "取消", IsWarn:=True) = 2 Then ComboSystemActivity.SelectedItem = e.RemovedItems(0) End If End If @@ -219,7 +219,7 @@ If MyMsgBox("若选择此项,即使在启动器将来出现严重问题时,你也无法获取更新并获得修复。" & vbCrLf & "例如,如果官方修改了登录方式,从而导致现有启动器无法登录,你可能就会因为无法更新而无法开始游戏。" & vbCrLf & vbCrLf & "一般选择 仅在有重大漏洞更新时显示提示 就可以让你尽量不受打扰了。" & vbCrLf & - "除非你在制作服务器整合包,或时常手动更新启动器,否则极度不推荐选择此项!", "警告", "继续", "取消") = 2 Then + "除非你在制作服务器整合包,或时常手动更新启动器,否则极度不推荐选择此项!", "警告", "我知道我在做什么", "取消", IsWarn:=True) = 2 Then ComboSystemUpdate.SelectedItem = e.RemovedItems(0) End If End If diff --git a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj index 0a7adc8..6560948 100644 --- a/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj +++ b/Plain Craft Launcher 2/Plain Craft Launcher 2.vbproj @@ -867,9 +867,6 @@ - - - diff --git a/Plain Craft Launcher 2/Resources/Help.zip b/Plain Craft Launcher 2/Resources/Help.zip index fbd7361b9971a6248c8dc2601442b6fbf734c0a5..43e6c367c6139af92ed11ca1e642448b9819aae9 100644 GIT binary patch delta 450 zcmaF4jpf%ImJKZpn-6sNS5If+WR#ko$U7M4!k2$T8VeH`r>_wPy2n?L zF`7AVJ6Lr3enG|(=Hq*TJ~*W|Jw^ydNj@EQuVa5ig*T<(Th%ib{Zn(?>(p<#E za1tcY&(wEe`bH7Pbf&`>rYDFoN>4WxWo%<&y#(QCiZOCeHv1zo{kteo$=n+t(WOie zZ-Qu*>DuCqjZCr+r>_%doXQ;bh+*>jxAI`sl@g4JOeRmJ-;rRP&9v|7^h!y_bb-%L z85o|=-1mI>M15apUw@a$j6Wo&b4oFWFj+mH9xuh%%e4N*^mkH>xqNmEb_~@j3=A({ HG5`SpWW}2W delta 3540 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