using Microsoft.VisualBasic.CompilerServices; using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Text.RegularExpressions; namespace PCL { // Token: 0x02000056 RID: 86 [StandardModule] public sealed class ModCrash { // Token: 0x06000275 RID: 629 RVA: 0x00003963 File Offset: 0x00001B63 // Note: this type is marked as 'beforefieldinit'. static ModCrash() { ModCrash._ConfigurationVal = false; ModCrash.m_InterpreterVal = RuntimeHelpers.GetObjectValue(new object()); } // Token: 0x0400010B RID: 267 private static bool _ConfigurationVal; // Token: 0x0400010C RID: 268 private static object m_InterpreterVal; // Token: 0x02000057 RID: 87 public class CrashAnalyzer { // Token: 0x06000276 RID: 630 RVA: 0x00016BF0 File Offset: 0x00014DF0 public CrashAnalyzer(int UUID) { this._ParserRule = new List>(); this._ProxyRule = null; this.setterRule = null; this.merchantRule = null; this.printerRule = new Dictionary>(); this.productRule = new List(); object interpreterVal = ModCrash.m_InterpreterVal; ObjectFlowControl.CheckForSyncLockOnValueType(interpreterVal); lock (interpreterVal) { if (!ModCrash._ConfigurationVal) { try { ModBase.DeleteDirectory(ModBase.m_GlobalRule + "CrashAnalyzer", false); } catch (Exception ex) { ModBase.Log(ex, "清理崩溃分析缓存失败", ModBase.LogLevel.Debug, "出现错误"); } ModCrash._ConfigurationVal = true; } } this.poolRule = string.Concat(new string[] { ModBase.m_GlobalRule, "CrashAnalyzer\\", Conversions.ToString(UUID), Conversions.ToString(ModBase.RandomInteger(0, 0x5F5E0FF)), "\\" }); ModBase.DeleteDirectory(this.poolRule, false); Directory.CreateDirectory(this.poolRule + "Temp\\"); Directory.CreateDirectory(this.poolRule + "Report\\"); ModBase.Log("[Crash] 崩溃分析暂存文件夹:" + this.poolRule, ModBase.LogLevel.Normal, "出现错误"); } // Token: 0x06000277 RID: 631 RVA: 0x00016D54 File Offset: 0x00014F54 public void Collect(string VersionPathIndie, IList LatestLog = null) { ModBase.Log("[Crash] 步骤 1:收集日志文件", ModBase.LogLevel.Normal, "出现错误"); List list = new List(); try { DirectoryInfo directoryInfo = new DirectoryInfo(VersionPathIndie + "crash-reports\\"); if (directoryInfo.Exists) { try { foreach (FileInfo fileInfo in directoryInfo.EnumerateFiles()) { list.Add(fileInfo.FullName); } } finally { IEnumerator enumerator; if (enumerator != null) { enumerator.Dispose(); } } } } catch (Exception ex) { ModBase.Log(ex, "收集 Minecraft 崩溃日志文件夹下的日志失败", ModBase.LogLevel.Debug, "出现错误"); } try { try { foreach (FileInfo fileInfo2 in new DirectoryInfo(VersionPathIndie).Parent.Parent.EnumerateFiles()) { if (Operators.CompareString(fileInfo2.Extension ?? "", ".log", true) == 0) { list.Add(fileInfo2.FullName); } } } finally { IEnumerator enumerator2; if (enumerator2 != null) { enumerator2.Dispose(); } } } catch (Exception ex2) { ModBase.Log(ex2, "收集 Minecraft 主文件夹下的日志失败", ModBase.LogLevel.Debug, "出现错误"); } try { try { foreach (FileInfo fileInfo3 in new DirectoryInfo(VersionPathIndie).EnumerateFiles()) { if (Operators.CompareString(fileInfo3.Extension ?? "", ".log", true) == 0) { list.Add(fileInfo3.FullName); } } } finally { IEnumerator enumerator3; if (enumerator3 != null) { enumerator3.Dispose(); } } } catch (Exception ex3) { ModBase.Log(ex3, "收集 Minecraft 隔离文件夹下的日志失败", ModBase.LogLevel.Debug, "出现错误"); } list.Add(VersionPathIndie + "logs\\latest.log"); list.Add(VersionPathIndie + "logs\\debug.log"); list = ModBase.ArrayNoDouble(list, null); List list2 = new List(); try { foreach (string text in list) { try { FileInfo fileInfo4 = new FileInfo(text); if (fileInfo4.Exists) { double num = Math.Abs((fileInfo4.LastWriteTime - DateTime.Now).TotalMinutes); if (num < 5.0 && fileInfo4.Length > 0L) { list2.Add(text); ModBase.Log(string.Concat(new string[] { "[Crash] 可能可用的日志文件:", text, "(", Conversions.ToString(Math.Round(num, 1)), " 分钟)" }), ModBase.LogLevel.Normal, "出现错误"); } } } catch (Exception ex4) { ModBase.Log(ex4, "确认崩溃日志时间失败(" + text + ")", ModBase.LogLevel.Debug, "出现错误"); } } } finally { List.Enumerator enumerator4; ((IDisposable)enumerator4).Dispose(); } if (list2.Count == 0) { ModBase.Log("[Crash] 未发现可能可用的日志文件", ModBase.LogLevel.Normal, "出现错误"); } try { foreach (string text2 in list2) { try { if (text2.Contains("crash-")) { this._ParserRule.Add(new KeyValuePair(text2, ModBase.ReadFile(text2).Replace("\r\n", "\r").Replace("\n", "\r").Split(new char[] { '\r' }))); } else { this._ParserRule.Add(new KeyValuePair(text2, File.ReadAllLines(text2, Encoding.UTF8))); } } catch (Exception ex5) { ModBase.Log(ex5, "读取可能的崩溃日志文件失败(" + text2 + ")", ModBase.LogLevel.Debug, "出现错误"); } } } finally { List.Enumerator enumerator5; ((IDisposable)enumerator5).Dispose(); } if (LatestLog != null && LatestLog.Count > 0) { string text3 = ModBase.Join((ICollection)LatestLog, "\r\n"); ModBase.Log("[Crash] 以下为游戏输出的最后一段内容:\r\n" + text3, ModBase.LogLevel.Normal, "出现错误"); ModBase.WriteFile(this.poolRule + "RawOutput.log", text3, false, null); this._ParserRule.Add(new KeyValuePair(this.poolRule + "RawOutput.log", LatestLog.ToArray())); LatestLog.Clear(); } ModBase.Log("[Crash] 步骤 1:收集日志文件完成,收集到 " + Conversions.ToString(this._ParserRule.Count) + " 个文件", ModBase.LogLevel.Normal, "出现错误"); } // Token: 0x06000278 RID: 632 RVA: 0x0001723C File Offset: 0x0001543C public void Import(string FilePath) { ModBase.Log("[Crash] 步骤 1:自主导入日志文件", ModBase.LogLevel.Normal, "出现错误"); try { FileInfo fileInfo = new FileInfo(FilePath); if (fileInfo.Exists && fileInfo.Length != 0L) { if (ModBase.ExtractFile(FilePath, this.poolRule + "Temp\\", null)) { ModBase.Log("[Crash] 已解压导入的日志文件:" + FilePath, ModBase.LogLevel.Normal, "出现错误"); } else { File.Copy(FilePath, this.poolRule + "Temp\\" + ModBase.GetFileNameFromPath(FilePath)); ModBase.Log("[Crash] 已复制导入的日志文件:" + FilePath, ModBase.LogLevel.Normal, "出现错误"); } } } catch (Exception ex) { ModBase.Log(ex, "解压导入文件中的压缩包失败", ModBase.LogLevel.Debug, "出现错误"); } try { foreach (FileInfo fileInfo2 in new DirectoryInfo(this.poolRule + "Temp\\").EnumerateFiles()) { try { if (fileInfo2.Exists && fileInfo2.Length != 0L) { string left = fileInfo2.Extension.ToLower(); if (Operators.CompareString(left, ".log", true) == 0 || Operators.CompareString(left, ".txt", true) == 0) { if (fileInfo2.Name.StartsWith("crash-")) { this._ParserRule.Add(new KeyValuePair(fileInfo2.FullName, ModBase.ReadFile(fileInfo2.FullName).Replace("\r\n", "\r").Replace("\n", "\r").Split(new char[] { '\r' }))); } else { this._ParserRule.Add(new KeyValuePair(fileInfo2.FullName, File.ReadAllLines(fileInfo2.FullName, Encoding.UTF8))); } } } } catch (Exception ex2) { ModBase.Log(ex2, "导入单个日志文件失败", ModBase.LogLevel.Debug, "出现错误"); } } } finally { IEnumerator enumerator; if (enumerator != null) { enumerator.Dispose(); } } ModBase.Log("[Crash] 步骤 1:自主导入日志文件,收集到 " + Conversions.ToString(this._ParserRule.Count) + " 个文件", ModBase.LogLevel.Normal, "出现错误"); } // Token: 0x06000279 RID: 633 RVA: 0x000174A4 File Offset: 0x000156A4 public int Prepare() { ModBase.Log("[Crash] 步骤 2:准备日志文本", ModBase.LogLevel.Normal, "出现错误"); List>> list = new List>>(); try { foreach (KeyValuePair value in this._ParserRule) { string fileNameFromPath = ModBase.GetFileNameFromPath(value.Key); ModCrash.CrashAnalyzer.AnalyzeFileType analyzeFileType; if (fileNameFromPath.StartsWith("hs_err")) { analyzeFileType = ModCrash.CrashAnalyzer.AnalyzeFileType.HsErr; } else if (fileNameFromPath.StartsWith("crash-")) { analyzeFileType = ModCrash.CrashAnalyzer.AnalyzeFileType.CrashReport; } else if (Operators.CompareString(fileNameFromPath, "latest.log", true) != 0 && Operators.CompareString(fileNameFromPath, "latest log.txt", true) != 0 && Operators.CompareString(fileNameFromPath, "debug.log", true) != 0 && Operators.CompareString(fileNameFromPath, "debug log.txt", true) != 0 && Operators.CompareString(fileNameFromPath, "rawoutput.log", true) != 0 && Operators.CompareString(fileNameFromPath, "启动器日志.txt", true) != 0 && Operators.CompareString(fileNameFromPath, "log1.txt", true) != 0) { if (!fileNameFromPath.EndsWith(".log") && !fileNameFromPath.EndsWith(".txt")) { ModBase.Log("[Crash] " + fileNameFromPath + " 分类为 Ignore", ModBase.LogLevel.Normal, "出现错误"); continue; } analyzeFileType = ModCrash.CrashAnalyzer.AnalyzeFileType.ExtraLog; } else { analyzeFileType = ModCrash.CrashAnalyzer.AnalyzeFileType.MinecraftLog; } if (value.Value.Count() == 0) { ModBase.Log("[Crash] " + fileNameFromPath + " 由于内容为空跳过", ModBase.LogLevel.Normal, "出现错误"); } else { list.Add(new KeyValuePair>(analyzeFileType, value)); ModBase.Log("[Crash] " + fileNameFromPath + " 分类为 " + ModBase.GetStringFromEnum(analyzeFileType), ModBase.LogLevel.Normal, "出现错误"); } } } finally { List>.Enumerator enumerator; ((IDisposable)enumerator).Dispose(); } checked { foreach (ModCrash.CrashAnalyzer.AnalyzeFileType analyzeFileType2 in new ModCrash.CrashAnalyzer.AnalyzeFileType[] { ModCrash.CrashAnalyzer.AnalyzeFileType.MinecraftLog, ModCrash.CrashAnalyzer.AnalyzeFileType.HsErr, ModCrash.CrashAnalyzer.AnalyzeFileType.ExtraLog, ModCrash.CrashAnalyzer.AnalyzeFileType.CrashReport }) { List> list2 = new List>(); try { foreach (KeyValuePair> keyValuePair in list) { if (analyzeFileType2 == keyValuePair.Key) { list2.Add(keyValuePair.Value); } } } finally { List>>.Enumerator enumerator2; ((IDisposable)enumerator2).Dispose(); } if (list2.Count != 0) { try { switch (analyzeFileType2) { case ModCrash.CrashAnalyzer.AnalyzeFileType.HsErr: case ModCrash.CrashAnalyzer.AnalyzeFileType.CrashReport: break; case ModCrash.CrashAnalyzer.AnalyzeFileType.MinecraftLog: { this._ProxyRule = ""; Dictionary> dictionary = new Dictionary>(); try { foreach (KeyValuePair value2 in list2) { ModBase.DictionaryAdd>(ref dictionary, ModBase.GetFileNameFromPath(value2.Key).ToLower(), value2); this.productRule.Add(value2.Key); ModBase.Log("[Crash] 输出报告:" + value2.Key + ",作为 Minecraft 或启动器日志", ModBase.LogLevel.Normal, "出现错误"); } } finally { List>.Enumerator enumerator3; ((IDisposable)enumerator3).Dispose(); } foreach (string key in new string[] { "rawoutput.log", "启动器日志.txt", "log1.txt" }) { if (dictionary.ContainsKey(key)) { KeyValuePair keyValuePair2 = dictionary[key]; bool flag = false; foreach (string text in keyValuePair2.Value) { if (flag) { ref string ptr = ref this._ProxyRule; this._ProxyRule = ptr + text + "\r\n"; } else if (text.Contains("以下为游戏输出的最后一段内容")) { flag = true; ModBase.Log("[Crash] 找到 PCL2 输出的游戏实时日志头", ModBase.LogLevel.Normal, "出现错误"); } } if (!flag) { ref string ptr = ref this._ProxyRule; this._ProxyRule = ptr + this.GetHeadTailLines(keyValuePair2.Value, 0, 0xC8); } this._ProxyRule = this._ProxyRule.TrimEnd("\r\n".ToCharArray()) + "\r\n["; ModBase.Log("[Crash] 导入分析:" + keyValuePair2.Key + ",作为启动器日志", ModBase.LogLevel.Normal, "出现错误"); IL_3EB: string[] array3 = new string[] { "latest.log", "latest log.txt", "debug.log", "debug log.txt" }; int l = 0; while (l < array3.Length) { string key2 = array3[l]; if (!dictionary.ContainsKey(key2)) { l++; } else { KeyValuePair keyValuePair3 = dictionary[key2]; ref string ptr = ref this._ProxyRule; this._ProxyRule = ptr + this.GetHeadTailLines(keyValuePair3.Value, 0xFA, 0x1F4) + "\r\n["; ModBase.Log("[Crash] 导入分析:" + keyValuePair3.Key + ",作为 Minecraft 日志", ModBase.LogLevel.Normal, "出现错误"); IL_494: if (Operators.CompareString(this._ProxyRule, "", true) == 0) { this._ProxyRule = null; throw new Exception("无法找到匹配的 Minecraft Log"); } goto IL_68B; } } goto IL_494; } } goto IL_3EB; } case ModCrash.CrashAnalyzer.AnalyzeFileType.ExtraLog: try { foreach (KeyValuePair keyValuePair4 in list2) { this.productRule.Add(keyValuePair4.Key); ModBase.Log("[Crash] 输出报告:" + keyValuePair4.Key + ",作为额外日志", ModBase.LogLevel.Normal, "出现错误"); } goto IL_68B; } finally { List>.Enumerator enumerator4; ((IDisposable)enumerator4).Dispose(); } break; default: goto IL_68B; } SortedList> sortedList = new SortedList>(); try { foreach (KeyValuePair value4 in list2) { try { sortedList.Add(new FileInfo(value4.Key).LastWriteTime, value4); } catch (Exception ex) { ModBase.Log(ex, "获取日志文件修改时间失败", ModBase.LogLevel.Debug, "出现错误"); sortedList.Add(new DateTime(0x76C, 1, 1), value4); } } } finally { List>.Enumerator enumerator5; ((IDisposable)enumerator5).Dispose(); } KeyValuePair value5 = sortedList.Last>>().Value; this.productRule.Add(value5.Key); if (analyzeFileType2 == ModCrash.CrashAnalyzer.AnalyzeFileType.HsErr) { this.setterRule = this.GetHeadTailLines(value5.Value, 0xC8, 0x64); ModBase.Log("[Crash] 输出报告:" + value5.Key + ",作为虚拟机错误信息", ModBase.LogLevel.Normal, "出现错误"); ModBase.Log("[Crash] 导入分析:" + value5.Key + ",作为虚拟机错误信息", ModBase.LogLevel.Normal, "出现错误"); } else { this.merchantRule = this.GetHeadTailLines(value5.Value, 0x12C, 0x2BC); ModBase.Log("[Crash] 输出报告:" + value5.Key + ",作为 Minecraft 崩溃报告", ModBase.LogLevel.Normal, "出现错误"); ModBase.Log("[Crash] 导入分析:" + value5.Key + ",作为 Minecraft 崩溃报告", ModBase.LogLevel.Normal, "出现错误"); } IL_68B:; } catch (Exception ex2) { ModBase.Log(ex2, "分类处理日志文件时出错", ModBase.LogLevel.Debug, "出现错误"); } } } int num = ((this._ProxyRule == null) ? 0 : 1) + ((this.setterRule == null) ? 0 : 1) + ((this.merchantRule == null) ? 0 : 1); if (num == 0) { ModBase.Log("[Crash] 步骤 2:准备日志文本完成,没有任何可供分析的日志", ModBase.LogLevel.Normal, "出现错误"); } else { ModBase.Log(("[Crash] 步骤 2:准备日志文本完成,找到" + ((this._ProxyRule == null) ? "" : "游戏日志、") + ((this.setterRule == null) ? "" : "虚拟机日志、") + ((this.merchantRule == null) ? "" : "崩溃日志、")).TrimEnd(new char[] { '、' }) + "用作分析", ModBase.LogLevel.Normal, "出现错误"); } return num; } } // Token: 0x0600027A RID: 634 RVA: 0x00017CC4 File Offset: 0x00015EC4 private string GetHeadTailLines(string[] Raw, int HeadLines, int TailLines) { checked { string result; if (Raw.Length <= HeadLines + TailLines) { result = ModBase.Join(Raw, "\r\n"); } else { StringBuilder stringBuilder = new StringBuilder(); int num = Raw.Count() - 1; for (int i = 0; i <= num; i++) { if ((i < HeadLines || Raw.Count() - i < TailLines) && Operators.CompareString(Raw[i], "", true) != 0) { stringBuilder.Append(Raw[i] + "\r\n"); } } result = stringBuilder.ToString(); } return result; } } // Token: 0x0600027B RID: 635 RVA: 0x00017D40 File Offset: 0x00015F40 public void Analyze(ModMinecraft.McVersion Version = null) { ModBase.Log("[Crash] 步骤 3:分析崩溃原因", ModBase.LogLevel.Normal, "出现错误"); this.eventRule = (this._ProxyRule + this.setterRule + this.merchantRule).ToLower(); this.AnalyzeCrit1(); if (this.printerRule.Count <= 0) { if (!this.eventRule.Contains("forge") && !this.eventRule.Contains("fabric") && !this.eventRule.Contains("liteloader")) { ModBase.Log("[Crash] 可能并未安装 Mod,不进行堆栈分析", ModBase.LogLevel.Normal, "出现错误"); } else { if (this.merchantRule != null) { ModBase.Log("[Crash] 开始进行崩溃日志堆栈分析", ModBase.LogLevel.Normal, "出现错误"); List list = this.AnalyzeStackKeyword(this.merchantRule.Replace("A detailed walkthrough of the error", "¨").Split(new char[] { '¨' }).First()); if (list.Count > 0) { List list2 = this.AnalyzeModName(list); if (list2 == null) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.崩溃日志堆栈分析发现关键字, list); goto IL_1BB; } this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.崩溃日志堆栈分析发现Mod名称, list2); goto IL_1BB; } } if (this._ProxyRule != null) { List list3 = ModBase.RegexSearch(this._ProxyRule, "/FATAL] [\\w\\W]+?(?=[\\n\\r]+\\[)", RegexOptions.None); ModBase.Log("[Crash] 开始进行 Minecraft 日志堆栈分析,发现 " + Conversions.ToString(list3.Count) + " 个报错项", ModBase.LogLevel.Normal, "出现错误"); if (list3.Count > 0) { List list4 = new List(); try { foreach (string errorStack in list3) { list4.AddRange(this.AnalyzeStackKeyword(errorStack)); } } finally { List.Enumerator enumerator; ((IDisposable)enumerator).Dispose(); } if (list4.Count > 0) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.MC日志堆栈分析发现关键字, ModBase.ArrayNoDouble(list4, null)); goto IL_1BB; } } } } this.AnalyzeCrit2(); } IL_1BB: if (this.printerRule.Count == 0) { ModBase.Log("[Crash] 步骤 3:分析崩溃原因完成,未找到可能的原因", ModBase.LogLevel.Normal, "出现错误"); return; } ModBase.Log("[Crash] 步骤 3:分析崩溃原因完成,找到 " + Conversions.ToString(this.printerRule.Count) + " 条可能的原因", ModBase.LogLevel.Normal, "出现错误"); try { foreach (KeyValuePair> keyValuePair in this.printerRule) { ModBase.Log("[Crash] - " + ModBase.GetStringFromEnum(keyValuePair.Key) + ((keyValuePair.Value.Count > 0) ? ("(" + ModBase.Join(keyValuePair.Value, ";") + ")") : ""), ModBase.LogLevel.Normal, "出现错误"); } } finally { Dictionary>.Enumerator enumerator2; ((IDisposable)enumerator2).Dispose(); } } // Token: 0x0600027C RID: 636 RVA: 0x00017FFC File Offset: 0x000161FC private void AppendReason(ModCrash.CrashAnalyzer.CrashReason Reason, ICollection Additional = null) { if (this.printerRule.ContainsKey(Reason)) { if (Additional != null) { this.printerRule[Reason].AddRange(Additional); this.printerRule[Reason] = ModBase.ArrayNoDouble(this.printerRule[Reason], null); } } else { this.printerRule.Add(Reason, new List(Additional ?? new string[0])); } ModBase.Log("[Crash] 可能的崩溃原因:" + ModBase.GetStringFromEnum(Reason) + ((Additional == null || Additional.Count <= 0) ? "" : ("(" + ModBase.Join((ICollection)Additional, ";") + ")")), ModBase.LogLevel.Normal, "出现错误"); } // Token: 0x0600027D RID: 637 RVA: 0x0000397A File Offset: 0x00001B7A private void AppendReason(ModCrash.CrashAnalyzer.CrashReason Reason, string Additional) { List additional; if (!string.IsNullOrEmpty(Additional)) { (additional = new List()).Add(Additional); } else { additional = null; } this.AppendReason(Reason, additional); } // Token: 0x0600027E RID: 638 RVA: 0x000180BC File Offset: 0x000162BC private void AnalyzeCrit1() { if (this._ProxyRule == null && this.setterRule == null && this.merchantRule == null) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.没有可用的分析文件, null); return; } if (this._ProxyRule != null) { if (this._ProxyRule.Contains("The driver does not appear to support OpenGL")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.显卡不支持OpenGL, null); } if (this._ProxyRule.Contains("java.lang.ClassCastException: java.base/jdk")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.使用JDK, null); } if (this._ProxyRule.Contains("java.lang.ClassCastException: class jdk.")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.使用JDK, null); } if (this._ProxyRule.Contains("Open J9 is not supported") || this._ProxyRule.Contains("OpenJ9 is incompatible") || this._ProxyRule.Contains(".J9VMInternals.")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.使用OpenJ9, null); } if (this._ProxyRule.Contains("because module java.base does not export")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Java版本过高, null); } if (this._ProxyRule.Contains("java.lang.ClassNotFoundException: java.lang.invoke.LambdaMetafactory")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Java版本过高, null); } if (this._ProxyRule.Contains("compiled by a more recent version of the Java Runtime")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Java版本过低, null); } if (this._ProxyRule.Contains("The directories below appear to be extracted jar files. Fix this before you continue.")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Mod文件被解压, null); } if (this._ProxyRule.Contains("Extracted mod jars found, loading will NOT continue")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Mod文件被解压, null); } if (this._ProxyRule.Contains("Couldn't set pixel format")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.显卡驱动不支持导致无法设置像素格式, null); } if (this._ProxyRule.Contains("java.lang.OutOfMemoryError")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.内存不足, null); } if (this._ProxyRule.Contains("1282: Invalid operation")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.光影或资源包导致OpenGL1282错误, null); } if (this._ProxyRule.Contains("signer information does not match signer information of other classes in the same package")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.文件或内容校验失败, (ModBase.RegexSeek(this._ProxyRule, "(?<=class \")[^']+(?=\"'s signer information)", RegexOptions.None) ?? "").TrimEnd(new char[] { '\r' })); } if (this._ProxyRule.Contains("An exception was thrown, the game will display an error screen and halt.")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Forge报错, (ModBase.RegexSeek(this._ProxyRule, "(?<=the game will display an error screen and halt[\\s\\S]+?Exception: )[\\s\\S]+?(?=\\n\\tat)", RegexOptions.None) ?? "").TrimEnd(new char[] { '\r' })); } if (this._ProxyRule.Contains("Maybe try a lower resolution resourcepack?")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.材质过大或显卡配置不足, null); } if (this._ProxyRule.Contains("java.lang.NoSuchMethodError: net.minecraft.world.server.ChunkManager$ProxyTicketManager.shouldForceTicks(J)Z") && this._ProxyRule.Contains("OptiFine")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.OptiFine导致无法加载世界, null); } if (this._ProxyRule.Contains("Could not reserve enough space")) { if (this._ProxyRule.Contains("for 1048576KB object heap")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.使用32位Java导致JVM无法分配足够多的内存, null); } else { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.内存不足, null); } } if (this._ProxyRule.Contains("DuplicateModsFoundException")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Mod重复安装, ModBase.RegexSearch(this._ProxyRule, "(?<=\\n\\t[\\w]+ : [A-Z]{1}:[^\\n]+(/|\\\\))[^/\\\\\\n]+?.jar", RegexOptions.IgnoreCase)); } if (this._ProxyRule.Contains("Found a duplicate mod")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Mod重复安装, ModBase.RegexSearch(ModBase.RegexSeek(this._ProxyRule, "Found a duplicate mod[^\\n]+", RegexOptions.None) ?? "", "[^\\\\/]+.jar", RegexOptions.IgnoreCase)); } if (this._ProxyRule.Contains("ModResolutionException: Duplicate")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Mod重复安装, ModBase.RegexSearch(ModBase.RegexSeek(this._ProxyRule, "ModResolutionException: Duplicate[^\\n]+", RegexOptions.None) ?? "", "[^\\\\/]+.jar", RegexOptions.IgnoreCase)); } if ((ModBase.RegexCheck(this._ProxyRule, "^[^\\n.]+.\\w+.[^\\n]+\\n\\[$", RegexOptions.None) || ModBase.RegexCheck(this._ProxyRule, "^\\[[^\\]]+\\] [^\\n.]+.\\w+.[^\\n]+\\n\\[", RegexOptions.None)) && !this._ProxyRule.Contains("at net.") && !this._ProxyRule.Contains("/INFO]") && this.setterRule == null && this.merchantRule == null) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.路径包含中文且存在编码问题导致找不到或无法加载主类, null); } if (this._ProxyRule.Contains("Mixin prepare failed ")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃, this.TryAnalyzeModName((ModBase.RegexSeek(this._ProxyRule, "(?<=in )[^. ]+(?=.mixins.json)", RegexOptions.None) ?? "").TrimEnd("\r\n ".ToCharArray()))); } if (this._ProxyRule.Contains("Caught exception from ")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃, this.TryAnalyzeModName((ModBase.RegexSeek(this._ProxyRule, "(?<=Caught exception from )[^\\n]+", RegexOptions.None) ?? "").TrimEnd("\r\n ".ToCharArray()))); } if (this._ProxyRule.Contains("Failed to create Mod instance.")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Mod初始化失败, this.TryAnalyzeModName((ModBase.RegexSeek(this._ProxyRule, "(?<=Failed to create mod instance. ModID: )[^,]+", RegexOptions.None) ?? "").TrimEnd(new char[] { '\r' }))); } } if (this.setterRule != null) { if (this.setterRule.Contains("The system is out of physical RAM or swap space")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.内存不足, null); } if (this.setterRule.Contains("Out of Memory Error")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.内存不足, null); } if (this.setterRule.Contains("EXCEPTION_ACCESS_VIOLATION")) { if (this.setterRule.Contains("# C [ig")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Intel驱动不兼容导致EXCEPTION_ACCESS_VIOLATION, null); } if (this.setterRule.Contains("# C [atio")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.AMD驱动不兼容导致EXCEPTION_ACCESS_VIOLATION, null); } if (this.setterRule.Contains("# C [nvoglv")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Nvidia驱动不兼容导致EXCEPTION_ACCESS_VIOLATION, null); } } } if (this.merchantRule != null) { if (this.merchantRule.Contains("Entity being rendered") && this.merchantRule.Contains("\tEntity's Exact location: ")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.特定实体导致崩溃, ModBase.RegexSeek(this.merchantRule, "(?<=\\tEntity Type: )[^\\n]+(?= \\()", RegexOptions.None) + " (" + (ModBase.RegexSeek(this.merchantRule, "(?<=\\tEntity's Exact location: )[^\\n]+", RegexOptions.None) ?? "").TrimEnd("\r\n".ToCharArray()) + ")"); } if (this.merchantRule.Contains("java.lang.OutOfMemoryError")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.内存不足, null); } if (this.merchantRule.Contains("Pixel format not accelerated")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.显卡驱动不支持导致无法设置像素格式, null); } if (this.merchantRule.Contains("Manually triggered debug crash")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.玩家手动触发调试崩溃, null); } if (this.merchantRule.Contains("Multiple entries with same key: ")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃, this.TryAnalyzeModName((ModBase.RegexSeek(this.merchantRule, "(?<=Multiple entries with same key: )[^=]+", RegexOptions.None) ?? "").TrimEnd("\r\n ".ToCharArray()))); } if (this.merchantRule.Contains("LoaderExceptionModCrash: Caught exception from ")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃, this.TryAnalyzeModName((ModBase.RegexSeek(this.merchantRule, "(?<=LoaderExceptionModCrash: Caught exception from )[^\\n]+", RegexOptions.None) ?? "").TrimEnd("\r\n ".ToCharArray()))); } if (this.merchantRule.Contains("Failed loading config file ")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Mod配置文件导致游戏崩溃, new string[] { this.TryAnalyzeModName((ModBase.RegexSeek(this.merchantRule, "(?<=Failed loading config file .+ for modid )[^\\n]+", RegexOptions.None) ?? "").TrimEnd(new char[] { '\r' })).First(), (ModBase.RegexSeek(this.merchantRule, "(?<=Failed loading config file ).+(?= of type)", RegexOptions.None) ?? "").TrimEnd(new char[] { '\r' }) }); } } } // Token: 0x0600027F RID: 639 RVA: 0x000187CC File Offset: 0x000169CC private void AnalyzeCrit2() { if (this._ProxyRule != null && this._ProxyRule.Contains("]: Warnings were found!")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.Fabric报错, (ModBase.RegexSeek(this._ProxyRule, "(?<=\\]: Warnings were found! ?[\\n\\r]+)[\\w\\W]+?(?=[\\n\\r]+\\[)", RegexOptions.None) ?? "").Trim("\r\n".ToCharArray())); } if (this.merchantRule != null) { if (this.merchantRule.Contains("\tBlock location: World: ")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.特定方块导致崩溃, ModBase.RegexSeek(this.merchantRule, "(?<=\\tBlock: Block\\{)[^\\}]+", RegexOptions.None) + " " + ModBase.RegexSeek(this.merchantRule, "(?<=\\tBlock location: World: )\\([^\\)]+\\)", RegexOptions.None)); } if (this.merchantRule.Contains("\tEntity's Exact location: ")) { this.AppendReason(ModCrash.CrashAnalyzer.CrashReason.特定实体导致崩溃, ModBase.RegexSeek(this.merchantRule, "(?<=\\tEntity Type: )[^\\n]+(?= \\()", RegexOptions.None) + " (" + (ModBase.RegexSeek(this.merchantRule, "(?<=\\tEntity's Exact location: )[^\\n]+", RegexOptions.None) ?? "").TrimEnd("\r\n".ToCharArray()) + ")"); } } } // Token: 0x06000280 RID: 640 RVA: 0x000188D8 File Offset: 0x00016AD8 private List AnalyzeStackKeyword(string ErrorStack) { List list = ModBase.RegexSearch(ErrorStack + "\r\n", "(?<=\\n[^{]+)[a-zA-Z]+\\w+\\.[a-zA-Z]+[\\w\\.]+(?=\\.[\\w\\.$]+\\.)", RegexOptions.None); List list2 = new List(); try { List.Enumerator enumerator = list.GetEnumerator(); IL_FE: while (enumerator.MoveNext()) { string text = enumerator.Current; foreach (string value in new string[] { "java", "sun", "javax", "jdk", "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", "MojangTricksIntelDriversForPerformance_javaw" }) { if (text.StartsWith(value)) { goto IL_FE; } } list2.Add(text.Trim()); } } finally { List.Enumerator enumerator; ((IDisposable)enumerator).Dispose(); } list2 = ModBase.ArrayNoDouble(list2, null); ModBase.Log("[Crash] 找到 " + Conversions.ToString(list2.Count) + " 条可能的堆栈信息", ModBase.LogLevel.Normal, "出现错误"); checked { List result; if (list2.Count == 0) { result = new List(); } else { try { foreach (string str in list2) { ModBase.Log("[Crash] - " + str, ModBase.LogLevel.Normal, "出现错误"); } } finally { List.Enumerator enumerator2; ((IDisposable)enumerator2).Dispose(); } List list3 = new List(); try { foreach (string text2 in list2) { string[] array2 = text2.Split(new char[] { '.' }); int num = Math.Min(3, array2.Count() - 1); for (int j = 0; j <= num; j++) { string text3 = array2[j]; if (text3.Length > 2 && !text3.StartsWith("func_") && !new string[] { "com", "org", "net", "asm", "fml", "mod", "jar", "sun", "lib", "map", "gui", "dev", "nio", "api", "core", "init", "mods", "main", "file", "game", "load", "read", "done", "util", "tile", "item", "forge", "setup", "block", "model", "mixin", "event", "common", "server", "config", "loader", "launch", "entity", "assist", "client", "modapi", "mojang", "shader", "events", "github", "preinit", "preload", "machine", "reflect", "channel", "general", "optifine", "minecraft", "transformers", "universal", "internal" }.Contains(text3.ToLower())) { list3.Add(text3.Trim()); } } } } finally { List.Enumerator enumerator3; ((IDisposable)enumerator3).Dispose(); } list3 = ModBase.ArrayNoDouble(list3, null); ModBase.Log("[Crash] 从堆栈信息中找到 " + Conversions.ToString(list3.Count) + " 个可能的 Mod ID 关键词", ModBase.LogLevel.Normal, "出现错误"); if (list3.Count > 0) { ModBase.Log("[Crash] - " + ModBase.Join(list3, ", "), ModBase.LogLevel.Normal, "出现错误"); } if (list3.Count > 0xA) { ModBase.Log("[Crash] 关键词过多,考虑匹配出错,不纳入考虑", ModBase.LogLevel.Normal, "出现错误"); result = new List(); } else { result = list3; } } return result; } } // Token: 0x06000281 RID: 641 RVA: 0x00018DF0 File Offset: 0x00016FF0 private List AnalyzeModName(List Keywords) { List list = new List(); List list2 = new List(); try { foreach (string text in Keywords) { foreach (string text2 in text.Split(new char[] { '(' })) { list2.Add(text2.Trim(" )".ToCharArray())); } } } finally { List.Enumerator enumerator; ((IDisposable)enumerator).Dispose(); } Keywords = list2; List result; if (this.merchantRule == null) { result = null; } else if (!this.merchantRule.Contains("A detailed walkthrough of the error")) { result = null; } else { string text3 = this.merchantRule.Replace("A detailed walkthrough of the error", "¨"); bool flag; if (flag = text3.Contains("Fabric Mods")) { text3 = text3.Replace("Fabric Mods", "¨"); ModBase.Log("[Crash] 检测到 Fabric Mod 信息格式", ModBase.LogLevel.Normal, "出现错误"); } text3 = text3.Split(new char[] { '¨' }).Last(); List list3 = new List(); foreach (string text4 in text3.Replace("\r\n", "\r").Split(new char[] { '\r' })) { if (text4.ToLower().Contains(".jar") || (flag && text4.StartsWith("\t\t") && !ModBase.RegexCheck(text4, "\\t\\tfabric[\\w-]*: Fabric", RegexOptions.None))) { list3.Add(text4); } } ModBase.Log("[Crash] 找到 " + Conversions.ToString(list3.Count) + " 个可能的 Mod 项目行", ModBase.LogLevel.Normal, "出现错误"); List list4 = new List(); try { foreach (string text5 in Keywords) { try { foreach (string text6 in list3) { string text7 = text6.ToLower().Replace("_", ""); if (text7.Contains(text5.ToLower().Replace("_", "")) && !text7.Contains("minecraft.jar") && !text7.Contains(" forge-")) { list4.Add(text6.Trim("\r\n".ToCharArray())); break; } } } finally { List.Enumerator enumerator3; ((IDisposable)enumerator3).Dispose(); } } } finally { List.Enumerator enumerator2; ((IDisposable)enumerator2).Dispose(); } list4 = ModBase.ArrayNoDouble(list4, null); ModBase.Log("[Crash] 找到 " + Conversions.ToString(list4.Count) + " 个可能的崩溃 Mod 匹配行", ModBase.LogLevel.Normal, "出现错误"); try { foreach (string str in list4) { ModBase.Log("[Crash] - " + str, ModBase.LogLevel.Normal, "出现错误"); } } finally { List.Enumerator enumerator4; ((IDisposable)enumerator4).Dispose(); } try { foreach (string str2 in list4) { string text8; if (flag) { text8 = ModBase.RegexSeek(str2, "(?<=: )[^\\n]+(?= [^\\n]+)", RegexOptions.None); } else { text8 = ModBase.RegexSeek(str2, "(?<=\\()[^\\t]+.jar(?=\\))|(?<=(\\t\\t)|(\\| ))[^\\t\\|]+.jar", RegexOptions.IgnoreCase); } if (text8 != null) { list.Add(text8); } } } finally { List.Enumerator enumerator5; ((IDisposable)enumerator5).Dispose(); } list = ModBase.ArrayNoDouble(list, null); ModBase.Log("[Crash] 找到 " + Conversions.ToString(list.Count) + " 个可能的崩溃 Mod 文件名", ModBase.LogLevel.Normal, "出现错误"); try { foreach (string str3 in list) { ModBase.Log("[Crash] - " + str3, ModBase.LogLevel.Normal, "出现错误"); } } finally { List.Enumerator enumerator6; ((IDisposable)enumerator6).Dispose(); } result = ((list.Count == 0) ? null : list); } return result; } // Token: 0x06000282 RID: 642 RVA: 0x00019218 File Offset: 0x00017418 private List TryAnalyzeModName(string Keywords) { List list = new List { Keywords }; List result; if (string.IsNullOrEmpty(Keywords)) { result = list; } else { result = (this.AnalyzeModName(list) ?? list); } return result; } // Token: 0x06000283 RID: 643 RVA: 0x0001924C File Offset: 0x0001744C public void Output(bool IsHandAnalyze, List ExtraFiles = null) { ModMain.m_GetterFilter.ShowWindowToTop(); int num = ModMain.MyMsgBox(this.GetAnalyzeResult(IsHandAnalyze), IsHandAnalyze ? "错误报告分析结果" : "Minecraft 出现错误", "确定", IsHandAnalyze ? "" : "导出错误报告", "", false, true, false); if (num == 2) { ModCrash.CrashAnalyzer._Closure$__23-0 CS$<>8__locals1 = new ModCrash.CrashAnalyzer._Closure$__23-0(CS$<>8__locals1); CS$<>8__locals1.$VB$Local_FileAddress = null; try { ModBase.RunInUiWait(delegate() { CS$<>8__locals1.$VB$Local_FileAddress = ModBase.SelectAs("选择保存位置", "错误报告-" + DateTime.Now.ToString("G").Replace("/", "-").Replace(":", ".").Replace(" ", "_") + ".zip", "Minecraft 错误报告(*.zip)|*.zip", null); }); if (string.IsNullOrEmpty(CS$<>8__locals1.$VB$Local_FileAddress)) { return; } if (File.Exists(CS$<>8__locals1.$VB$Local_FileAddress)) { File.Delete(CS$<>8__locals1.$VB$Local_FileAddress); } ModBase.FeedbackInfo(); ModBase.LogFlush(); if (ExtraFiles != null) { this.productRule.AddRange(ExtraFiles); } try { foreach (string text in this.productRule) { try { string text2 = ModBase.GetFileNameFromPath(text); string left = text2; if (Operators.CompareString(left, "LatestLaunch.bat", true) == 0) { text2 = "启动脚本.bat"; } else if (Operators.CompareString(left, "Log1.txt", true) == 0) { text2 = "PCL2 启动器日志.txt"; } else if (Operators.CompareString(left, "RawOutput.log", true) == 0) { text2 = "游戏崩溃前的输出.txt"; } File.Copy(text, this.poolRule + "Report\\" + text2, true); } catch (Exception ex) { ModBase.Log(ex, "复制错误报告文件失败(" + text + ")", ModBase.LogLevel.Debug, "出现错误"); } } } finally { List.Enumerator enumerator; ((IDisposable)enumerator).Dispose(); } ZipFile.CreateFromDirectory(this.poolRule + "Report\\", CS$<>8__locals1.$VB$Local_FileAddress); ModBase.DeleteDirectory(this.poolRule + "Report\\", false); ModMain.Hint("错误报告已导出!", ModMain.HintType.Finish, true); } catch (Exception ex2) { ModBase.Log(ex2, "导出错误报告失败", ModBase.LogLevel.Feedback, "出现错误"); return; } try { Process.Start("explorer", "/select," + CS$<>8__locals1.$VB$Local_FileAddress); } catch (Exception ex3) { ModBase.Log(ex3, "打开错误报告的存放文件夹失败", ModBase.LogLevel.Debug, "出现错误"); } } } // Token: 0x06000284 RID: 644 RVA: 0x000194D8 File Offset: 0x000176D8 private string GetAnalyzeResult(bool IsHandAnalyze) { string result; if (this.printerRule.Count == 0) { if (IsHandAnalyze) { result = "很抱歉,PCL2 无法确定错误原因。"; } else { result = "很抱歉,你的游戏出现了一些问题……\r\n如果要寻求帮助,请向他人发送错误报告文件,而不是发送这个窗口的截图。\r\n你也可以查看错误报告,其中可能会有出错的原因。"; } } else { if (this.printerRule.Count >= 2) { ModMain.Hint("错误分析时发现数个可能的原因,窗口中仅显示了第一条,你可以在启动器日志中检查更多可能的原因!", ModMain.HintType.Finish, true); } List value = this.printerRule.First>>().Value; string text; switch (this.printerRule.First>>().Key) { case ModCrash.CrashAnalyzer.CrashReason.Mod文件被解压: text = "由于 Mod 文件被解压了,导致游戏无法继续运行。\\n直接把整个 Mod 文件放进 Mod 文件夹中即可,若解压就会导致游戏出错。\\n\\n请删除 Mod 文件夹中已被解压的 Mod,然后再启动游戏。"; break; case ModCrash.CrashAnalyzer.CrashReason.内存不足: text = "Minecraft 内存不足,导致其无法继续运行。\\n这很可能是由于你为游戏分配的内存不足,或是游戏的配置要求过高。\\n\\n你可以在启动设置中增加为游戏分配的内存,删除配置要求较高的材质、Mod、光影。\\n如果这依然不奏效,请在开始游戏前尽量关闭其他软件,或者……换台电脑?\\h"; break; case ModCrash.CrashAnalyzer.CrashReason.使用JDK: text = "游戏似乎因为使用 JDK,或 Java 版本过高而崩溃了。\\n请在启动设置的 Java 选择一项中改用 JRE 8(Java 8),然后再启动游戏。\\n如果你没有安装 JRE 8,你可以从网络中下载、安装一个。"; break; case ModCrash.CrashAnalyzer.CrashReason.显卡不支持OpenGL: case ModCrash.CrashAnalyzer.CrashReason.显卡驱动不支持导致无法设置像素格式: case ModCrash.CrashAnalyzer.CrashReason.Intel驱动不兼容导致EXCEPTION_ACCESS_VIOLATION: case ModCrash.CrashAnalyzer.CrashReason.AMD驱动不兼容导致EXCEPTION_ACCESS_VIOLATION: case ModCrash.CrashAnalyzer.CrashReason.Nvidia驱动不兼容导致EXCEPTION_ACCESS_VIOLATION: if (this.eventRule.Contains("hd graphics ")) { text = "你的显卡驱动存在问题,或未使用独立显卡,导致游戏无法正常运行。\\n\\n如果你的电脑存在独立显卡,请使用独立显卡而非 Intel 核显启动 PCL2 与 Minecraft。\\n如果问题依然存在,请尝试升级你的显卡驱动到最新版本,或回退到出厂版本。\\h"; } else { text = "你的显卡驱动存在问题,导致游戏无法正常运行。\\n\\n请尝试升级你的显卡驱动到最新版本,或回退到出厂版本,然后再启动游戏。\\n如果问题依然存在,那么你可能需要换个更好的显卡……\\h"; } break; case ModCrash.CrashAnalyzer.CrashReason.使用OpenJ9: text = "游戏因为使用 Open J9 而崩溃了。\\n请在启动设置的 Java 选择一项中改用非 OpenJ9 的 Java 8,然后再启动游戏。\\n如果你没有安装 JRE 8,你可以从网络中下载、安装一个。"; break; case ModCrash.CrashAnalyzer.CrashReason.Java版本过高: text = "游戏似乎因为你所使用的 Java 版本过高而崩溃了。\\n请在启动设置的 Java 选择一项中改用 JRE 8(Java 8),然后再启动游戏。\\n如果你没有安装 JRE 8,你可以从网络中下载、安装一个。"; break; case ModCrash.CrashAnalyzer.CrashReason.Java版本过低: text = "游戏因为你所使用的 Java 版本过低而崩溃了。\\n请在启动设置的 Java 选择一项中改用适宜版本的 Java,然后再启动游戏。"; break; case ModCrash.CrashAnalyzer.CrashReason.路径包含中文且存在编码问题导致找不到或无法加载主类: text = "由于游戏路径含有中文字符,且 Java 或系统编码存在错误,导致游戏无法运行。\\n\\n解决这一问题的最简单方法是检查游戏的完整路径,并删除各个文件夹名中的中文字符。\\n这包括了游戏的版本名、它所处的 .minecraft 文件夹及其之前的文件夹名。\\h"; break; case ModCrash.CrashAnalyzer.CrashReason.玩家手动触发调试崩溃: text = "* 事实上,你的游戏没有任何问题,这是你自己触发的崩溃。\\n* 你难道没有更重要的事要做吗?"; break; case ModCrash.CrashAnalyzer.CrashReason.光影或资源包导致OpenGL1282错误: text = "你所使用的光影或材质导致游戏出现了一些问题……\\n\\n请尝试删除你所添加的这些额外资源。\\h"; break; case ModCrash.CrashAnalyzer.CrashReason.文件或内容校验失败: text = "部分文件或内容校验失败,导致游戏出现了问题。\\n\\n请尝试删除游戏(包括 Mod)并重新下载,或尝试在重新下载时使用 VPN。\\h"; break; case ModCrash.CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃: if (value.Count == 1) { text = "名称或 ID 为 " + value.First() + " 的 Mod 导致了游戏出错。\\n\\e\\h"; } else { text = "以下 Mod 导致了游戏出错:\\n - " + ModBase.Join(value, "\\n - ") + "\\n\\e\\h"; } break; case ModCrash.CrashAnalyzer.CrashReason.Mod配置文件导致游戏崩溃: if (value[1] == null) { text = "名称或 ID 为 " + value.First() + " 的 Mod 导致了游戏出错。\\n\\e\\h"; } else { text = string.Concat(new string[] { "名称或 ID 为 ", value.First(), " 的 Mod 导致了游戏出错:\\n其配置文件 ", value[1], " 存在异常,无法读取。" }); } break; case ModCrash.CrashAnalyzer.CrashReason.Mod初始化失败: if (value.Count == 1) { text = "名为 " + value.First() + " 的 Mod 初始化失败,导致游戏无法继续加载。\\n\\e\\h"; } else { text = "以下 Mod 初始化失败,导致游戏无法继续加载:\\n - " + ModBase.Join(value, "\\n - ") + "\\n\\e\\h"; } break; case ModCrash.CrashAnalyzer.CrashReason.崩溃日志堆栈分析发现关键字: case ModCrash.CrashAnalyzer.CrashReason.MC日志堆栈分析发现关键字: if (value.Count == 1) { text = "你的游戏遇到了一些问题,这可能是某些 Mod 所引起的,PCL2 找到了一个可疑的关键词:" + value.First() + "。\\n\\n如果你知道它对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\\h"; } else { text = "你的游戏遇到了一些问题,这可能是某些 Mod 所引起的,PCL2 找到了以下可疑的关键词:\\n - " + ModBase.Join(value, ", ") + "\\n\\n如果你知道这些关键词对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\\h"; } break; case ModCrash.CrashAnalyzer.CrashReason.崩溃日志堆栈分析发现Mod名称: if (value.Count == 1) { text = "名为 " + value.First() + " 的 Mod 可能导致了游戏出错。\\n\\e\\h"; } else { text = "可能是以下 Mod 导致了游戏出错:\\n - " + ModBase.Join(value, "\\n - ") + "\\n\\e\\h"; } break; case ModCrash.CrashAnalyzer.CrashReason.OptiFine导致无法加载世界: text = "你所使用的 OptiFine 可能导致了你的游戏出现问题。\\n\\n该问题只在特定 OptiFine 版本中出现,你可以尝试更换 OptiFine 的版本。\\h"; break; case ModCrash.CrashAnalyzer.CrashReason.特定方块导致崩溃: if (value.Count == 1) { text = "游戏似乎因为方块 " + value.First() + " 出现了问题。\\n\\n你可以创建一个新世界,并观察游戏的运行情况:\\n - 若正常运行,则是该方块导致出错,你或许需要使用一些方式删除此方块。\\n - 若仍然出错,问题就可能来自其他原因……\\h"; } else { text = "游戏似乎因为世界中的某些方块出现了问题。\\n\\n你可以创建一个新世界,并观察游戏的运行情况:\\n - 若正常运行,则是某些方块导致出错,你或许需要删除该世界。\\n - 若仍然出错,问题就可能来自其他原因……\\h"; } break; case ModCrash.CrashAnalyzer.CrashReason.特定实体导致崩溃: if (value.Count == 1) { text = "游戏似乎因为实体 " + value.First() + " 出现了问题。\\n\\n你可以创建一个新世界,并生成一个该实体,然后观察游戏的运行情况:\\n - 若正常运行,则是该实体导致出错,你或许需要使用一些方式删除此实体。\\n - 若仍然出错,问题就可能来自其他原因……\\h"; } else { text = "游戏似乎因为世界中的某些实体出现了问题。\\n\\n你可以创建一个新世界,并生成各种实体,观察游戏的运行情况:\\n - 若正常运行,则是某些实体导致出错,你或许需要删除该世界。\\n - 若仍然出错,问题就可能来自其他原因……\\h"; } break; case ModCrash.CrashAnalyzer.CrashReason.材质过大或显卡配置不足: text = "你所使用的材质分辨率过高,或显卡配置不足,导致游戏无法继续运行。\\n\\n如果你正在使用高清材质,请将它移除。\\n如果你没有使用材质,那么你可能需要更新显卡驱动,或者换个更好的显卡……\\h"; break; case ModCrash.CrashAnalyzer.CrashReason.没有可用的分析文件: text = "你的游戏出现了一些问题,但 PCL2 未能找到相关记录文件,因此无法进行分析。\\h"; break; case ModCrash.CrashAnalyzer.CrashReason.使用32位Java导致JVM无法分配足够多的内存: if (Environment.Is64BitOperatingSystem) { text = "你似乎正在使用 32 位 Java,这会导致 Minecraft 无法使用 1GB 以上的内存,进而造成崩溃。\\n\\n请在启动设置的 Java 选择一项中改用 64 位的 Java 再启动游戏,然后再启动游戏。\\n如果你没有安装 64 位的 Java,你可以从网络中下载、安装一个。"; } else { text = "你正在使用 32 位的操作系统,这会导致 Minecraft 无法使用 1GB 以上的内存,进而造成崩溃。\\n\\n你或许只能重装 64 位的操作系统来解决此问题。\\n如果你的电脑内存在 2GB 以内,那或许只能换台电脑了……\\h"; } break; case ModCrash.CrashAnalyzer.CrashReason.Mod重复安装: if (value.Count >= 2) { text = "你重复安装了多个相同的 Mod:\\n - " + ModBase.Join(value, "\\n - ") + "\\n\\n每个 Mod 只能出现一次,请删除重复的 Mod,然后再启动游戏。"; } else { text = "你可能重复安装了多个相同的 Mod,导致游戏无法继续加载。\\n\\n每个 Mod 只能出现一次,请删除重复的 Mod,然后再启动游戏。\\e\\h"; } break; case ModCrash.CrashAnalyzer.CrashReason.Fabric报错: if (value.Count == 1) { text = "Fabric 提供了以下错误信息:\\n" + value.First() + "\\n\\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。"; } else { text = "Fabric 可能已经提供了报错信息,请根据信息进行对应处理,如果看不懂英文可以使用翻译软件。\\n如果没有看到报错信息,可以查看错误报告了解错误具体是如何发生的。\\h"; } break; case ModCrash.CrashAnalyzer.CrashReason.Forge报错: if (value.Count == 1) { text = "Forge 提供了以下错误信息:\\n" + value.First() + "\\n\\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。"; } else { text = "Forge 可能已经提供了报错信息,请根据信息进行对应处理,如果看不懂英文可以使用翻译软件。\\n如果没有看到报错信息,可以查看错误报告了解错误具体是如何发生的。\\h"; } break; default: text = "PCL2 获取到了没有详细信息的错误原因(" + Conversions.ToString((int)this.printerRule.First>>().Key) + "),请向 PCL2 作者提交反馈以获取详情。\\h"; break; } text = text.Replace("\\n", "\r\n").Replace("\\h", IsHandAnalyze ? "" : "\r\n如果要寻求帮助,请向他人发送错误报告文件,而不是发送这个窗口的截图。").Replace("\\e", IsHandAnalyze ? "" : "\r\n你可以查看错误报告了解错误具体是如何发生的。"); result = text.Trim("\r\n".ToCharArray()); } return result; } // Token: 0x0400010D RID: 269 private string poolRule; // Token: 0x0400010E RID: 270 private List> _ParserRule; // Token: 0x0400010F RID: 271 private string _ProxyRule; // Token: 0x04000110 RID: 272 private string setterRule; // Token: 0x04000111 RID: 273 private string merchantRule; // Token: 0x04000112 RID: 274 private string eventRule; // Token: 0x04000113 RID: 275 private Dictionary> printerRule; // Token: 0x04000114 RID: 276 private List productRule; // Token: 0x02000058 RID: 88 private enum AnalyzeFileType { // Token: 0x04000116 RID: 278 HsErr, // Token: 0x04000117 RID: 279 MinecraftLog, // Token: 0x04000118 RID: 280 ExtraLog, // Token: 0x04000119 RID: 281 CrashReport } // Token: 0x02000059 RID: 89 private enum CrashReason { // Token: 0x0400011B RID: 283 Mod文件被解压, // Token: 0x0400011C RID: 284 内存不足, // Token: 0x0400011D RID: 285 使用JDK, // Token: 0x0400011E RID: 286 显卡不支持OpenGL, // Token: 0x0400011F RID: 287 使用OpenJ9, // Token: 0x04000120 RID: 288 Java版本过高, // Token: 0x04000121 RID: 289 Java版本过低, // Token: 0x04000122 RID: 290 显卡驱动不支持导致无法设置像素格式, // Token: 0x04000123 RID: 291 路径包含中文且存在编码问题导致找不到或无法加载主类, // Token: 0x04000124 RID: 292 Intel驱动不兼容导致EXCEPTION_ACCESS_VIOLATION, // Token: 0x04000125 RID: 293 AMD驱动不兼容导致EXCEPTION_ACCESS_VIOLATION, // Token: 0x04000126 RID: 294 Nvidia驱动不兼容导致EXCEPTION_ACCESS_VIOLATION, // Token: 0x04000127 RID: 295 玩家手动触发调试崩溃, // Token: 0x04000128 RID: 296 光影或资源包导致OpenGL1282错误, // Token: 0x04000129 RID: 297 文件或内容校验失败, // Token: 0x0400012A RID: 298 确定Mod导致游戏崩溃, // Token: 0x0400012B RID: 299 Mod配置文件导致游戏崩溃, // Token: 0x0400012C RID: 300 Mod初始化失败, // Token: 0x0400012D RID: 301 崩溃日志堆栈分析发现关键字, // Token: 0x0400012E RID: 302 崩溃日志堆栈分析发现Mod名称, // Token: 0x0400012F RID: 303 MC日志堆栈分析发现关键字, // Token: 0x04000130 RID: 304 OptiFine导致无法加载世界, // Token: 0x04000131 RID: 305 特定方块导致崩溃, // Token: 0x04000132 RID: 306 特定实体导致崩溃, // Token: 0x04000133 RID: 307 材质过大或显卡配置不足, // Token: 0x04000134 RID: 308 没有可用的分析文件, // Token: 0x04000135 RID: 309 使用32位Java导致JVM无法分配足够多的内存, // Token: 0x04000136 RID: 310 Mod重复安装, // Token: 0x04000137 RID: 311 Fabric报错, // Token: 0x04000138 RID: 312 Forge报错 } } } }