This commit is contained in:
龙腾猫跃
2022-09-29 17:51:58 +08:00
parent bbbafa5429
commit c400836de8
14 changed files with 423 additions and 247 deletions
+11 -3
View File
@@ -10,12 +10,12 @@ Public Module ModBase
#Region "声明"
'下列版本信息由更新器自动修改
Public Const VersionBaseName As String = "2.3.4" '不含分支前缀的显示用版本名
Public Const VersionStandardCode As String = "2.3.4." & VersionBranchCode '标准格式的四段式版本号
Public Const VersionBaseName As String = "2.3.5" '不含分支前缀的显示用版本名
Public Const VersionStandardCode As String = "2.3.5." & VersionBranchCode '标准格式的四段式版本号
#If BETA Then
Public Const VersionCode As Integer = 260 'Release
#Else
Public Const VersionCode As Integer = 263 'Snapshot
Public Const VersionCode As Integer = 264 'Snapshot
#End If
'自动生成的版本信息
Public Const VersionDisplayName As String = VersionBranchName & " " & VersionBaseName
@@ -2476,6 +2476,14 @@ Retry:
If Not Exp Then Throw New Exception("断言命中")
End Sub
'获取当前的堆栈信息
Public Function GetStackTrace() As String
Dim Stack As New StackTrace()
Return Join(Stack.GetFrames().Skip(1).Select(Function(f) f.GetMethod).
Select(Function(f) f.Name & "(" & Join(f.GetParameters.Select(Function(p) p.ToString).ToList, ", ") & ") - " & f.Module.ToString).ToList,
vbCrLf).Replace(vbCrLf & vbCrLf, vbCrLf)
End Function
#End Region
#Region "随机"
@@ -340,6 +340,7 @@
没有可用的分析文件
使用32位Java导致JVM无法分配足够多的内存
Mod重复安装
OptiFine与Forge不兼容
Fabric报错
Fabric报错并给出解决方案
Forge报错
@@ -449,6 +450,8 @@ Done:
If LogMc.Contains("The driver does not appear to support OpenGL") Then AppendReason(CrashReason.显卡不支持OpenGL)
If LogMc.Contains("java.lang.ClassCastException: java.base/jdk") Then AppendReason(CrashReason.使用JDK)
If LogMc.Contains("java.lang.ClassCastException: class jdk.") Then AppendReason(CrashReason.使用JDK)
If LogMc.Contains("Cannot read field ""ofTelemetry"" because ""net.optifine.Config.gameSettings"" is null") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
If LogMc.Contains("TRANSFORMER/net.optifine/net.optifine.reflect.Reflector.<clinit>(Reflector.java") Then AppendReason(CrashReason.OptiFine与Forge不兼容)
If LogMc.Contains("Open J9 is not supported") OrElse LogMc.Contains("OpenJ9 is incompatible") OrElse LogMc.Contains(".J9VMInternals.") Then AppendReason(CrashReason.使用OpenJ9)
If LogMc.Contains("because module java.base does not export") Then AppendReason(CrashReason.Java版本过高)
If LogMc.Contains("java.lang.ClassNotFoundException: java.lang.invoke.LambdaMetafactory") Then AppendReason(CrashReason.Java版本过高)
@@ -554,7 +557,7 @@ Done:
For Each Stack As String In StackSearchResults
'If Not Stack.Contains(".") Then Continue For
For Each IgnoreStack In {
"java", "sun", "javax", "jdk",
"java", "sun", "javax", "jdk", "oolloo",
"org.lwjgl", "com.sun", "net.minecraftforge", "com.mojang", "net.minecraft", "cpw.mods", "com.google", "org.apache", "org.spongepowered", "net.fabricmc", "com.mumfrey",
"com.electronwill.nightconfig", "it.unimi.dsi",
"MojangTricksIntelDriversForPerformance_javaw"}
@@ -580,9 +583,9 @@ NextStack:
If {"com", "org", "net", "asm", "fml", "mod", "jar", "sun", "lib", "map", "gui", "dev", "nio", "api", "dsi",
"core", "init", "mods", "main", "file", "game", "load", "read", "done", "util", "tile", "item", "base",
"forge", "setup", "block", "model", "mixin", "event", "unimi",
"common", "server", "config", "loader", "launch", "entity", "assist", "client", "modapi", "mojang", "shader", "events", "github",
"common", "server", "config", "loader", "launch", "entity", "assist", "client", "modapi", "mojang", "shader", "events", "github", "recipe",
"preinit", "preload", "machine", "reflect", "channel", "general", "handler", "content",
"fastutil", "optifine", "minecraft", "transformers", "universal", "internal", "multipart", "minecraftforge", "override"
"fastutil", "optifine", "minecraft", "transformers", "universal", "internal", "multipart", "minecraftforge", "override", "blockentity"
}.Contains(Word.ToLower) Then Continue For
PossibleWords.Add(Word.Trim)
Next
@@ -819,6 +822,8 @@ NextStack:
Else
ResultString = "游戏似乎因为世界中的某些实体出现了问题。\n\n你可以创建一个新世界,并生成各种实体,观察游戏的运行情况:\n - 若正常运行,则是某些实体导致出错,你或许需要删除该世界。\n - 若仍然出错,问题就可能来自其他原因……\h"
End If
Case CrashReason.OptiFine与Forge不兼容
ResultString = "由于 OptiFine 与当前版本的 Forge 不兼容,导致了游戏崩溃。\n\n请前往 OptiFine 官网(https://optifine.net/downloads)查看 OptiFine 所兼容的 Forge 版本,并严格按照对应版本重新安装游戏。\n经测试,Forge 版本过高或过低都可能导致崩溃。"
Case CrashReason.低版本Forge与高版本Java不兼容
ResultString = "由于低版本 Forge 与当前 Java 不兼容,导致了游戏崩溃。\n\n请尝试以下解决方案:\n - 更新 Forge 到 36.2.26 或更高版本\n - 换用版本低于 8.0.320 的 Java"
Case CrashReason.版本Json中存在多个Forge
@@ -1266,6 +1266,9 @@
RightKeywords.Add(Keyword)
Next
Task.Input.SearchFilter = Join(ArrayNoDouble(RightKeywords), " ").ToLower
'例外项:OptiForge、OptiFabric(拆词后因为包含 Forge/Fabric 导致无法搜到实际的 Mod)
If RawFilter.ToLower.Contains("optiforge") Then Task.Input.SearchFilter = "optiforge"
If RawFilter.ToLower.Contains("optifabric") Then Task.Input.SearchFilter = "optifabric"
Log("[Download] CurseForge 工程列表搜索最终文本:" & Task.Input.SearchFilter, LogLevel.Developer)
'正式获取
Dim Url = Task.Input.GetAddress()
@@ -1163,13 +1163,18 @@ SystemBrowser:
'Authlib-Injector
If McLoginLoader.Output.Type = "Auth" Then
Dim Server As String = Setup.Get("VersionServerAuthServer", Version:=McVersionCurrent)
Dim Response As String = NetGetCodeByRequestRetry(Server, Encoding.UTF8)
DataList.Insert(0, "-javaagent:authlib-injector.jar=" & Server &
Try
Dim Response As String = NetGetCodeByRequestRetry(Server, Encoding.UTF8)
DataList.Insert(0, "-javaagent:authlib-injector.jar=" & Server &
" -Dauthlibinjector.side=client" &
" -Dauthlibinjector.yggdrasil.prefetched=" & Convert.ToBase64String(Encoding.UTF8.GetBytes(Response)))
Catch ex As Exception
Throw New Exception("无法连接到第三方登录服务器(" & If(Server, Nothing) & ")", ex)
End Try
End If
'添加 Java Wrapper 作为主 Jar
If McLaunchJavaSelected.VersionCode >= 9 Then DataList.Add("--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED")
Dim WrapperPath As String = PathAppdata & "JavaWrapper.jar"
If Not File.Exists(WrapperPath) Then
WriteFile(WrapperPath, GetResources("JavaWrapper"))
@@ -1233,10 +1238,19 @@ NextVersion:
" -Dauthlibinjector.side=client" &
" -Dauthlibinjector.yggdrasil.prefetched=" & Convert.ToBase64String(Encoding.UTF8.GetBytes(Response)))
Catch ex As Exception
Throw New Exception("无法连接到第三方登录服务器(" & If(Server, Nothing) & ")")
Throw New Exception("无法连接到第三方登录服务器(" & If(Server, Nothing) & ")", ex)
End Try
End If
'添加 Java Wrapper 作为主 Jar
If McLaunchJavaSelected.VersionCode >= 9 Then DataList.Add("--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED")
Dim WrapperPath As String = PathAppdata & "JavaWrapper.jar"
If Not File.Exists(WrapperPath) Then
WriteFile(WrapperPath, GetResources("JavaWrapper"))
McLaunchLog("已自动释放 Java Wrapper")
End If
DataList.Add("-jar """ & WrapperPath & """")
'将 "-XXX" 与后面 "XXX" 合并到一起
'如果不合并,会导致 Forge 1.17 启动无效,它有两个 --add-exports,进一步导致其中一个在后面被去重
Dim DeDuplicateDataList As New List(Of String)
@@ -1258,14 +1272,6 @@ NextVersion:
'去重
Dim Result As String = Join(ArrayNoDouble(DeDuplicateDataList), " ")
'添加 Java Wrapper 作为主 Jar
Dim WrapperPath As String = PathAppdata & "JavaWrapper.jar"
If Not File.Exists(WrapperPath) Then
WriteFile(WrapperPath, GetResources("JavaWrapper"))
McLaunchLog("已自动释放 Java Wrapper")
End If
Result += " -jar """ & WrapperPath & """"
'添加 MainClass
If Version.JsonObject("mainClass") Is Nothing Then
Throw New Exception("版本 Json 中没有 mainClass 项!")
@@ -1285,9 +1291,6 @@ NextVersion:
If Not BasicString.Contains("--height") Then BasicString += " --height ${resolution_height} --width ${resolution_width}"
DataList.Add(BasicString)
'添加 Wrapper 导出参数
DataList.Add("--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED")
Dim Result As String = Join(DataList, " ")
'特别改变 OptiFineTweaker
@@ -1341,9 +1344,6 @@ NextVersion:
GoTo NextVersion
End If
'添加 Wrapper 导出参数
DataList.Add("--add-exports cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED")
'将 "-XXX" 与后面 "XXX" 合并到一起
'如果不进行合并 Impact 会启动无效,它有两个 --tweakclass
Dim DeDuplicateDataList As New List(Of String)
@@ -592,7 +592,7 @@ UserPass:
'缺失
''' <summary>
''' 提示 Java 缺失并跳转下载。支持 Java 7、8、16。
''' 提示 Java 缺失并跳转下载。支持 Java 7、8、16、17。
''' </summary>
Public Sub JavaMissing(VersionCode As Integer)
Select Case VersionCode
@@ -613,8 +613,8 @@ UserPass:
If Is32BitSystem Then
MyMsgBox("该版本的 MC 已不支持 32 位操作系统。你必须增加内存并重装为 64 位系统才能继续。", "系统兼容性提示")
Else
OpenWebsite("https://www.oracle.com/java/technologies/downloads/#jdk17-windows")
MyMsgBox("PCL2 未找到 Java " & VersionCode & "。" & vbCrLf &
OpenWebsite("https://www.oracle.com/java/technologies/downloads/#java17")
MyMsgBox("PCL2 未找到 Java 17。" & vbCrLf &
"请在打开的网页中选择 x64 Installer,下载并安装。" & vbCrLf &
"安装后在 PCL2 的 设置 → 启动设置 → 游戏 Java 中通过搜索或导入,确保安装的 Java 已列入 Java 列表。",
"未找到 Java")