CrashAnalyzer.cs 89 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.IO.Compression;
  5. using System.Linq;
  6. using System.Runtime.CompilerServices;
  7. using System.Text;
  8. using Microsoft.VisualBasic.CompilerServices;
  9. namespace PCL
  10. {
  11. // Token: 0x020000AF RID: 175
  12. public class CrashAnalyzer
  13. {
  14. // Token: 0x06000556 RID: 1366 RVA: 0x0002AE74 File Offset: 0x00029074
  15. public CrashAnalyzer(int UUID)
  16. {
  17. this._ConfigField = new List<KeyValuePair<string, string[]>>();
  18. this.testsField = null;
  19. this.m_MapperField = null;
  20. this._ThreadField = null;
  21. this.propertyField = null;
  22. this._ComposerField = null;
  23. this.m_RepositoryField = new Dictionary<CrashAnalyzer.CrashReason, List<string>>();
  24. this.m_ErrorField = new List<string>();
  25. object readerField = CrashAnalyzer.m_ReaderField;
  26. ObjectFlowControl.CheckForSyncLockOnValueType(readerField);
  27. lock (readerField)
  28. {
  29. if (!CrashAnalyzer.fieldField)
  30. {
  31. try
  32. {
  33. ModBase.DeleteDirectory(ModBase.m_DecoratorRepository + "CrashAnalyzer\\", false);
  34. }
  35. catch (Exception ex)
  36. {
  37. ModBase.Log(ex, "清理崩溃分析缓存失败", ModBase.LogLevel.Debug, "出现错误");
  38. }
  39. CrashAnalyzer.fieldField = true;
  40. }
  41. }
  42. this.clientField = string.Concat(new string[]
  43. {
  44. ModBase.m_DecoratorRepository,
  45. "CrashAnalyzer\\",
  46. Conversions.ToString(UUID),
  47. Conversions.ToString(ModBase.RandomInteger(0, 99999999)),
  48. "\\"
  49. });
  50. ModBase.DeleteDirectory(this.clientField, false);
  51. Directory.CreateDirectory(this.clientField + "Temp\\");
  52. Directory.CreateDirectory(this.clientField + "Report\\");
  53. ModBase.Log("[Crash] 崩溃分析暂存文件夹:" + this.clientField, ModBase.LogLevel.Normal, "出现错误");
  54. }
  55. // Token: 0x06000557 RID: 1367 RVA: 0x0002AFEC File Offset: 0x000291EC
  56. public void Collect(string VersionPathIndie, IList<string> LatestLog = null)
  57. {
  58. ModBase.Log("[Crash] 步骤 1:收集日志文件", ModBase.LogLevel.Normal, "出现错误");
  59. List<string> list = new List<string>();
  60. try
  61. {
  62. DirectoryInfo directoryInfo = new DirectoryInfo(VersionPathIndie + "crash-reports\\");
  63. if (directoryInfo.Exists)
  64. {
  65. try
  66. {
  67. foreach (FileInfo fileInfo in directoryInfo.EnumerateFiles())
  68. {
  69. list.Add(fileInfo.FullName);
  70. }
  71. }
  72. finally
  73. {
  74. IEnumerator<FileInfo> enumerator;
  75. if (enumerator != null)
  76. {
  77. enumerator.Dispose();
  78. }
  79. }
  80. }
  81. }
  82. catch (Exception ex)
  83. {
  84. ModBase.Log(ex, "收集 Minecraft 崩溃日志文件夹下的日志失败", ModBase.LogLevel.Debug, "出现错误");
  85. }
  86. try
  87. {
  88. try
  89. {
  90. foreach (FileInfo fileInfo2 in new DirectoryInfo(VersionPathIndie).Parent.Parent.EnumerateFiles())
  91. {
  92. if (Operators.CompareString(fileInfo2.Extension ?? "", ".log", false) == 0)
  93. {
  94. list.Add(fileInfo2.FullName);
  95. }
  96. }
  97. }
  98. finally
  99. {
  100. IEnumerator<FileInfo> enumerator2;
  101. if (enumerator2 != null)
  102. {
  103. enumerator2.Dispose();
  104. }
  105. }
  106. }
  107. catch (Exception ex2)
  108. {
  109. ModBase.Log(ex2, "收集 Minecraft 主文件夹下的日志失败", ModBase.LogLevel.Debug, "出现错误");
  110. }
  111. try
  112. {
  113. try
  114. {
  115. foreach (FileInfo fileInfo3 in new DirectoryInfo(VersionPathIndie).EnumerateFiles())
  116. {
  117. if (Operators.CompareString(fileInfo3.Extension ?? "", ".log", false) == 0)
  118. {
  119. list.Add(fileInfo3.FullName);
  120. }
  121. }
  122. }
  123. finally
  124. {
  125. IEnumerator<FileInfo> enumerator3;
  126. if (enumerator3 != null)
  127. {
  128. enumerator3.Dispose();
  129. }
  130. }
  131. }
  132. catch (Exception ex3)
  133. {
  134. ModBase.Log(ex3, "收集 Minecraft 隔离文件夹下的日志失败", ModBase.LogLevel.Debug, "出现错误");
  135. }
  136. list.Add(VersionPathIndie + "logs\\latest.log");
  137. list.Add(VersionPathIndie + "logs\\debug.log");
  138. list = Enumerable.ToList<string>(Enumerable.Distinct<string>(list));
  139. List<string> list2 = new List<string>();
  140. try
  141. {
  142. foreach (string text in list)
  143. {
  144. try
  145. {
  146. FileInfo fileInfo4 = new FileInfo(text);
  147. if (fileInfo4.Exists)
  148. {
  149. double num = Math.Abs((fileInfo4.LastWriteTime - DateTime.Now).TotalMinutes);
  150. if (num < 3.0 && fileInfo4.Length > 0L)
  151. {
  152. list2.Add(text);
  153. ModBase.Log(string.Concat(new string[]
  154. {
  155. "[Crash] 可能可用的日志文件:",
  156. text,
  157. "(",
  158. Conversions.ToString(Math.Round(num, 1)),
  159. " 分钟)"
  160. }), ModBase.LogLevel.Normal, "出现错误");
  161. }
  162. }
  163. }
  164. catch (Exception ex4)
  165. {
  166. ModBase.Log(ex4, "确认崩溃日志时间失败(" + text + ")", ModBase.LogLevel.Debug, "出现错误");
  167. }
  168. }
  169. }
  170. finally
  171. {
  172. List<string>.Enumerator enumerator4;
  173. ((IDisposable)enumerator4).Dispose();
  174. }
  175. if (!Enumerable.Any<string>(list2))
  176. {
  177. ModBase.Log("[Crash] 未发现可能可用的日志文件", ModBase.LogLevel.Normal, "出现错误");
  178. }
  179. try
  180. {
  181. foreach (string text2 in list2)
  182. {
  183. try
  184. {
  185. if (text2.Contains("crash-"))
  186. {
  187. this._ConfigField.Add(new KeyValuePair<string, string[]>(text2, ModBase.ReadFile(text2, null).Split("\r\n".ToCharArray())));
  188. }
  189. else
  190. {
  191. this._ConfigField.Add(new KeyValuePair<string, string[]>(text2, ModBase.ReadFile(text2, Encoding.UTF8).Split("\r\n".ToCharArray())));
  192. }
  193. }
  194. catch (Exception ex5)
  195. {
  196. ModBase.Log(ex5, "读取可能的崩溃日志文件失败(" + text2 + ")", ModBase.LogLevel.Debug, "出现错误");
  197. }
  198. }
  199. }
  200. finally
  201. {
  202. List<string>.Enumerator enumerator5;
  203. ((IDisposable)enumerator5).Dispose();
  204. }
  205. if (LatestLog != null && Enumerable.Any<string>(LatestLog))
  206. {
  207. string text3 = LatestLog.Join("\r\n");
  208. ModBase.Log("[Crash] 以下为游戏输出的最后一段内容:\r\n" + text3, ModBase.LogLevel.Normal, "出现错误");
  209. ModBase.WriteFile(this.clientField + "RawOutput.log", text3, false, null);
  210. this._ConfigField.Add(new KeyValuePair<string, string[]>(this.clientField + "RawOutput.log", Enumerable.ToArray<string>(LatestLog)));
  211. LatestLog.Clear();
  212. }
  213. ModBase.Log("[Crash] 步骤 1:收集日志文件完成,收集到 " + Conversions.ToString(this._ConfigField.Count) + " 个文件", ModBase.LogLevel.Normal, "出现错误");
  214. }
  215. // Token: 0x06000558 RID: 1368 RVA: 0x0002B4C4 File Offset: 0x000296C4
  216. public void Import(string FilePath)
  217. {
  218. ModBase.Log("[Crash] 步骤 1:自主导入日志文件", ModBase.LogLevel.Normal, "出现错误");
  219. try
  220. {
  221. FileInfo fileInfo = new FileInfo(FilePath);
  222. if (fileInfo.Exists && fileInfo.Length > 0L && !FilePath.EndsWithF(".jar", true))
  223. {
  224. ModBase.ExtractFile(FilePath, this.clientField + "Temp\\", null, null);
  225. ModBase.Log("[Crash] 已解压导入的日志文件:" + FilePath, ModBase.LogLevel.Normal, "出现错误");
  226. goto IL_AE;
  227. }
  228. }
  229. catch (Exception ex)
  230. {
  231. }
  232. ModBase.CopyFile(FilePath, this.clientField + "Temp\\" + ModBase.GetFileNameFromPath(FilePath));
  233. ModBase.Log("[Crash] 已复制导入的日志文件:" + FilePath, ModBase.LogLevel.Normal, "出现错误");
  234. IL_AE:
  235. try
  236. {
  237. foreach (FileInfo fileInfo2 in Enumerable.ToList<FileInfo>(new DirectoryInfo(this.clientField + "Temp\\").EnumerateFiles()))
  238. {
  239. try
  240. {
  241. if (fileInfo2.Exists && fileInfo2.Length != 0L)
  242. {
  243. string left = fileInfo2.Extension.ToLower();
  244. if (Operators.CompareString(left, ".log", false) != 0 && Operators.CompareString(left, ".txt", false) != 0)
  245. {
  246. File.Delete(fileInfo2.FullName);
  247. }
  248. else if (fileInfo2.Name.StartsWithF("crash-", false))
  249. {
  250. this._ConfigField.Add(new KeyValuePair<string, string[]>(fileInfo2.FullName, ModBase.ReadFile(fileInfo2.FullName, null).Split("\r\n".ToCharArray())));
  251. }
  252. else
  253. {
  254. this._ConfigField.Add(new KeyValuePair<string, string[]>(fileInfo2.FullName, ModBase.ReadFile(fileInfo2.FullName, Encoding.UTF8).Split("\r\n".ToCharArray())));
  255. }
  256. }
  257. }
  258. catch (Exception ex2)
  259. {
  260. ModBase.Log(ex2, "导入单个日志文件失败", ModBase.LogLevel.Debug, "出现错误");
  261. }
  262. }
  263. }
  264. finally
  265. {
  266. List<FileInfo>.Enumerator enumerator;
  267. ((IDisposable)enumerator).Dispose();
  268. }
  269. ModBase.Log("[Crash] 步骤 1:自主导入日志文件,收集到 " + Conversions.ToString(this._ConfigField.Count) + " 个文件", ModBase.LogLevel.Normal, "出现错误");
  270. }
  271. // Token: 0x06000559 RID: 1369 RVA: 0x0002B730 File Offset: 0x00029930
  272. public int Prepare()
  273. {
  274. ModBase.Log("[Crash] 步骤 2:准备日志文本", ModBase.LogLevel.Normal, "出现错误");
  275. this.testsField = null;
  276. List<KeyValuePair<CrashAnalyzer.AnalyzeFileType, KeyValuePair<string, string[]>>> list = new List<KeyValuePair<CrashAnalyzer.AnalyzeFileType, KeyValuePair<string, string[]>>>();
  277. try
  278. {
  279. foreach (KeyValuePair<string, string[]> value in this._ConfigField)
  280. {
  281. string text = ModBase.GetFileNameFromPath(value.Key).ToLower();
  282. CrashAnalyzer.AnalyzeFileType analyzeFileType;
  283. if (text.StartsWithF("hs_err", false))
  284. {
  285. analyzeFileType = CrashAnalyzer.AnalyzeFileType.HsErr;
  286. this.testsField = new KeyValuePair<string, string[]>?(value);
  287. }
  288. else if (text.StartsWithF("crash-", false))
  289. {
  290. analyzeFileType = CrashAnalyzer.AnalyzeFileType.CrashReport;
  291. this.testsField = new KeyValuePair<string, string[]>?(value);
  292. }
  293. else if (Operators.CompareString(text, "latest.log", false) != 0 && Operators.CompareString(text, "latest log.txt", false) != 0 && Operators.CompareString(text, "debug.log", false) != 0 && Operators.CompareString(text, "debug log.txt", false) != 0 && Operators.CompareString(text, "游戏崩溃前的输出.txt", false) != 0 && Operators.CompareString(text, "rawoutput.log", false) != 0)
  294. {
  295. if (Operators.CompareString(text, "启动器日志.txt", false) != 0 && Operators.CompareString(text, "PCL2 启动器日志.txt", false) != 0 && Operators.CompareString(text, "PCL 启动器日志.txt", false) != 0 && Operators.CompareString(text, "log1.txt", false) != 0)
  296. {
  297. if (!text.EndsWithF(".log", true) && !text.EndsWithF(".txt", true))
  298. {
  299. ModBase.Log("[Crash] " + text + " 分类为 Ignore", ModBase.LogLevel.Normal, "出现错误");
  300. continue;
  301. }
  302. analyzeFileType = CrashAnalyzer.AnalyzeFileType.ExtraLog;
  303. }
  304. else if (Enumerable.Any<string>(value.Value, (CrashAnalyzer._Closure$__.$I10-0 == null) ? (CrashAnalyzer._Closure$__.$I10-0 = ((string s) => s.Contains("以下为游戏输出的最后一段内容"))) : CrashAnalyzer._Closure$__.$I10-0))
  305. {
  306. analyzeFileType = CrashAnalyzer.AnalyzeFileType.MinecraftLog;
  307. if (this.testsField == null)
  308. {
  309. this.testsField = new KeyValuePair<string, string[]>?(value);
  310. }
  311. }
  312. else
  313. {
  314. analyzeFileType = CrashAnalyzer.AnalyzeFileType.ExtraLog;
  315. }
  316. }
  317. else
  318. {
  319. analyzeFileType = CrashAnalyzer.AnalyzeFileType.MinecraftLog;
  320. if (this.testsField == null)
  321. {
  322. this.testsField = new KeyValuePair<string, string[]>?(value);
  323. }
  324. }
  325. if (!Enumerable.Any<string>(value.Value))
  326. {
  327. ModBase.Log("[Crash] " + text + " 由于内容为空跳过", ModBase.LogLevel.Normal, "出现错误");
  328. }
  329. else
  330. {
  331. list.Add(new KeyValuePair<CrashAnalyzer.AnalyzeFileType, KeyValuePair<string, string[]>>(analyzeFileType, value));
  332. ModBase.Log("[Crash] " + text + " 分类为 " + ModBase.GetStringFromEnum(analyzeFileType), ModBase.LogLevel.Normal, "出现错误");
  333. }
  334. }
  335. }
  336. finally
  337. {
  338. List<KeyValuePair<string, string[]>>.Enumerator enumerator;
  339. ((IDisposable)enumerator).Dispose();
  340. }
  341. checked
  342. {
  343. foreach (CrashAnalyzer.AnalyzeFileType analyzeFileType2 in new CrashAnalyzer.AnalyzeFileType[]
  344. {
  345. CrashAnalyzer.AnalyzeFileType.MinecraftLog,
  346. CrashAnalyzer.AnalyzeFileType.HsErr,
  347. CrashAnalyzer.AnalyzeFileType.ExtraLog,
  348. CrashAnalyzer.AnalyzeFileType.CrashReport
  349. })
  350. {
  351. List<KeyValuePair<string, string[]>> list2 = new List<KeyValuePair<string, string[]>>();
  352. try
  353. {
  354. foreach (KeyValuePair<CrashAnalyzer.AnalyzeFileType, KeyValuePair<string, string[]>> keyValuePair in list)
  355. {
  356. if (analyzeFileType2 == keyValuePair.Key)
  357. {
  358. list2.Add(keyValuePair.Value);
  359. }
  360. }
  361. }
  362. finally
  363. {
  364. List<KeyValuePair<CrashAnalyzer.AnalyzeFileType, KeyValuePair<string, string[]>>>.Enumerator enumerator2;
  365. ((IDisposable)enumerator2).Dispose();
  366. }
  367. if (Enumerable.Any<KeyValuePair<string, string[]>>(list2))
  368. {
  369. try
  370. {
  371. switch (analyzeFileType2)
  372. {
  373. case CrashAnalyzer.AnalyzeFileType.HsErr:
  374. case CrashAnalyzer.AnalyzeFileType.CrashReport:
  375. break;
  376. case CrashAnalyzer.AnalyzeFileType.MinecraftLog:
  377. {
  378. this.m_MapperField = "";
  379. this._ThreadField = "";
  380. Dictionary<string, KeyValuePair<string, string[]>> dictionary = new Dictionary<string, KeyValuePair<string, string[]>>();
  381. try
  382. {
  383. foreach (KeyValuePair<string, string[]> value2 in list2)
  384. {
  385. dictionary[ModBase.GetFileNameFromPath(value2.Key).ToLower()] = value2;
  386. this.m_ErrorField.Add(value2.Key);
  387. ModBase.Log("[Crash] 输出报告:" + value2.Key + ",作为 Minecraft 或启动器日志", ModBase.LogLevel.Normal, "出现错误");
  388. }
  389. }
  390. finally
  391. {
  392. List<KeyValuePair<string, string[]>>.Enumerator enumerator3;
  393. ((IDisposable)enumerator3).Dispose();
  394. }
  395. foreach (string key in new string[]
  396. {
  397. "rawoutput.log",
  398. "启动器日志.txt",
  399. "log1.txt",
  400. "游戏崩溃前的输出.txt",
  401. "PCL2 启动器日志.txt",
  402. "PCL 启动器日志.txt"
  403. })
  404. {
  405. if (dictionary.ContainsKey(key))
  406. {
  407. KeyValuePair<string, string[]> keyValuePair2 = dictionary[key];
  408. bool flag = false;
  409. foreach (string text2 in keyValuePair2.Value)
  410. {
  411. if (flag)
  412. {
  413. ref string ptr = ref this.m_MapperField;
  414. this.m_MapperField = ptr + text2 + "\n";
  415. }
  416. else if (text2.Contains("以下为游戏输出的最后一段内容"))
  417. {
  418. flag = true;
  419. ModBase.Log("[Crash] 找到 PCL 输出的游戏实时日志头", ModBase.LogLevel.Normal, "出现错误");
  420. }
  421. }
  422. if (!flag)
  423. {
  424. ref string ptr = ref this.m_MapperField;
  425. this.m_MapperField = ptr + this.GetHeadTailLines(keyValuePair2.Value, 0, 500);
  426. }
  427. this.m_MapperField = this.m_MapperField.TrimEnd("\r\n".ToCharArray());
  428. ModBase.Log("[Crash] 导入分析:" + keyValuePair2.Key + ",作为启动器日志", ModBase.LogLevel.Normal, "出现错误");
  429. IL_4DD:
  430. foreach (string key2 in new string[]
  431. {
  432. "latest.log",
  433. "latest log.txt",
  434. "debug.log",
  435. "debug log.txt"
  436. })
  437. {
  438. if (dictionary.ContainsKey(key2))
  439. {
  440. KeyValuePair<string, string[]> keyValuePair3 = dictionary[key2];
  441. ref string ptr = ref this.m_MapperField;
  442. this.m_MapperField = ptr + this.GetHeadTailLines(keyValuePair3.Value, 250, 500);
  443. ModBase.Log("[Crash] 导入分析:" + keyValuePair3.Key + ",作为 Minecraft 日志", ModBase.LogLevel.Normal, "出现错误");
  444. IL_582:
  445. string[] array4 = new string[]
  446. {
  447. "debug.log",
  448. "debug log.txt"
  449. };
  450. int m = 0;
  451. while (m < array4.Length)
  452. {
  453. string key3 = array4[m];
  454. if (!dictionary.ContainsKey(key3))
  455. {
  456. m++;
  457. }
  458. else
  459. {
  460. KeyValuePair<string, string[]> keyValuePair4 = dictionary[key3];
  461. ptr = ref this._ThreadField;
  462. this._ThreadField = ptr + this.GetHeadTailLines(keyValuePair4.Value, 1000, 0);
  463. ModBase.Log("[Crash] 导入分析:" + keyValuePair4.Key + ",作为 Minecraft Debug 日志", ModBase.LogLevel.Normal, "出现错误");
  464. IL_613:
  465. if (Operators.CompareString(this.m_MapperField, "", false) == 0)
  466. {
  467. this.m_MapperField = null;
  468. throw new Exception("无法找到匹配的 Minecraft Log");
  469. }
  470. if (Operators.CompareString(this._ThreadField, "", false) == 0)
  471. {
  472. this._ThreadField = null;
  473. goto IL_829;
  474. }
  475. goto IL_829;
  476. }
  477. }
  478. goto IL_613;
  479. }
  480. }
  481. goto IL_582;
  482. }
  483. }
  484. goto IL_4DD;
  485. }
  486. case CrashAnalyzer.AnalyzeFileType.ExtraLog:
  487. try
  488. {
  489. foreach (KeyValuePair<string, string[]> keyValuePair5 in list2)
  490. {
  491. this.m_ErrorField.Add(keyValuePair5.Key);
  492. ModBase.Log("[Crash] 输出报告:" + keyValuePair5.Key + ",作为额外日志", ModBase.LogLevel.Normal, "出现错误");
  493. }
  494. goto IL_829;
  495. }
  496. finally
  497. {
  498. List<KeyValuePair<string, string[]>>.Enumerator enumerator4;
  499. ((IDisposable)enumerator4).Dispose();
  500. }
  501. break;
  502. default:
  503. goto IL_829;
  504. }
  505. SortedList<DateTime, KeyValuePair<string, string[]>> sortedList = new SortedList<DateTime, KeyValuePair<string, string[]>>();
  506. try
  507. {
  508. foreach (KeyValuePair<string, string[]> keyValuePair6 in list2)
  509. {
  510. try
  511. {
  512. sortedList.Add(new FileInfo(keyValuePair6.Key).LastWriteTime, keyValuePair6);
  513. }
  514. catch (Exception ex)
  515. {
  516. ModBase.Log(ex, "获取日志文件修改时间失败", ModBase.LogLevel.Debug, "出现错误");
  517. sortedList.Add(new DateTime(1900, 1, 1), keyValuePair6);
  518. }
  519. }
  520. }
  521. finally
  522. {
  523. List<KeyValuePair<string, string[]>>.Enumerator enumerator5;
  524. ((IDisposable)enumerator5).Dispose();
  525. }
  526. KeyValuePair<string, string[]> value4 = Enumerable.Last<KeyValuePair<DateTime, KeyValuePair<string, string[]>>>(sortedList).Value;
  527. this.m_ErrorField.Add(value4.Key);
  528. if (analyzeFileType2 == CrashAnalyzer.AnalyzeFileType.HsErr)
  529. {
  530. this.propertyField = this.GetHeadTailLines(value4.Value, 200, 100);
  531. ModBase.Log("[Crash] 输出报告:" + value4.Key + ",作为虚拟机错误信息", ModBase.LogLevel.Normal, "出现错误");
  532. ModBase.Log("[Crash] 导入分析:" + value4.Key + ",作为虚拟机错误信息", ModBase.LogLevel.Normal, "出现错误");
  533. }
  534. else
  535. {
  536. this._ComposerField = this.GetHeadTailLines(value4.Value, 300, 700);
  537. ModBase.Log("[Crash] 输出报告:" + value4.Key + ",作为 Minecraft 崩溃报告", ModBase.LogLevel.Normal, "出现错误");
  538. ModBase.Log("[Crash] 导入分析:" + value4.Key + ",作为 Minecraft 崩溃报告", ModBase.LogLevel.Normal, "出现错误");
  539. }
  540. IL_829:;
  541. }
  542. catch (Exception ex2)
  543. {
  544. ModBase.Log(ex2, "分类处理日志文件时出错", ModBase.LogLevel.Debug, "出现错误");
  545. }
  546. }
  547. }
  548. int num = ((this.m_MapperField != null) + (this.propertyField != null) + (this._ComposerField != null)) ? 1 : 0;
  549. if (num == 0)
  550. {
  551. ModBase.Log("[Crash] 步骤 2:准备日志文本完成,没有任何可供分析的日志", ModBase.LogLevel.Normal, "出现错误");
  552. }
  553. else
  554. {
  555. ModBase.Log(string.Concat(new string[]
  556. {
  557. "[Crash] 步骤 2:准备日志文本完成,找到",
  558. (this.m_MapperField == null) ? "" : "游戏日志、",
  559. (this._ThreadField == null) ? "" : "游戏 Debug 日志、",
  560. (this.propertyField == null) ? "" : "虚拟机日志、",
  561. (this._ComposerField == null) ? "" : "崩溃日志、"
  562. }).TrimEnd(new char[]
  563. {
  564. '、'
  565. }) + "用作分析", ModBase.LogLevel.Normal, "出现错误");
  566. }
  567. return num;
  568. }
  569. }
  570. // Token: 0x0600055A RID: 1370 RVA: 0x0002C110 File Offset: 0x0002A310
  571. private string GetHeadTailLines(string[] Raw, int HeadLines, int TailLines)
  572. {
  573. checked
  574. {
  575. string result;
  576. if (Raw.Length <= HeadLines + TailLines)
  577. {
  578. result = Enumerable.Distinct<string>(Raw).Join("\n");
  579. }
  580. else
  581. {
  582. List<string> list = new List<string>();
  583. int num = 0;
  584. int num2 = Raw.Length - 1;
  585. int i;
  586. for (i = 0; i <= num2; i++)
  587. {
  588. if (!list.Contains(Raw[i]))
  589. {
  590. num++;
  591. list.Add(Raw[i]);
  592. if (num >= HeadLines)
  593. {
  594. break;
  595. }
  596. }
  597. }
  598. int num3 = 0;
  599. int num4 = Raw.Length - 1;
  600. int num5 = i;
  601. for (int j = num4; j >= num5; j += -1)
  602. {
  603. if (!list.Contains(Raw[j]))
  604. {
  605. num3++;
  606. list.Insert(num, Raw[j]);
  607. if (num3 >= TailLines)
  608. {
  609. break;
  610. }
  611. }
  612. }
  613. StringBuilder stringBuilder = new StringBuilder();
  614. try
  615. {
  616. foreach (string text in list)
  617. {
  618. if (Operators.CompareString(text, "", false) != 0)
  619. {
  620. stringBuilder.Append(text);
  621. stringBuilder.Append("\n");
  622. }
  623. }
  624. }
  625. finally
  626. {
  627. List<string>.Enumerator enumerator;
  628. ((IDisposable)enumerator).Dispose();
  629. }
  630. result = stringBuilder.ToString();
  631. }
  632. return result;
  633. }
  634. }
  635. // Token: 0x0600055B RID: 1371 RVA: 0x0002C224 File Offset: 0x0002A424
  636. public void Analyze(ModMinecraft.McVersion Version = null)
  637. {
  638. ModBase.Log("[Crash] 步骤 3:分析崩溃原因", ModBase.LogLevel.Normal, "出现错误");
  639. this._IteratorField = this.m_MapperField + this._ThreadField + this.propertyField + this._ComposerField;
  640. this.AnalyzeCrit1();
  641. if (!Enumerable.Any<KeyValuePair<CrashAnalyzer.CrashReason, List<string>>>(this.m_RepositoryField))
  642. {
  643. this.AnalyzeCrit2();
  644. if (!Enumerable.Any<KeyValuePair<CrashAnalyzer.CrashReason, List<string>>>(this.m_RepositoryField))
  645. {
  646. if (!this._IteratorField.Contains("orge") && !this._IteratorField.Contains("abric") && !this._IteratorField.Contains("uilt") && !this._IteratorField.Contains("iteloader"))
  647. {
  648. ModBase.Log("[Crash] 可能并未安装 Mod,不进行堆栈分析", ModBase.LogLevel.Normal, "出现错误");
  649. }
  650. else
  651. {
  652. List<string> list = new List<string>();
  653. if (this._ComposerField != null)
  654. {
  655. ModBase.Log("[Crash] 开始进行崩溃日志堆栈分析", ModBase.LogLevel.Normal, "出现错误");
  656. list.AddRange(this.AnalyzeStackKeyword(this._ComposerField.BeforeFirst("System Details", false)));
  657. }
  658. if (this.m_MapperField != null)
  659. {
  660. List<string> list2 = ModBase.RegexSearch(this.m_MapperField, "/FATAL] .+?(?=[\\n]+\\[)", 0);
  661. if (this.m_MapperField.Contains("Unreported exception thrown!"))
  662. {
  663. list2.Add(this.m_MapperField.Between("Unreported exception thrown!", "at oolloo.jlw.Wrapper", false));
  664. }
  665. ModBase.Log("[Crash] 开始进行 Minecraft 日志堆栈分析,发现 " + Conversions.ToString(list2.Count) + " 个报错项", ModBase.LogLevel.Normal, "出现错误");
  666. try
  667. {
  668. foreach (string errorStack in list2)
  669. {
  670. list.AddRange(this.AnalyzeStackKeyword(errorStack));
  671. }
  672. }
  673. finally
  674. {
  675. List<string>.Enumerator enumerator;
  676. ((IDisposable)enumerator).Dispose();
  677. }
  678. }
  679. if (this.propertyField != null)
  680. {
  681. ModBase.Log("[Crash] 开始进行虚拟机堆栈分析", ModBase.LogLevel.Normal, "出现错误");
  682. string errorStack2 = this.propertyField.Between("T H R E A D", "Registers:", false);
  683. list.AddRange(this.AnalyzeStackKeyword(errorStack2));
  684. }
  685. if (Enumerable.Any<string>(list))
  686. {
  687. List<string> list3 = this.AnalyzeModName(list);
  688. if (list3 == null)
  689. {
  690. this.AppendReason(CrashAnalyzer.CrashReason.堆栈分析发现关键字, list);
  691. goto IL_20E;
  692. }
  693. this.AppendReason(CrashAnalyzer.CrashReason.堆栈分析发现Mod名称, list3);
  694. goto IL_20E;
  695. }
  696. }
  697. this.AnalyzeCrit3();
  698. }
  699. }
  700. IL_20E:
  701. if (!Enumerable.Any<KeyValuePair<CrashAnalyzer.CrashReason, List<string>>>(this.m_RepositoryField))
  702. {
  703. ModBase.Log("[Crash] 步骤 3:分析崩溃原因完成,未找到可能的原因", ModBase.LogLevel.Normal, "出现错误");
  704. return;
  705. }
  706. ModBase.Log("[Crash] 步骤 3:分析崩溃原因完成,找到 " + Conversions.ToString(this.m_RepositoryField.Count) + " 条可能的原因", ModBase.LogLevel.Normal, "出现错误");
  707. try
  708. {
  709. foreach (KeyValuePair<CrashAnalyzer.CrashReason, List<string>> keyValuePair in this.m_RepositoryField)
  710. {
  711. ModBase.Log("[Crash] - " + ModBase.GetStringFromEnum(keyValuePair.Key) + (Enumerable.Any<string>(keyValuePair.Value) ? ("(" + keyValuePair.Value.Join(";") + ")") : ""), ModBase.LogLevel.Normal, "出现错误");
  712. }
  713. }
  714. finally
  715. {
  716. Dictionary<CrashAnalyzer.CrashReason, List<string>>.Enumerator enumerator2;
  717. ((IDisposable)enumerator2).Dispose();
  718. }
  719. }
  720. // Token: 0x0600055C RID: 1372 RVA: 0x0002C530 File Offset: 0x0002A730
  721. private void AppendReason(CrashAnalyzer.CrashReason Reason, ICollection<string> Additional = null)
  722. {
  723. if (this.m_RepositoryField.ContainsKey(Reason))
  724. {
  725. if (Additional != null)
  726. {
  727. this.m_RepositoryField[Reason].AddRange(Additional);
  728. this.m_RepositoryField[Reason] = Enumerable.ToList<string>(Enumerable.Distinct<string>(this.m_RepositoryField[Reason]));
  729. }
  730. }
  731. else
  732. {
  733. this.m_RepositoryField.Add(Reason, new List<string>(Additional ?? new string[0]));
  734. }
  735. ModBase.Log("[Crash] 可能的崩溃原因:" + ModBase.GetStringFromEnum(Reason) + ((Additional == null || !Enumerable.Any<string>(Additional)) ? "" : ("(" + Additional.Join(";") + ")")), ModBase.LogLevel.Normal, "出现错误");
  736. }
  737. // Token: 0x0600055D RID: 1373 RVA: 0x00004DF6 File Offset: 0x00002FF6
  738. private void AppendReason(CrashAnalyzer.CrashReason Reason, string Additional)
  739. {
  740. List<string> additional;
  741. if (!string.IsNullOrEmpty(Additional))
  742. {
  743. (additional = new List<string>()).Add(Additional);
  744. }
  745. else
  746. {
  747. additional = null;
  748. }
  749. this.AppendReason(Reason, additional);
  750. }
  751. // Token: 0x0600055E RID: 1374 RVA: 0x0002C5EC File Offset: 0x0002A7EC
  752. private void AnalyzeCrit1()
  753. {
  754. if (this.m_MapperField == null && this.propertyField == null && this._ComposerField == null)
  755. {
  756. this.AppendReason(CrashAnalyzer.CrashReason.没有可用的分析文件, null);
  757. return;
  758. }
  759. if (this._ComposerField != null && this._ComposerField.Contains("Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass"))
  760. {
  761. this.AppendReason(CrashAnalyzer.CrashReason.Java版本过高, null);
  762. }
  763. if (this.m_MapperField != null)
  764. {
  765. if (this.m_MapperField.Contains("Found multiple arguments for option fml.forgeVersion, but you asked for only one"))
  766. {
  767. this.AppendReason(CrashAnalyzer.CrashReason.版本Json中存在多个Forge, null);
  768. }
  769. if (this.m_MapperField.Contains("The driver does not appear to support OpenGL"))
  770. {
  771. this.AppendReason(CrashAnalyzer.CrashReason.显卡不支持OpenGL, null);
  772. }
  773. if (this.m_MapperField.Contains("java.lang.ClassCastException: java.base/jdk"))
  774. {
  775. this.AppendReason(CrashAnalyzer.CrashReason.使用JDK, null);
  776. }
  777. if (this.m_MapperField.Contains("java.lang.ClassCastException: class jdk."))
  778. {
  779. this.AppendReason(CrashAnalyzer.CrashReason.使用JDK, null);
  780. }
  781. if (this.m_MapperField.Contains("TRANSFORMER/net.optifine/net.optifine.reflect.Reflector.<clinit>(Reflector.java"))
  782. {
  783. this.AppendReason(CrashAnalyzer.CrashReason.OptiFine与Forge不兼容, null);
  784. }
  785. if (this.m_MapperField.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.client.renderer.texture.SpriteContents.<init>"))
  786. {
  787. this.AppendReason(CrashAnalyzer.CrashReason.OptiFine与Forge不兼容, null);
  788. }
  789. if (this.m_MapperField.Contains("java.lang.NoSuchMethodError: 'java.lang.String com.mojang.blaze3d.systems.RenderSystem.getBackendDescription"))
  790. {
  791. this.AppendReason(CrashAnalyzer.CrashReason.OptiFine与Forge不兼容, null);
  792. }
  793. if (this.m_MapperField.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.client.renderer.block.model.BakedQuad.<init>"))
  794. {
  795. this.AppendReason(CrashAnalyzer.CrashReason.OptiFine与Forge不兼容, null);
  796. }
  797. if (this.m_MapperField.Contains("java.lang.NoSuchMethodError: 'void net.minecraftforge.client.gui.overlay.ForgeGui.renderSelectedItemName"))
  798. {
  799. this.AppendReason(CrashAnalyzer.CrashReason.OptiFine与Forge不兼容, null);
  800. }
  801. if (this.m_MapperField.Contains("java.lang.NoSuchMethodError: 'void net.minecraft.server.level.DistanceManager"))
  802. {
  803. this.AppendReason(CrashAnalyzer.CrashReason.OptiFine与Forge不兼容, null);
  804. }
  805. if (this.m_MapperField.Contains("java.lang.NoSuchMethodError: 'net.minecraft.network.chat.FormattedText net.minecraft.client.gui.Font.ellipsize"))
  806. {
  807. this.AppendReason(CrashAnalyzer.CrashReason.OptiFine与Forge不兼容, null);
  808. }
  809. if (this.m_MapperField.Contains("Open J9 is not supported") || this.m_MapperField.Contains("OpenJ9 is incompatible") || this.m_MapperField.Contains(".J9VMInternals."))
  810. {
  811. this.AppendReason(CrashAnalyzer.CrashReason.使用OpenJ9, null);
  812. }
  813. if (this.m_MapperField.Contains("java.lang.NoSuchFieldException: ucp"))
  814. {
  815. this.AppendReason(CrashAnalyzer.CrashReason.Java版本过高, null);
  816. }
  817. if (this.m_MapperField.Contains("because module java.base does not export"))
  818. {
  819. this.AppendReason(CrashAnalyzer.CrashReason.Java版本过高, null);
  820. }
  821. if (this.m_MapperField.Contains("java.lang.ClassNotFoundException: jdk.nashorn.api.scripting.NashornScriptEngineFactory"))
  822. {
  823. this.AppendReason(CrashAnalyzer.CrashReason.Java版本过高, null);
  824. }
  825. if (this.m_MapperField.Contains("java.lang.ClassNotFoundException: java.lang.invoke.LambdaMetafactory"))
  826. {
  827. this.AppendReason(CrashAnalyzer.CrashReason.Java版本过高, null);
  828. }
  829. if (this.m_MapperField.Contains("The directories below appear to be extracted jar files. Fix this before you continue."))
  830. {
  831. this.AppendReason(CrashAnalyzer.CrashReason.Mod文件被解压, null);
  832. }
  833. if (this.m_MapperField.Contains("Extracted mod jars found, loading will NOT continue"))
  834. {
  835. this.AppendReason(CrashAnalyzer.CrashReason.Mod文件被解压, null);
  836. }
  837. if (this.m_MapperField.Contains("java.lang.ClassNotFoundException: org.spongepowered.asm.launch.MixinTweaker"))
  838. {
  839. this.AppendReason(CrashAnalyzer.CrashReason.MixinBootstrap缺失, null);
  840. }
  841. if (this.m_MapperField.Contains("Couldn't set pixel format"))
  842. {
  843. this.AppendReason(CrashAnalyzer.CrashReason.显卡驱动不支持导致无法设置像素格式, null);
  844. }
  845. if (this.m_MapperField.Contains("java.lang.OutOfMemoryError") || this.m_MapperField.Contains("an out of memory error"))
  846. {
  847. this.AppendReason(CrashAnalyzer.CrashReason.内存不足, null);
  848. }
  849. if (this.m_MapperField.Contains("java.lang.RuntimeException: Shaders Mod detected. Please remove it, OptiFine has built-in support for shaders."))
  850. {
  851. this.AppendReason(CrashAnalyzer.CrashReason.ShadersMod与OptiFine同时安装, null);
  852. }
  853. if (this.m_MapperField.Contains("java.lang.NoSuchMethodError: sun.security.util.ManifestEntryVerifier"))
  854. {
  855. this.AppendReason(CrashAnalyzer.CrashReason.低版本Forge与高版本Java不兼容, null);
  856. }
  857. if (this.m_MapperField.Contains("1282: Invalid operation"))
  858. {
  859. this.AppendReason(CrashAnalyzer.CrashReason.光影或资源包导致OpenGL1282错误, null);
  860. }
  861. if (this.m_MapperField.Contains("signer information does not match signer information of other classes in the same package"))
  862. {
  863. this.AppendReason(CrashAnalyzer.CrashReason.文件或内容校验失败, (ModBase.RegexSeek(this.m_MapperField, "(?<=class \")[^']+(?=\"'s signer information)", 0) ?? "").TrimEnd(new char[]
  864. {
  865. '\r'
  866. }));
  867. }
  868. if (this.m_MapperField.Contains("Maybe try a lower resolution resourcepack?"))
  869. {
  870. this.AppendReason(CrashAnalyzer.CrashReason.材质过大或显卡配置不足, null);
  871. }
  872. if (this.m_MapperField.Contains("java.lang.NoSuchMethodError: net.minecraft.world.server.ChunkManager$ProxyTicketManager.shouldForceTicks(J)Z") && this.m_MapperField.Contains("OptiFine"))
  873. {
  874. this.AppendReason(CrashAnalyzer.CrashReason.OptiFine导致无法加载世界, null);
  875. }
  876. if (this.m_MapperField.Contains("Unsupported class file major version"))
  877. {
  878. this.AppendReason(CrashAnalyzer.CrashReason.Java版本不兼容, null);
  879. }
  880. if (this.m_MapperField.Contains("com.electronwill.nightconfig.core.io.ParsingException: Not enough data available"))
  881. {
  882. this.AppendReason(CrashAnalyzer.CrashReason.NightConfig的Bug, null);
  883. }
  884. if (this.m_MapperField.Contains("Cannot find launch target fmlclient, unable to launch"))
  885. {
  886. this.AppendReason(CrashAnalyzer.CrashReason.Forge安装不完整, null);
  887. }
  888. if (this.m_MapperField.Contains("Invalid paths argument, contained no existing paths") && this.m_MapperField.Contains("libraries\\net\\minecraftforge\\fmlcore"))
  889. {
  890. this.AppendReason(CrashAnalyzer.CrashReason.Forge安装不完整, null);
  891. }
  892. if (this.m_MapperField.Contains("Invalid module name: '' is not a Java identifier"))
  893. {
  894. this.AppendReason(CrashAnalyzer.CrashReason.Mod名称包含特殊字符, null);
  895. }
  896. if (this.m_MapperField.Contains("has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to"))
  897. {
  898. this.AppendReason(CrashAnalyzer.CrashReason.Mod需要Java11, null);
  899. }
  900. if (this.m_MapperField.Contains("java.lang.RuntimeException: java.lang.NoSuchMethodException: no such method: sun.misc.Unsafe.defineAnonymousClass(Class,byte[],Object[])Class/invokeVirtual"))
  901. {
  902. this.AppendReason(CrashAnalyzer.CrashReason.Mod需要Java11, null);
  903. }
  904. if (this.m_MapperField.Contains("java.lang.IllegalArgumentException: The requested compatibility level JAVA_11 could not be set. Level is not supported by the active JRE or ASM version"))
  905. {
  906. this.AppendReason(CrashAnalyzer.CrashReason.Mod需要Java11, null);
  907. }
  908. if (this.m_MapperField.Contains("Unsupported major.minor version"))
  909. {
  910. this.AppendReason(CrashAnalyzer.CrashReason.Java版本不兼容, null);
  911. }
  912. if (this.m_MapperField.Contains("Invalid maximum heap size"))
  913. {
  914. this.AppendReason(CrashAnalyzer.CrashReason.使用32位Java导致JVM无法分配足够多的内存, null);
  915. }
  916. if (this.m_MapperField.Contains("Could not reserve enough space"))
  917. {
  918. if (this.m_MapperField.Contains("for 1048576KB object heap"))
  919. {
  920. this.AppendReason(CrashAnalyzer.CrashReason.使用32位Java导致JVM无法分配足够多的内存, null);
  921. }
  922. else
  923. {
  924. this.AppendReason(CrashAnalyzer.CrashReason.内存不足, null);
  925. }
  926. }
  927. if (this.m_MapperField.Contains("Caught exception from "))
  928. {
  929. CrashAnalyzer.CrashReason reason = CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃;
  930. string text = ModBase.RegexSeek(this.m_MapperField, "(?<=Caught exception from )[^\\n]+?", 0);
  931. this.AppendReason(reason, this.TryAnalyzeModName((text != null) ? text.TrimEnd("\r\n ".ToCharArray()) : null));
  932. }
  933. if (this.m_MapperField.Contains("DuplicateModsFoundException"))
  934. {
  935. this.AppendReason(CrashAnalyzer.CrashReason.Mod重复安装, ModBase.RegexSearch(this.m_MapperField, "(?<=\\n\\t[\\w]+ : [A-Z]{1}:[^\\n]+(/|\\\\))[^/\\\\\\n]+?.jar", 1));
  936. }
  937. if (this.m_MapperField.Contains("Found a duplicate mod"))
  938. {
  939. this.AppendReason(CrashAnalyzer.CrashReason.Mod重复安装, ModBase.RegexSearch(ModBase.RegexSeek(this.m_MapperField, "Found a duplicate mod[^\\n]+", 0) ?? "", "[^\\\\/]+.jar", 1));
  940. }
  941. if (this.m_MapperField.Contains("Found duplicate mods"))
  942. {
  943. this.AppendReason(CrashAnalyzer.CrashReason.Mod重复安装, Enumerable.ToList<string>(Enumerable.Distinct<string>(ModBase.RegexSearch(this.m_MapperField, "(?<=Mod ID: ')\\w+?(?=' from mod files:)", 0))));
  944. }
  945. if (this.m_MapperField.Contains("ModResolutionException: Duplicate"))
  946. {
  947. this.AppendReason(CrashAnalyzer.CrashReason.Mod重复安装, ModBase.RegexSearch(ModBase.RegexSeek(this.m_MapperField, "ModResolutionException: Duplicate[^\\n]+", 0) ?? "", "[^\\\\/]+.jar", 1));
  948. }
  949. if (this.m_MapperField.Contains("Incompatible mods found!"))
  950. {
  951. this.AppendReason(CrashAnalyzer.CrashReason.Mod互不兼容, ModBase.RegexSeek(this.m_MapperField, "(?<=Incompatible mods found![\\s\\S]+: )[\\s\\S]+?(?=\\tat )", 0) ?? "");
  952. }
  953. if (this.m_MapperField.Contains("Missing or unsupported mandatory dependencies:"))
  954. {
  955. this.AppendReason(CrashAnalyzer.CrashReason.Mod缺少前置或MC版本错误, Enumerable.ToList<string>(Enumerable.Distinct<string>(Enumerable.Select<string, string>(ModBase.RegexSearch(this.m_MapperField, "(?<=Missing or unsupported mandatory dependencies:)([\\n\\r]+\\t(.*))+", 1), (CrashAnalyzer._Closure$__.$I22-0 == null) ? (CrashAnalyzer._Closure$__.$I22-0 = ((string s) => s.Trim("\r\n\t ".ToCharArray()))) : CrashAnalyzer._Closure$__.$I22-0))));
  956. }
  957. }
  958. if (this.propertyField != null)
  959. {
  960. if (this.propertyField.Contains("The system is out of physical RAM or swap space"))
  961. {
  962. this.AppendReason(CrashAnalyzer.CrashReason.内存不足, null);
  963. }
  964. if (this.propertyField.Contains("Out of Memory Error"))
  965. {
  966. this.AppendReason(CrashAnalyzer.CrashReason.内存不足, null);
  967. }
  968. if (this.propertyField.Contains("EXCEPTION_ACCESS_VIOLATION"))
  969. {
  970. if (this.propertyField.Contains("# C [ig"))
  971. {
  972. this.AppendReason(CrashAnalyzer.CrashReason.Intel驱动不兼容导致EXCEPTION_ACCESS_VIOLATION, null);
  973. }
  974. if (this.propertyField.Contains("# C [atio"))
  975. {
  976. this.AppendReason(CrashAnalyzer.CrashReason.AMD驱动不兼容导致EXCEPTION_ACCESS_VIOLATION, null);
  977. }
  978. if (this.propertyField.Contains("# C [nvoglv"))
  979. {
  980. this.AppendReason(CrashAnalyzer.CrashReason.Nvidia驱动不兼容导致EXCEPTION_ACCESS_VIOLATION, null);
  981. }
  982. }
  983. }
  984. if (this._ComposerField != null)
  985. {
  986. if (this._ComposerField.Contains("maximum id range exceeded"))
  987. {
  988. this.AppendReason(CrashAnalyzer.CrashReason.Mod过多导致超出ID限制, null);
  989. }
  990. if (this._ComposerField.Contains("java.lang.OutOfMemoryError"))
  991. {
  992. this.AppendReason(CrashAnalyzer.CrashReason.内存不足, null);
  993. }
  994. if (this._ComposerField.Contains("Pixel format not accelerated"))
  995. {
  996. this.AppendReason(CrashAnalyzer.CrashReason.显卡驱动不支持导致无法设置像素格式, null);
  997. }
  998. if (this._ComposerField.Contains("Manually triggered debug crash"))
  999. {
  1000. this.AppendReason(CrashAnalyzer.CrashReason.玩家手动触发调试崩溃, null);
  1001. }
  1002. if (this._ComposerField.Contains("has mods that were not found") && ModBase.RegexCheck(this._ComposerField, "The Mod File [^\\n]+optifine\\\\OptiFine[^\\n]+ has mods that were not found", 0))
  1003. {
  1004. this.AppendReason(CrashAnalyzer.CrashReason.OptiFine与Forge不兼容, null);
  1005. }
  1006. if (this._ComposerField.Contains("-- MOD "))
  1007. {
  1008. if (this._ComposerField.Between("-- MOD ", "Failure message:", false).ContainsF(".jar", true))
  1009. {
  1010. this.AppendReason(CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃, (ModBase.RegexSeek(this._ComposerField, "(?<=Mod File: ).+", 0) ?? "").TrimEnd("\r\n ".ToCharArray()));
  1011. }
  1012. else
  1013. {
  1014. this.AppendReason(CrashAnalyzer.CrashReason.Mod加载器报错, (ModBase.RegexSeek(this._ComposerField, "(?<=Failure message: )[\\w\\W]+?(?=\\tMod)", 0) ?? "").Replace("\t", " ").TrimEnd("\r\n ".ToCharArray()));
  1015. }
  1016. }
  1017. if (this._ComposerField.Contains("Multiple entries with same key: "))
  1018. {
  1019. this.AppendReason(CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃, this.TryAnalyzeModName((ModBase.RegexSeek(this._ComposerField, "(?<=Multiple entries with same key: )[^=]+", 0) ?? "").TrimEnd("\r\n ".ToCharArray())));
  1020. }
  1021. if (this._ComposerField.Contains("LoaderExceptionModCrash: Caught exception from "))
  1022. {
  1023. this.AppendReason(CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃, this.TryAnalyzeModName((ModBase.RegexSeek(this._ComposerField, "(?<=LoaderExceptionModCrash: Caught exception from )[^\\n]+", 0) ?? "").TrimEnd("\r\n ".ToCharArray())));
  1024. }
  1025. if (this._ComposerField.Contains("Failed loading config file "))
  1026. {
  1027. this.AppendReason(CrashAnalyzer.CrashReason.Mod配置文件导致游戏崩溃, new string[]
  1028. {
  1029. Enumerable.First<string>(this.TryAnalyzeModName((ModBase.RegexSeek(this._ComposerField, "(?<=Failed loading config file .+ for modid )[^\\n]+", 0) ?? "").TrimEnd(new char[]
  1030. {
  1031. '\r'
  1032. }))),
  1033. (ModBase.RegexSeek(this._ComposerField, "(?<=Failed loading config file ).+(?= of type)", 0) ?? "").TrimEnd(new char[]
  1034. {
  1035. '\r'
  1036. })
  1037. });
  1038. }
  1039. }
  1040. }
  1041. // Token: 0x0600055F RID: 1375 RVA: 0x0002CF9C File Offset: 0x0002B19C
  1042. private void AnalyzeCrit2()
  1043. {
  1044. VB$AnonymousDelegate_3<string, bool> vb$AnonymousDelegate_ = delegate(string LogText)
  1045. {
  1046. bool result;
  1047. if (!LogText.Contains("Mixin prepare failed ") && !LogText.Contains("Mixin apply failed ") && !LogText.Contains("MixinApplyError") && !LogText.Contains("MixinTransformerError") && !LogText.Contains("mixin.injection.throwables.") && !LogText.Contains(".json] FAILED during )"))
  1048. {
  1049. result = false;
  1050. }
  1051. else
  1052. {
  1053. string text2 = ModBase.RegexSeek(LogText, "(?<=from mod )[^.\\/ ]+(?=\\] from)", 0);
  1054. if (text2 == null)
  1055. {
  1056. text2 = ModBase.RegexSeek(LogText, "(?<=for mod )[^.\\/ ]+(?= failed)", 0);
  1057. }
  1058. if (text2 != null)
  1059. {
  1060. this.AppendReason(CrashAnalyzer.CrashReason.ModMixin失败, this.TryAnalyzeModName(text2.TrimEnd("\r\n ".ToCharArray())));
  1061. result = true;
  1062. }
  1063. else
  1064. {
  1065. try
  1066. {
  1067. List<string>.Enumerator enumerator = ModBase.RegexSearch(LogText, "(?<=^[^\\t]+[ \\[{(]{1})[^ \\[{(]+\\.[^ ]+(?=\\.json)", 2).GetEnumerator();
  1068. if (enumerator.MoveNext())
  1069. {
  1070. string text3 = enumerator.Current;
  1071. this.AppendReason(CrashAnalyzer.CrashReason.ModMixin失败, this.TryAnalyzeModName(text3.Replace("mixins", "mixin").Replace(".mixin", "").Replace("mixin.", "")));
  1072. return true;
  1073. }
  1074. }
  1075. finally
  1076. {
  1077. List<string>.Enumerator enumerator;
  1078. ((IDisposable)enumerator).Dispose();
  1079. }
  1080. this.AppendReason(CrashAnalyzer.CrashReason.ModMixin失败, null);
  1081. result = true;
  1082. }
  1083. }
  1084. return result;
  1085. };
  1086. if (this.m_MapperField != null)
  1087. {
  1088. bool flag = vb$AnonymousDelegate_(this.m_MapperField);
  1089. if (this.m_MapperField.Contains("An exception was thrown, the game will display an error screen and halt."))
  1090. {
  1091. CrashAnalyzer.CrashReason reason = CrashAnalyzer.CrashReason.Forge报错;
  1092. string text = ModBase.RegexSeek(this.m_MapperField, "(?<=the game will display an error screen and halt.[\\n\\r]+[^\\n]+?Exception: )[\\s\\S]+?(?=\\n\\tat)", 0);
  1093. this.AppendReason(reason, (text != null) ? text.Trim(new char[]
  1094. {
  1095. '\r'
  1096. }) : null);
  1097. }
  1098. if (this.m_MapperField.Contains("A potential solution has been determined:"))
  1099. {
  1100. this.AppendReason(CrashAnalyzer.CrashReason.Fabric报错并给出解决方案, ModBase.RegexSearch(ModBase.RegexSeek(this.m_MapperField, "(?<=A potential solution has been determined:\\n)((\\t)+ - [^\\n]+\\n)+", 0) ?? "", "(?<=(\\t)+)[^\\n]+", 0).Join("\n"));
  1101. }
  1102. if (this.m_MapperField.Contains("A potential solution has been determined, this may resolve your problem:"))
  1103. {
  1104. this.AppendReason(CrashAnalyzer.CrashReason.Fabric报错并给出解决方案, ModBase.RegexSearch(ModBase.RegexSeek(this.m_MapperField, "(?<=A potential solution has been determined, this may resolve your problem:\\n)((\\t)+ - [^\\n]+\\n)+", 0) ?? "", "(?<=(\\t)+)[^\\n]+", 0).Join("\n"));
  1105. }
  1106. if (this.m_MapperField.Contains("确定了一种可能的解决方法,这样做可能会解决你的问题:"))
  1107. {
  1108. this.AppendReason(CrashAnalyzer.CrashReason.Fabric报错并给出解决方案, ModBase.RegexSearch(ModBase.RegexSeek(this.m_MapperField, "(?<=确定了一种可能的解决方法,这样做可能会解决你的问题:\\n)((\\t)+ - [^\\n]+\\n)+", 0) ?? "", "(?<=(\\t)+)[^\\n]+", 0).Join("\n"));
  1109. }
  1110. if (!flag && this.m_MapperField.Contains("due to errors, provided by "))
  1111. {
  1112. this.AppendReason(CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃, this.TryAnalyzeModName((ModBase.RegexSeek(this.m_MapperField, "(?<=due to errors, provided by ')[^']+", 0) ?? "").TrimEnd("\r\n ".ToCharArray())));
  1113. }
  1114. }
  1115. if (this._ComposerField != null)
  1116. {
  1117. vb$AnonymousDelegate_(this._ComposerField);
  1118. if (this._ComposerField.Contains("Suspected Mod"))
  1119. {
  1120. string str = this._ComposerField.Between("Suspected Mod", "Stacktrace", false);
  1121. if (!str.StartsWithF("s: None", false))
  1122. {
  1123. List<string> list = ModBase.RegexSearch(str, "(?<=\\n\\t[^(\\t]+\\()[^)\\n]+", 0);
  1124. if (Enumerable.Any<string>(list))
  1125. {
  1126. this.AppendReason(CrashAnalyzer.CrashReason.怀疑Mod导致游戏崩溃, this.TryAnalyzeModName(list));
  1127. }
  1128. }
  1129. }
  1130. }
  1131. }
  1132. // Token: 0x06000560 RID: 1376 RVA: 0x0002D1A8 File Offset: 0x0002B3A8
  1133. private void AnalyzeCrit3()
  1134. {
  1135. if (this.m_MapperField != null)
  1136. {
  1137. if (!this.m_MapperField.Contains("at net.") && !this.m_MapperField.Contains("INFO]") && this.propertyField == null && this._ComposerField == null && this.m_MapperField.Length < 100)
  1138. {
  1139. this.AppendReason(CrashAnalyzer.CrashReason.极短的程序输出, this.m_MapperField);
  1140. }
  1141. if (this.m_MapperField.Contains("Mod resolution failed"))
  1142. {
  1143. this.AppendReason(CrashAnalyzer.CrashReason.Mod加载器报错, null);
  1144. }
  1145. if (this.m_MapperField.Contains("Failed to create mod instance."))
  1146. {
  1147. CrashAnalyzer.CrashReason reason = CrashAnalyzer.CrashReason.Mod初始化失败;
  1148. string text;
  1149. if ((text = ModBase.RegexSeek(this.m_MapperField, "(?<=Failed to create mod instance. ModID: )[^,]+", 0)) == null)
  1150. {
  1151. text = (ModBase.RegexSeek(this.m_MapperField, "(?<=Failed to create mod instance. ModId )[^\\n]+(?= for )", 0) ?? "");
  1152. }
  1153. this.AppendReason(reason, this.TryAnalyzeModName(text.TrimEnd(new char[]
  1154. {
  1155. '\r'
  1156. })));
  1157. }
  1158. }
  1159. if (this._ComposerField != null)
  1160. {
  1161. if (this._ComposerField.Contains("\tBlock location: World: "))
  1162. {
  1163. this.AppendReason(CrashAnalyzer.CrashReason.特定方块导致崩溃, ModBase.RegexSeek(this._ComposerField, "(?<=\\tBlock: Block\\{)[^\\}]+", 0) + " " + ModBase.RegexSeek(this._ComposerField, "(?<=\\tBlock location: World: )\\([^\\)]+\\)", 0));
  1164. }
  1165. if (this._ComposerField.Contains("\tEntity's Exact location: "))
  1166. {
  1167. this.AppendReason(CrashAnalyzer.CrashReason.特定实体导致崩溃, ModBase.RegexSeek(this._ComposerField, "(?<=\\tEntity Type: )[^\\n]+(?= \\()", 0) + " (" + (ModBase.RegexSeek(this._ComposerField, "(?<=\\tEntity's Exact location: )[^\\n]+", 0) ?? "").TrimEnd("\r\n".ToCharArray()) + ")");
  1168. }
  1169. }
  1170. }
  1171. // Token: 0x06000561 RID: 1377 RVA: 0x0002D340 File Offset: 0x0002B540
  1172. private List<string> AnalyzeStackKeyword(string ErrorStack)
  1173. {
  1174. ErrorStack = "\n" + ErrorStack + "\n";
  1175. List<string> list = new List<string>();
  1176. list.AddRange(ModBase.RegexSearch(ErrorStack, "(?<=\\n[^{]+)[a-zA-Z_]+\\w+\\.[a-zA-Z_]+[\\w\\.]+(?=\\.[\\w\\.$]+\\.)", 0));
  1177. list.AddRange(Enumerable.Select<string, string>(ModBase.RegexSearch(ErrorStack, "(?<=at [^(]+?\\.\\w+\\$\\w+\\$)[\\w\\$]+?(?=\\$\\w+\\()", 0), (CrashAnalyzer._Closure$__.$I25-0 == null) ? (CrashAnalyzer._Closure$__.$I25-0 = ((string s) => s.Replace("$", "."))) : CrashAnalyzer._Closure$__.$I25-0));
  1178. list = Enumerable.ToList<string>(Enumerable.Distinct<string>(list));
  1179. List<string> list2 = new List<string>();
  1180. try
  1181. {
  1182. List<string>.Enumerator enumerator = list.GetEnumerator();
  1183. IL_174:
  1184. while (enumerator.MoveNext())
  1185. {
  1186. string text = enumerator.Current;
  1187. foreach (string prefix in new string[]
  1188. {
  1189. "java",
  1190. "sun",
  1191. "javax",
  1192. "jdk",
  1193. "oolloo",
  1194. "org.lwjgl",
  1195. "com.sun",
  1196. "net.minecraftforge",
  1197. "paulscode.sound",
  1198. "com.mojang",
  1199. "net.minecraft",
  1200. "cpw.mods",
  1201. "com.google",
  1202. "org.apache",
  1203. "org.spongepowered",
  1204. "net.fabricmc",
  1205. "com.mumfrey",
  1206. "com.electronwill.nightconfig",
  1207. "it.unimi.dsi",
  1208. "MojangTricksIntelDriversForPerformance_javaw"
  1209. })
  1210. {
  1211. if (text.StartsWithF(prefix, false))
  1212. {
  1213. goto IL_174;
  1214. }
  1215. }
  1216. list2.Add(text.Trim());
  1217. }
  1218. }
  1219. finally
  1220. {
  1221. List<string>.Enumerator enumerator;
  1222. ((IDisposable)enumerator).Dispose();
  1223. }
  1224. list2 = Enumerable.ToList<string>(Enumerable.Distinct<string>(list2));
  1225. ModBase.Log("[Crash] 找到 " + Conversions.ToString(list2.Count) + " 条可能的堆栈信息", ModBase.LogLevel.Normal, "出现错误");
  1226. checked
  1227. {
  1228. List<string> result;
  1229. if (!Enumerable.Any<string>(list2))
  1230. {
  1231. result = new List<string>();
  1232. }
  1233. else
  1234. {
  1235. try
  1236. {
  1237. foreach (string str in list2)
  1238. {
  1239. ModBase.Log("[Crash] - " + str, ModBase.LogLevel.Normal, "出现错误");
  1240. }
  1241. }
  1242. finally
  1243. {
  1244. List<string>.Enumerator enumerator2;
  1245. ((IDisposable)enumerator2).Dispose();
  1246. }
  1247. List<string> list3 = new List<string>();
  1248. try
  1249. {
  1250. foreach (string fullStr in list2)
  1251. {
  1252. string[] array2 = fullStr.Split(".");
  1253. int num = Math.Min(3, Enumerable.Count<string>(array2) - 1);
  1254. for (int j = 0; j <= num; j++)
  1255. {
  1256. string text2 = array2[j];
  1257. if (text2.Length > 2 && !text2.StartsWithF("func_", false) && !Enumerable.Contains<string>(new string[]
  1258. {
  1259. "com",
  1260. "org",
  1261. "net",
  1262. "asm",
  1263. "fml",
  1264. "mod",
  1265. "jar",
  1266. "sun",
  1267. "lib",
  1268. "map",
  1269. "gui",
  1270. "dev",
  1271. "nio",
  1272. "api",
  1273. "dsi",
  1274. "top",
  1275. "mcp",
  1276. "core",
  1277. "init",
  1278. "mods",
  1279. "main",
  1280. "file",
  1281. "game",
  1282. "load",
  1283. "read",
  1284. "done",
  1285. "util",
  1286. "tile",
  1287. "item",
  1288. "base",
  1289. "oshi",
  1290. "impl",
  1291. "data",
  1292. "pool",
  1293. "task",
  1294. "forge",
  1295. "setup",
  1296. "block",
  1297. "model",
  1298. "mixin",
  1299. "event",
  1300. "unimi",
  1301. "netty",
  1302. "world",
  1303. "gitlab",
  1304. "common",
  1305. "server",
  1306. "config",
  1307. "mixins",
  1308. "compat",
  1309. "loader",
  1310. "launch",
  1311. "entity",
  1312. "assist",
  1313. "client",
  1314. "plugin",
  1315. "modapi",
  1316. "mojang",
  1317. "shader",
  1318. "events",
  1319. "github",
  1320. "recipe",
  1321. "render",
  1322. "packet",
  1323. "events",
  1324. "preinit",
  1325. "preload",
  1326. "machine",
  1327. "reflect",
  1328. "channel",
  1329. "general",
  1330. "handler",
  1331. "content",
  1332. "systems",
  1333. "modules",
  1334. "service",
  1335. "fastutil",
  1336. "optifine",
  1337. "internal",
  1338. "platform",
  1339. "override",
  1340. "fabricmc",
  1341. "neoforge",
  1342. "injection",
  1343. "listeners",
  1344. "scheduler",
  1345. "minecraft",
  1346. "transformer",
  1347. "transformers",
  1348. "neoforged",
  1349. "universal",
  1350. "multipart",
  1351. "minecraftforge",
  1352. "blockentity",
  1353. "spongepowered",
  1354. "electronwill"
  1355. }, text2.ToLower()))
  1356. {
  1357. list3.Add(text2.Trim());
  1358. }
  1359. }
  1360. }
  1361. }
  1362. finally
  1363. {
  1364. List<string>.Enumerator enumerator3;
  1365. ((IDisposable)enumerator3).Dispose();
  1366. }
  1367. list3 = Enumerable.ToList<string>(Enumerable.Distinct<string>(list3));
  1368. ModBase.Log("[Crash] 从堆栈信息中找到 " + Conversions.ToString(list3.Count) + " 个可能的 Mod ID 关键词", ModBase.LogLevel.Normal, "出现错误");
  1369. if (Enumerable.Any<string>(list3))
  1370. {
  1371. ModBase.Log("[Crash] - " + list3.Join(", "), ModBase.LogLevel.Normal, "出现错误");
  1372. }
  1373. if (list3.Count > 10)
  1374. {
  1375. ModBase.Log("[Crash] 关键词过多,考虑匹配出错,不纳入考虑", ModBase.LogLevel.Normal, "出现错误");
  1376. result = new List<string>();
  1377. }
  1378. else
  1379. {
  1380. result = list3;
  1381. }
  1382. }
  1383. return result;
  1384. }
  1385. }
  1386. // Token: 0x06000562 RID: 1378 RVA: 0x0002DA38 File Offset: 0x0002BC38
  1387. private List<string> AnalyzeModName(List<string> Keywords)
  1388. {
  1389. List<string> list = new List<string>();
  1390. List<string> list2 = new List<string>();
  1391. try
  1392. {
  1393. foreach (string fullStr in Keywords)
  1394. {
  1395. foreach (string text in fullStr.Split("("))
  1396. {
  1397. list2.Add(text.Trim(" )".ToCharArray()));
  1398. }
  1399. }
  1400. }
  1401. finally
  1402. {
  1403. List<string>.Enumerator enumerator;
  1404. ((IDisposable)enumerator).Dispose();
  1405. }
  1406. Keywords = list2;
  1407. if (this._ComposerField != null && this._ComposerField.Contains("A detailed walkthrough of the error"))
  1408. {
  1409. string text2 = this._ComposerField.Replace("A detailed walkthrough of the error", "¨");
  1410. bool flag;
  1411. if (flag = text2.Contains("Fabric Mods"))
  1412. {
  1413. text2 = text2.Replace("Fabric Mods", "¨");
  1414. ModBase.Log("[Crash] 崩溃报告中检测到 Fabric Mod 信息格式", ModBase.LogLevel.Normal, "出现错误");
  1415. }
  1416. text2 = text2.AfterLast("¨", false);
  1417. List<string> list3 = new List<string>();
  1418. foreach (string text3 in text2.Split("\n"))
  1419. {
  1420. if ((text3.ContainsF(".jar", true) && checked(text3.Length - text3.Replace(".jar", "").Length) == 4) || (flag && text3.StartsWithF("\t\t", false) && !ModBase.RegexCheck(text3, "\\t\\tfabric[\\w-]*: Fabric", 0)))
  1421. {
  1422. list3.Add(text3);
  1423. }
  1424. }
  1425. ModBase.Log("[Crash] 崩溃报告中找到 " + Conversions.ToString(list3.Count) + " 个可能的 Mod 项目行", ModBase.LogLevel.Normal, "出现错误");
  1426. List<string> list4 = new List<string>();
  1427. try
  1428. {
  1429. foreach (string text4 in Keywords)
  1430. {
  1431. try
  1432. {
  1433. foreach (string text5 in list3)
  1434. {
  1435. string text6 = text5.ToLower().Replace("_", "");
  1436. if (text6.Contains(text4.ToLower().Replace("_", "")) && !text6.Contains("minecraft.jar") && !text6.Contains(" forge-") && !text6.Contains(" mixin-"))
  1437. {
  1438. list4.Add(text5.Trim("\r\n".ToCharArray()));
  1439. break;
  1440. }
  1441. }
  1442. }
  1443. finally
  1444. {
  1445. List<string>.Enumerator enumerator3;
  1446. ((IDisposable)enumerator3).Dispose();
  1447. }
  1448. }
  1449. }
  1450. finally
  1451. {
  1452. List<string>.Enumerator enumerator2;
  1453. ((IDisposable)enumerator2).Dispose();
  1454. }
  1455. list4 = Enumerable.ToList<string>(Enumerable.Distinct<string>(list4));
  1456. ModBase.Log("[Crash] 崩溃报告中找到 " + Conversions.ToString(list4.Count) + " 个可能的崩溃 Mod 匹配行", ModBase.LogLevel.Normal, "出现错误");
  1457. try
  1458. {
  1459. foreach (string str in list4)
  1460. {
  1461. ModBase.Log("[Crash] - " + str, ModBase.LogLevel.Normal, "出现错误");
  1462. }
  1463. }
  1464. finally
  1465. {
  1466. List<string>.Enumerator enumerator4;
  1467. ((IDisposable)enumerator4).Dispose();
  1468. }
  1469. try
  1470. {
  1471. foreach (string str2 in list4)
  1472. {
  1473. string text7;
  1474. if (flag)
  1475. {
  1476. text7 = ModBase.RegexSeek(str2, "(?<=: )[^\\n]+(?= [^\\n]+)", 0);
  1477. }
  1478. else
  1479. {
  1480. text7 = ModBase.RegexSeek(str2, "(?<=\\()[^\\t]+.jar(?=\\))|(?<=(\\t\\t)|(\\| ))[^\\t\\|]+.jar", 1);
  1481. }
  1482. if (text7 != null)
  1483. {
  1484. list.Add(text7);
  1485. }
  1486. }
  1487. }
  1488. finally
  1489. {
  1490. List<string>.Enumerator enumerator5;
  1491. ((IDisposable)enumerator5).Dispose();
  1492. }
  1493. }
  1494. if (this._ThreadField != null)
  1495. {
  1496. List<string> list5 = ModBase.RegexSearch(this._ThreadField, "(?<=valid mod file ).*", 2);
  1497. ModBase.Log("[Crash] Debug 信息中找到 " + Conversions.ToString(list5.Count) + " 个可能的 Mod 项目行", ModBase.LogLevel.Normal, "出现错误");
  1498. List<string> list6 = new List<string>();
  1499. try
  1500. {
  1501. foreach (string arg in Keywords)
  1502. {
  1503. try
  1504. {
  1505. foreach (string text8 in list5)
  1506. {
  1507. if (text8.Contains(string.Format("{{{0}}}", arg)))
  1508. {
  1509. list6.Add(text8);
  1510. }
  1511. }
  1512. }
  1513. finally
  1514. {
  1515. List<string>.Enumerator enumerator7;
  1516. ((IDisposable)enumerator7).Dispose();
  1517. }
  1518. }
  1519. }
  1520. finally
  1521. {
  1522. List<string>.Enumerator enumerator6;
  1523. ((IDisposable)enumerator6).Dispose();
  1524. }
  1525. list6 = Enumerable.ToList<string>(Enumerable.Distinct<string>(list6));
  1526. ModBase.Log("[Crash] Debug 信息中找到 " + Conversions.ToString(list6.Count) + " 个可能的崩溃 Mod 匹配行", ModBase.LogLevel.Normal, "出现错误");
  1527. try
  1528. {
  1529. foreach (string str3 in list6)
  1530. {
  1531. ModBase.Log("[Crash] - " + str3, ModBase.LogLevel.Normal, "出现错误");
  1532. }
  1533. }
  1534. finally
  1535. {
  1536. List<string>.Enumerator enumerator8;
  1537. ((IDisposable)enumerator8).Dispose();
  1538. }
  1539. try
  1540. {
  1541. foreach (string str4 in list6)
  1542. {
  1543. string text9 = ModBase.RegexSeek(str4, ".*(?= with)", 0);
  1544. if (text9 != null)
  1545. {
  1546. list.Add(text9);
  1547. }
  1548. }
  1549. }
  1550. finally
  1551. {
  1552. List<string>.Enumerator enumerator9;
  1553. ((IDisposable)enumerator9).Dispose();
  1554. }
  1555. }
  1556. list = Enumerable.ToList<string>(Enumerable.Distinct<string>(list));
  1557. List<string> result;
  1558. if (!Enumerable.Any<string>(list))
  1559. {
  1560. result = null;
  1561. }
  1562. else
  1563. {
  1564. ModBase.Log("[Crash] 找到 " + Conversions.ToString(list.Count) + " 个可能的崩溃 Mod 文件名", ModBase.LogLevel.Normal, "出现错误");
  1565. try
  1566. {
  1567. foreach (string str5 in list)
  1568. {
  1569. ModBase.Log("[Crash] - " + str5, ModBase.LogLevel.Normal, "出现错误");
  1570. }
  1571. }
  1572. finally
  1573. {
  1574. List<string>.Enumerator enumerator10;
  1575. ((IDisposable)enumerator10).Dispose();
  1576. }
  1577. result = list;
  1578. }
  1579. return result;
  1580. }
  1581. // Token: 0x06000563 RID: 1379 RVA: 0x0002E01C File Offset: 0x0002C21C
  1582. private List<string> TryAnalyzeModName(string Keyword)
  1583. {
  1584. List<string> list = new List<string>
  1585. {
  1586. Keyword ?? ""
  1587. };
  1588. List<string> result;
  1589. if (string.IsNullOrEmpty(Keyword))
  1590. {
  1591. result = list;
  1592. }
  1593. else
  1594. {
  1595. result = (this.AnalyzeModName(list) ?? list);
  1596. }
  1597. return result;
  1598. }
  1599. // Token: 0x06000564 RID: 1380 RVA: 0x0002E05C File Offset: 0x0002C25C
  1600. private List<string> TryAnalyzeModName(List<string> Keywords)
  1601. {
  1602. List<string> result;
  1603. if (!Enumerable.Any<string>(Keywords))
  1604. {
  1605. result = Keywords;
  1606. }
  1607. else
  1608. {
  1609. result = (this.AnalyzeModName(Keywords) ?? Keywords);
  1610. }
  1611. return result;
  1612. }
  1613. // Token: 0x06000565 RID: 1381 RVA: 0x0002E084 File Offset: 0x0002C284
  1614. public void Output(bool IsHandAnalyze, List<string> ExtraFiles = null)
  1615. {
  1616. ModMain._ProcessIterator.ShowWindowToTop();
  1617. string analyzeResult = this.GetAnalyzeResult(IsHandAnalyze);
  1618. string title = IsHandAnalyze ? "错误报告分析结果" : "Minecraft 出现错误";
  1619. string button = "确定";
  1620. string button2 = (IsHandAnalyze || this.testsField == null) ? "" : "查看日志";
  1621. string button3 = IsHandAnalyze ? "" : "导出错误报告";
  1622. bool isWarn = false;
  1623. bool highLight = true;
  1624. bool forceWait = false;
  1625. Action button1Action = null;
  1626. VB$AnonymousDelegate_4 vb$AnonymousDelegate_ = (IsHandAnalyze || this.testsField == null) ? null : new VB$AnonymousDelegate_4(delegate()
  1627. {
  1628. if (File.Exists(this.testsField.Value.Key))
  1629. {
  1630. ModBase.ShellOnly("notepad", this.testsField.Value.Key);
  1631. return;
  1632. }
  1633. string text3 = ModBase.m_DecoratorRepository + "Crash.txt";
  1634. ModBase.WriteFile(text3, this.testsField.Value.Value.Join("\r\n"), false, null);
  1635. ModBase.ShellOnly(text3, "");
  1636. });
  1637. int num = ModMain.MyMsgBox(analyzeResult, title, button, button2, button3, isWarn, highLight, forceWait, button1Action, (vb$AnonymousDelegate_ == null) ? null : new Action(vb$AnonymousDelegate_.Invoke), null);
  1638. if (num == 3)
  1639. {
  1640. CrashAnalyzer._Closure$__30-0 CS$<>8__locals1 = new CrashAnalyzer._Closure$__30-0(CS$<>8__locals1);
  1641. CS$<>8__locals1.$VB$Local_FileAddress = null;
  1642. try
  1643. {
  1644. ModBase.RunInUiWait(delegate()
  1645. {
  1646. CS$<>8__locals1.$VB$Local_FileAddress = ModBase.SelectAs("选择保存位置", "错误报告-" + DateTime.Now.ToString("G").Replace("/", "-").Replace(":", ".").Replace(" ", "_") + ".zip", "Minecraft 错误报告(*.zip)|*.zip", null);
  1647. });
  1648. if (string.IsNullOrEmpty(CS$<>8__locals1.$VB$Local_FileAddress))
  1649. {
  1650. return;
  1651. }
  1652. Directory.CreateDirectory(ModBase.GetPathFromFullPath(CS$<>8__locals1.$VB$Local_FileAddress));
  1653. if (File.Exists(CS$<>8__locals1.$VB$Local_FileAddress))
  1654. {
  1655. File.Delete(CS$<>8__locals1.$VB$Local_FileAddress);
  1656. }
  1657. ModBase.FeedbackInfo();
  1658. ModBase.LogFlush();
  1659. if (ExtraFiles != null)
  1660. {
  1661. this.m_ErrorField.AddRange(ExtraFiles);
  1662. }
  1663. try
  1664. {
  1665. foreach (string text in this.m_ErrorField)
  1666. {
  1667. string text2 = ModBase.GetFileNameFromPath(text);
  1668. Encoding encoding = null;
  1669. if (Operators.CompareString(text2, "LatestLaunch.bat", false) != 0)
  1670. {
  1671. if (Operators.CompareString(text2, "Log1.txt", false) != 0)
  1672. {
  1673. if (Operators.CompareString(text2, "RawOutput.log", false) == 0)
  1674. {
  1675. text2 = "游戏崩溃前的输出.txt";
  1676. encoding = Encoding.UTF8;
  1677. }
  1678. }
  1679. else
  1680. {
  1681. text2 = "PCL 启动器日志.txt";
  1682. encoding = Encoding.UTF8;
  1683. }
  1684. }
  1685. else
  1686. {
  1687. text2 = "启动脚本.bat";
  1688. }
  1689. if (File.Exists(text))
  1690. {
  1691. if (encoding == null)
  1692. {
  1693. encoding = ModBase.GetEncoding(ModBase.ReadFileBytes(text, null));
  1694. }
  1695. ModBase.WriteFile(this.clientField + "Report\\" + text2, ModSecret.SecretFilter(ModBase.ReadFile(text, encoding), Conversions.ToChar((Operators.CompareString(text2, "启动脚本.bat", false) == 0) ? "F" : "*")), false, encoding);
  1696. ModBase.Log(string.Format("[Crash] 导出文件:{0},编码:{1}", text2, encoding.HeaderName), ModBase.LogLevel.Normal, "出现错误");
  1697. }
  1698. }
  1699. }
  1700. finally
  1701. {
  1702. List<string>.Enumerator enumerator;
  1703. ((IDisposable)enumerator).Dispose();
  1704. }
  1705. ZipFile.CreateFromDirectory(this.clientField + "Report\\", CS$<>8__locals1.$VB$Local_FileAddress);
  1706. ModBase.DeleteDirectory(this.clientField + "Report\\", false);
  1707. ModMain.Hint("错误报告已导出!", ModMain.HintType.Finish, true);
  1708. }
  1709. catch (Exception ex)
  1710. {
  1711. ModBase.Log(ex, "导出错误报告失败", ModBase.LogLevel.Feedback, "出现错误");
  1712. return;
  1713. }
  1714. ModBase.OpenExplorer("/select,\"" + CS$<>8__locals1.$VB$Local_FileAddress + "\"");
  1715. }
  1716. }
  1717. // Token: 0x06000566 RID: 1382 RVA: 0x0002E360 File Offset: 0x0002C560
  1718. private string GetAnalyzeResult(bool IsHandAnalyze)
  1719. {
  1720. string result;
  1721. if (!Enumerable.Any<KeyValuePair<CrashAnalyzer.CrashReason, List<string>>>(this.m_RepositoryField))
  1722. {
  1723. if (IsHandAnalyze)
  1724. {
  1725. result = "很抱歉,PCL 无法确定错误原因。";
  1726. }
  1727. else
  1728. {
  1729. result = string.Format("很抱歉,你的游戏出现了一些问题……{0}如果要寻求帮助,请把错误报告文件发给对方,而不是发送这个窗口的照片或者截图。", "\r\n");
  1730. }
  1731. }
  1732. else
  1733. {
  1734. List<string> list = new List<string>();
  1735. try
  1736. {
  1737. foreach (KeyValuePair<CrashAnalyzer.CrashReason, List<string>> keyValuePair in this.m_RepositoryField)
  1738. {
  1739. List<string> value = keyValuePair.Value;
  1740. switch (keyValuePair.Key)
  1741. {
  1742. case CrashAnalyzer.CrashReason.Mod文件被解压:
  1743. list.Add("由于 Mod 文件被解压了,导致游戏无法继续运行。\\n直接把整个 Mod 文件放进 Mod 文件夹中即可,若解压就会导致游戏出错。\\n\\n请删除 Mod 文件夹中已被解压的 Mod,然后再启动游戏。");
  1744. break;
  1745. case CrashAnalyzer.CrashReason.MixinBootstrap缺失:
  1746. list.Add("由于缺失 MixinBootstrap,导致游戏崩溃。\\n请尝试安装 MixinBootstrap。若安装后依然崩溃,可以尝试在文件名前添加英文感叹号。");
  1747. break;
  1748. case CrashAnalyzer.CrashReason.内存不足:
  1749. list.Add("Minecraft 内存不足,导致其无法继续运行。\\n这很可能是因为电脑内存不足、游戏分配的内存不足,或是配置要求过高。\\n\\n你可以尝试在 更多 → 百宝箱 中选择 内存优化,然后再启动游戏。\\n如果还是不行,请在启动设置中增加为游戏分配的内存,并删除配置要求较高的材质、Mod、光影。\\n如果依然不奏效,请在开始游戏前尽量关闭其他软件,或者……换台电脑?\\h");
  1750. break;
  1751. case CrashAnalyzer.CrashReason.使用JDK:
  1752. list.Add("游戏似乎因为使用 JDK,或 Java 版本过高而崩溃了。\\n请在启动设置的 Java 选择一项中改用 JRE 8(Java 8),然后再启动游戏。\\n如果你没有安装 JRE 8,你可以从网络中下载、安装一个。");
  1753. break;
  1754. case CrashAnalyzer.CrashReason.显卡不支持OpenGL:
  1755. case CrashAnalyzer.CrashReason.显卡驱动不支持导致无法设置像素格式:
  1756. case CrashAnalyzer.CrashReason.Intel驱动不兼容导致EXCEPTION_ACCESS_VIOLATION:
  1757. case CrashAnalyzer.CrashReason.AMD驱动不兼容导致EXCEPTION_ACCESS_VIOLATION:
  1758. case CrashAnalyzer.CrashReason.Nvidia驱动不兼容导致EXCEPTION_ACCESS_VIOLATION:
  1759. if (this._IteratorField.Contains("hd graphics "))
  1760. {
  1761. list.Add("你的显卡驱动存在问题,或未使用独立显卡,导致游戏无法正常运行。\\n\\n如果你的电脑存在独立显卡,请使用独立显卡而非 Intel 核显启动 PCL 与 Minecraft。\\n如果问题依然存在,请尝试升级你的显卡驱动到最新版本,或回退到出厂版本。\\n如果还是不行,还可以尝试使用 8.0.51 或更低版本的 Java。\\h");
  1762. }
  1763. else
  1764. {
  1765. list.Add("你的显卡驱动存在问题,导致游戏无法正常运行。\\n\\n请尝试升级你的显卡驱动到最新版本,或回退到出厂版本,然后再启动游戏。\\n如果还是不行,可以尝试使用 8.0.51 或更低版本的 Java。\\n如果问题依然存在,那么你可能需要换个更好的显卡……\\h");
  1766. }
  1767. break;
  1768. case CrashAnalyzer.CrashReason.使用OpenJ9:
  1769. list.Add("游戏因为使用 Open J9 而崩溃了。\\n请在启动设置的 Java 选择一项中改用非 OpenJ9 的 Java,然后再启动游戏。");
  1770. break;
  1771. case CrashAnalyzer.CrashReason.Java版本过高:
  1772. list.Add("游戏似乎因为你所使用的 Java 版本过高而崩溃了。\\n请在启动设置的 Java 选择一项中改用较低版本的 Java,然后再启动游戏。\\n如果没有,可以从网络中下载、安装一个。");
  1773. break;
  1774. case CrashAnalyzer.CrashReason.Java版本不兼容:
  1775. list.Add("游戏不兼容你当前使用的 Java。\\n如果没有合适的 Java,可以从网络中下载、安装一个。");
  1776. break;
  1777. case CrashAnalyzer.CrashReason.Mod名称包含特殊字符:
  1778. list.Add("由于有 Mod 的名称包含特殊字符,导致游戏崩溃。\\n请尝试修改 Mod 文件名,让它只包含英文字母、数字、减号(-)、下划线(_)和小数点,然后再启动游戏。");
  1779. break;
  1780. case CrashAnalyzer.CrashReason.极短的程序输出:
  1781. list.Add(string.Format("程序返回了以下信息:\\n{0}\\n\\h", Enumerable.First<string>(value)));
  1782. break;
  1783. case CrashAnalyzer.CrashReason.玩家手动触发调试崩溃:
  1784. list.Add("* 事实上,你的游戏没有任何问题,这是你自己触发的崩溃。\\n* 你难道没有更重要的事要做吗?");
  1785. break;
  1786. case CrashAnalyzer.CrashReason.光影或资源包导致OpenGL1282错误:
  1787. list.Add("你所使用的光影或材质导致游戏出现了一些问题……\\n\\n请尝试删除你所添加的这些额外资源。\\h");
  1788. break;
  1789. case CrashAnalyzer.CrashReason.文件或内容校验失败:
  1790. list.Add("部分文件或内容校验失败,导致游戏出现了问题。\\n\\n请尝试删除游戏(包括 Mod)并重新下载,或尝试在重新下载时使用 VPN。\\h");
  1791. break;
  1792. case CrashAnalyzer.CrashReason.确定Mod导致游戏崩溃:
  1793. if (value.Count == 1)
  1794. {
  1795. list.Add("名为 " + Enumerable.First<string>(value) + " 的 Mod 导致了游戏出错。\\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\\n\\e\\h");
  1796. }
  1797. else
  1798. {
  1799. list.Add("以下 Mod 导致了游戏出错:\\n - " + value.Join("\\n - ") + "\\n\\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\\n\\e\\h");
  1800. }
  1801. break;
  1802. case CrashAnalyzer.CrashReason.怀疑Mod导致游戏崩溃:
  1803. case CrashAnalyzer.CrashReason.堆栈分析发现Mod名称:
  1804. if (value.Count == 1)
  1805. {
  1806. list.Add("PCL 怀疑名为 " + Enumerable.First<string>(value) + " 的 Mod 导致了游戏出错,但不能完全确定。\\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\\n\\e\\h");
  1807. }
  1808. else
  1809. {
  1810. list.Add("PCL 怀疑以下 Mod 导致了游戏出错,但不能完全确定:\\n - " + value.Join("\\n - ") + "\\n\\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\\n\\e\\h");
  1811. }
  1812. break;
  1813. case CrashAnalyzer.CrashReason.Mod配置文件导致游戏崩溃:
  1814. if (value[1] == null)
  1815. {
  1816. list.Add("名为 " + Enumerable.First<string>(value) + " 的 Mod 导致了游戏出错。\\n\\e\\h");
  1817. }
  1818. else
  1819. {
  1820. list.Add(string.Concat(new string[]
  1821. {
  1822. "名为 ",
  1823. Enumerable.First<string>(value),
  1824. " 的 Mod 导致了游戏出错:\\n其配置文件 ",
  1825. value[1],
  1826. " 存在异常,无法读取。"
  1827. }));
  1828. }
  1829. break;
  1830. case CrashAnalyzer.CrashReason.ModMixin失败:
  1831. if (value.Count == 0)
  1832. {
  1833. list.Add("部分 Mod 注入失败,导致游戏出错。\\n这一般代表着部分 Mod 与其他 Mod 或当前环境不兼容,或是它存在 Bug。\\n你可以尝试逐步禁用 Mod,然后观察游戏是否还会崩溃,以此定位导致崩溃的 Mod。\\n\\e\\h");
  1834. }
  1835. else if (value.Count == 1)
  1836. {
  1837. list.Add("名为 " + Enumerable.First<string>(value) + " 的 Mod 注入失败,导致游戏出错。\\n这一般代表着它与其他 Mod 或当前环境不兼容,或是它存在 Bug。\\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\\n\\e\\h");
  1838. }
  1839. else
  1840. {
  1841. list.Add("以下 Mod 导致了游戏出错:\\n - " + value.Join("\\n - ") + "\\n这一般代表着它们与其他 Mod 或当前环境不兼容,或是它存在 Bug。\\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\\n\\e\\h");
  1842. }
  1843. break;
  1844. case CrashAnalyzer.CrashReason.Mod加载器报错:
  1845. if (value.Count == 1)
  1846. {
  1847. list.Add("Mod 加载器提供了以下错误信息:\\n" + Enumerable.First<string>(value) + "\\n\\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。");
  1848. }
  1849. else
  1850. {
  1851. list.Add("Mod 加载器可能已经提供了错误信息,请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\\h");
  1852. }
  1853. break;
  1854. case CrashAnalyzer.CrashReason.Mod初始化失败:
  1855. if (value.Count == 1)
  1856. {
  1857. list.Add("名为 " + Enumerable.First<string>(value) + " 的 Mod 初始化失败,导致游戏无法继续加载。\\n你可以尝试禁用此 Mod,然后观察游戏是否还会崩溃。\\n\\e\\h");
  1858. }
  1859. else
  1860. {
  1861. list.Add("以下 Mod 初始化失败,导致游戏出错:\\n - " + value.Join("\\n - ") + "\\n\\n你可以尝试依次禁用上述 Mod,然后观察游戏是否还会崩溃。\\n\\e\\h");
  1862. }
  1863. break;
  1864. case CrashAnalyzer.CrashReason.堆栈分析发现关键字:
  1865. if (value.Count == 1)
  1866. {
  1867. list.Add("你的游戏遇到了一些问题,PCL 为此找到了一个可疑的关键词:" + Enumerable.First<string>(value) + "。\\n\\n如果你知道某个关键词对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\\h");
  1868. }
  1869. else
  1870. {
  1871. list.Add("你的游戏遇到了一些问题,PCL 为此找到了以下可疑的关键词:\\n - " + value.Join(", ") + "\\n\\n如果你知道某个关键词对应的 Mod,那么有可能就是它引起的错误,你也可以查看错误报告获取详情。\\h");
  1872. }
  1873. break;
  1874. case CrashAnalyzer.CrashReason.OptiFine导致无法加载世界:
  1875. list.Add("你所使用的 OptiFine 可能导致了你的游戏出现问题。\\n\\n该问题只在特定 OptiFine 版本中出现,你可以尝试更换 OptiFine 的版本。\\h");
  1876. break;
  1877. case CrashAnalyzer.CrashReason.特定方块导致崩溃:
  1878. if (value.Count == 1)
  1879. {
  1880. list.Add("游戏似乎因为方块 " + Enumerable.First<string>(value) + " 出现了问题。\\n\\n你可以创建一个新世界,并观察游戏的运行情况:\\n - 若正常运行,则是该方块导致出错,你或许需要使用一些方式删除此方块。\\n - 若仍然出错,问题就可能来自其他原因……\\h");
  1881. }
  1882. else
  1883. {
  1884. list.Add("游戏似乎因为世界中的某些方块出现了问题。\\n\\n你可以创建一个新世界,并观察游戏的运行情况:\\n - 若正常运行,则是某些方块导致出错,你或许需要删除该世界。\\n - 若仍然出错,问题就可能来自其他原因……\\h");
  1885. }
  1886. break;
  1887. case CrashAnalyzer.CrashReason.特定实体导致崩溃:
  1888. if (value.Count == 1)
  1889. {
  1890. list.Add("游戏似乎因为实体 " + Enumerable.First<string>(value) + " 出现了问题。\\n\\n你可以创建一个新世界,并生成一个该实体,然后观察游戏的运行情况:\\n - 若正常运行,则是该实体导致出错,你或许需要使用一些方式删除此实体。\\n - 若仍然出错,问题就可能来自其他原因……\\h");
  1891. }
  1892. else
  1893. {
  1894. list.Add("游戏似乎因为世界中的某些实体出现了问题。\\n\\n你可以创建一个新世界,并生成各种实体,观察游戏的运行情况:\\n - 若正常运行,则是某些实体导致出错,你或许需要删除该世界。\\n - 若仍然出错,问题就可能来自其他原因……\\h");
  1895. }
  1896. break;
  1897. case CrashAnalyzer.CrashReason.材质过大或显卡配置不足:
  1898. list.Add("你所使用的材质分辨率过高,或显卡配置不足,导致游戏无法继续运行。\\n\\n如果你正在使用高清材质,请将它移除。\\n如果你没有使用材质,那么你可能需要更新显卡驱动,或者换个更好的显卡……\\h");
  1899. break;
  1900. case CrashAnalyzer.CrashReason.没有可用的分析文件:
  1901. list.Add("你的游戏出现了一些问题,但 PCL 未能找到相关记录文件,因此无法进行分析。\\h");
  1902. break;
  1903. case CrashAnalyzer.CrashReason.使用32位Java导致JVM无法分配足够多的内存:
  1904. if (Environment.Is64BitOperatingSystem)
  1905. {
  1906. list.Add("你似乎正在使用 32 位 Java,这会导致 Minecraft 无法使用所需的内存,进而造成崩溃。\\n\\n请在启动设置的 Java 选择一项中改用 64 位的 Java 再启动游戏,然后再启动游戏。\\n如果你没有安装 64 位的 Java,你可以从网络中下载、安装一个。");
  1907. }
  1908. else
  1909. {
  1910. list.Add("你正在使用 32 位的操作系统,这会导致 Minecraft 无法使用所需的内存,进而造成崩溃。\\n\\n你或许只能重装 64 位的操作系统来解决此问题。\\n如果你的电脑内存在 2GB 以内,那或许只能换台电脑了……\\h");
  1911. }
  1912. break;
  1913. case CrashAnalyzer.CrashReason.Mod重复安装:
  1914. if (value.Count >= 2)
  1915. {
  1916. list.Add("你重复安装了多个相同的 Mod:\\n - " + value.Join("\\n - ") + "\\n\\n每个 Mod 只能出现一次,请删除重复的 Mod,然后再启动游戏。");
  1917. }
  1918. else
  1919. {
  1920. list.Add("你可能重复安装了多个相同的 Mod,导致游戏出错。\\n\\n每个 Mod 只能出现一次,请删除重复的 Mod,然后再启动游戏。\\e\\h");
  1921. }
  1922. break;
  1923. case CrashAnalyzer.CrashReason.Mod互不兼容:
  1924. if (value.Count == 1)
  1925. {
  1926. list.Add("你所安装的 Mod 不兼容:\\n" + Enumerable.First<string>(value) + "\\n\\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。");
  1927. }
  1928. else
  1929. {
  1930. list.Add("你所安装的 Mod 不兼容,Mod 加载器可能已经提供了错误信息,请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\\h");
  1931. }
  1932. break;
  1933. case CrashAnalyzer.CrashReason.OptiFine与Forge不兼容:
  1934. list.Add("由于 OptiFine 与当前版本的 Forge 不兼容,导致了游戏崩溃。\\n\\n请前往 OptiFine 官网(https://optifine.net/downloads)查看 OptiFine 所兼容的 Forge 版本,并严格按照对应版本重新安装游戏。");
  1935. break;
  1936. case CrashAnalyzer.CrashReason.Fabric报错:
  1937. if (value.Count == 1)
  1938. {
  1939. list.Add("Fabric 提供了以下错误信息:\\n" + Enumerable.First<string>(value) + "\\n\\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。");
  1940. }
  1941. else
  1942. {
  1943. list.Add("Fabric 可能已经提供了错误信息,请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\\h");
  1944. }
  1945. break;
  1946. case CrashAnalyzer.CrashReason.Fabric报错并给出解决方案:
  1947. if (value.Count == 1)
  1948. {
  1949. list.Add("Fabric 提供了以下解决方案:\\n" + Enumerable.First<string>(value) + "\\n\\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。");
  1950. }
  1951. else
  1952. {
  1953. list.Add("Fabric 可能已经提供了解决方案,请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\\h");
  1954. }
  1955. break;
  1956. case CrashAnalyzer.CrashReason.Forge报错:
  1957. if (value.Count == 1)
  1958. {
  1959. list.Add("Forge 提供了以下错误信息:\\n" + Enumerable.First<string>(value) + "\\n\\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。");
  1960. }
  1961. else
  1962. {
  1963. list.Add("Forge 可能已经提供了错误信息,请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\\h");
  1964. }
  1965. break;
  1966. case CrashAnalyzer.CrashReason.低版本Forge与高版本Java不兼容:
  1967. list.Add("由于低版本 Forge 与当前 Java 不兼容,导致了游戏崩溃。\\n\\n请尝试以下解决方案:\\n - 更新 Forge 到 36.2.26 或更高版本\\n - 换用版本低于 1.8.0.320 的 Java");
  1968. break;
  1969. case CrashAnalyzer.CrashReason.版本Json中存在多个Forge:
  1970. list.Add("可能由于其他启动器修改了 Forge 版本,当前版本的文件存在异常,导致了游戏崩溃。\\n请尝试重新全新安装 Forge,而非使用其他启动器修改 Forge 版本。");
  1971. break;
  1972. case CrashAnalyzer.CrashReason.Mod过多导致超出ID限制:
  1973. list.Add("你所安装的 Mod 过多,超出了游戏的 ID 限制,导致了游戏崩溃。\\n请尝试安装 JEID 等修复 Mod,或删除部分大型 Mod。");
  1974. break;
  1975. case CrashAnalyzer.CrashReason.NightConfig的Bug:
  1976. list.Add("由于 Night Config 存在问题,导致了游戏崩溃。\\n你可以尝试安装 Night Config Fixes 模组,这或许能解决此问题。\\h");
  1977. break;
  1978. case CrashAnalyzer.CrashReason.ShadersMod与OptiFine同时安装:
  1979. list.Add("无需同时安装 Optifine 和 Shaders Mod,OptiFine 已经集成了 Shaders Mod 的功能。\\n在删除 Shaders Mod 后,游戏即可正常运行。");
  1980. break;
  1981. case CrashAnalyzer.CrashReason.Forge安装不完整:
  1982. list.Add("由于安装的 Forge 文件丢失,导致游戏无法正常运行。\\n请重新安装一次相同版本的 Forge,然后再启动游戏。\\n在打包游戏时删除 libraries 文件夹可能导致此错误。\\h");
  1983. break;
  1984. case CrashAnalyzer.CrashReason.Mod需要Java11:
  1985. list.Add("你所安装的部分 Mod 似乎需要使用 Java 11 启动。\\n请在启动设置的 Java 选择一项中改用 Java 11,然后再启动游戏。\\n如果你没有安装 Java 11,你可以从网络中下载、安装一个。");
  1986. break;
  1987. case CrashAnalyzer.CrashReason.Mod缺少前置或MC版本错误:
  1988. if (Enumerable.Any<string>(value))
  1989. {
  1990. list.Add("由于未安装正确的前置 Mod,导致游戏退出。\\n缺失的依赖项:\\n - " + value.Join("\\n - ") + "\\n\\n请根据上述信息进行对应处理,如果看不懂英文可以使用翻译软件。");
  1991. }
  1992. else
  1993. {
  1994. list.Add("由于未安装正确的前置 Mod,导致游戏退出。\\n请根据错误报告中的日志信息进行对应处理,如果看不懂英文可以使用翻译软件。\\h");
  1995. }
  1996. break;
  1997. default:
  1998. list.Add("PCL 获取到了没有详细信息的错误原因(" + Conversions.ToString((int)Enumerable.First<KeyValuePair<CrashAnalyzer.CrashReason, List<string>>>(this.m_RepositoryField).Key) + "),请向 PCL 作者提交反馈以获取详情。\\h");
  1999. break;
  2000. }
  2001. }
  2002. }
  2003. finally
  2004. {
  2005. Dictionary<CrashAnalyzer.CrashReason, List<string>>.Enumerator enumerator;
  2006. ((IDisposable)enumerator).Dispose();
  2007. }
  2008. result = list.Join("\\n\\n此外,").Replace("\\n", "\r\n").Replace("\\h", "").Replace("\\e", IsHandAnalyze ? "" : "\r\n你可以查看错误报告了解错误具体是如何发生的。").Replace("\r\n", "\r").Replace("\n", "\r").Replace("\r", "\r\n").Trim("\r\n".ToCharArray()) + ((!Enumerable.Any<string>(list, (CrashAnalyzer._Closure$__.$I31-0 == null) ? (CrashAnalyzer._Closure$__.$I31-0 = ((string r) => r.EndsWithF("\\h", false))) : CrashAnalyzer._Closure$__.$I31-0) || IsHandAnalyze) ? "" : ("\r\n如果要寻求帮助,请把错误报告文件发给对方,而不是发送这个窗口的照片或者截图。" + (PageSetupSystem.IsLauncherNewest().GetValueOrDefault(true) ? "" : "\r\n\r\n此外,你正在使用老版本 PCL,更新 PCL 或许也能解决这个问题。\r\n你可以点击 设置 → 启动器 → 检查更新 来更新 PCL。")));
  2009. }
  2010. return result;
  2011. }
  2012. // Token: 0x040002B7 RID: 695
  2013. private static bool fieldField = false;
  2014. // Token: 0x040002B8 RID: 696
  2015. private static object m_ReaderField = RuntimeHelpers.GetObjectValue(new object());
  2016. // Token: 0x040002B9 RID: 697
  2017. private string clientField;
  2018. // Token: 0x040002BA RID: 698
  2019. private List<KeyValuePair<string, string[]>> _ConfigField;
  2020. // Token: 0x040002BB RID: 699
  2021. private KeyValuePair<string, string[]>? testsField;
  2022. // Token: 0x040002BC RID: 700
  2023. private string m_MapperField;
  2024. // Token: 0x040002BD RID: 701
  2025. private string _ThreadField;
  2026. // Token: 0x040002BE RID: 702
  2027. private string propertyField;
  2028. // Token: 0x040002BF RID: 703
  2029. private string _ComposerField;
  2030. // Token: 0x040002C0 RID: 704
  2031. private string _IteratorField;
  2032. // Token: 0x040002C1 RID: 705
  2033. private Dictionary<CrashAnalyzer.CrashReason, List<string>> m_RepositoryField;
  2034. // Token: 0x040002C2 RID: 706
  2035. private List<string> m_ErrorField;
  2036. // Token: 0x020000B0 RID: 176
  2037. private enum AnalyzeFileType
  2038. {
  2039. // Token: 0x040002C4 RID: 708
  2040. HsErr,
  2041. // Token: 0x040002C5 RID: 709
  2042. MinecraftLog,
  2043. // Token: 0x040002C6 RID: 710
  2044. ExtraLog,
  2045. // Token: 0x040002C7 RID: 711
  2046. CrashReport
  2047. }
  2048. // Token: 0x020000B1 RID: 177
  2049. private enum CrashReason
  2050. {
  2051. // Token: 0x040002C9 RID: 713
  2052. Mod文件被解压,
  2053. // Token: 0x040002CA RID: 714
  2054. MixinBootstrap缺失,
  2055. // Token: 0x040002CB RID: 715
  2056. 内存不足,
  2057. // Token: 0x040002CC RID: 716
  2058. 使用JDK,
  2059. // Token: 0x040002CD RID: 717
  2060. 显卡不支持OpenGL,
  2061. // Token: 0x040002CE RID: 718
  2062. 使用OpenJ9,
  2063. // Token: 0x040002CF RID: 719
  2064. Java版本过高,
  2065. // Token: 0x040002D0 RID: 720
  2066. Java版本不兼容,
  2067. // Token: 0x040002D1 RID: 721
  2068. Mod名称包含特殊字符,
  2069. // Token: 0x040002D2 RID: 722
  2070. 显卡驱动不支持导致无法设置像素格式,
  2071. // Token: 0x040002D3 RID: 723
  2072. 极短的程序输出,
  2073. // Token: 0x040002D4 RID: 724
  2074. Intel驱动不兼容导致EXCEPTION_ACCESS_VIOLATION,
  2075. // Token: 0x040002D5 RID: 725
  2076. AMD驱动不兼容导致EXCEPTION_ACCESS_VIOLATION,
  2077. // Token: 0x040002D6 RID: 726
  2078. Nvidia驱动不兼容导致EXCEPTION_ACCESS_VIOLATION,
  2079. // Token: 0x040002D7 RID: 727
  2080. 玩家手动触发调试崩溃,
  2081. // Token: 0x040002D8 RID: 728
  2082. 光影或资源包导致OpenGL1282错误,
  2083. // Token: 0x040002D9 RID: 729
  2084. 文件或内容校验失败,
  2085. // Token: 0x040002DA RID: 730
  2086. 确定Mod导致游戏崩溃,
  2087. // Token: 0x040002DB RID: 731
  2088. 怀疑Mod导致游戏崩溃,
  2089. // Token: 0x040002DC RID: 732
  2090. Mod配置文件导致游戏崩溃,
  2091. // Token: 0x040002DD RID: 733
  2092. ModMixin失败,
  2093. // Token: 0x040002DE RID: 734
  2094. Mod加载器报错,
  2095. // Token: 0x040002DF RID: 735
  2096. Mod初始化失败,
  2097. // Token: 0x040002E0 RID: 736
  2098. 堆栈分析发现关键字,
  2099. // Token: 0x040002E1 RID: 737
  2100. 堆栈分析发现Mod名称,
  2101. // Token: 0x040002E2 RID: 738
  2102. OptiFine导致无法加载世界,
  2103. // Token: 0x040002E3 RID: 739
  2104. 特定方块导致崩溃,
  2105. // Token: 0x040002E4 RID: 740
  2106. 特定实体导致崩溃,
  2107. // Token: 0x040002E5 RID: 741
  2108. 材质过大或显卡配置不足,
  2109. // Token: 0x040002E6 RID: 742
  2110. 没有可用的分析文件,
  2111. // Token: 0x040002E7 RID: 743
  2112. 使用32位Java导致JVM无法分配足够多的内存,
  2113. // Token: 0x040002E8 RID: 744
  2114. Mod重复安装,
  2115. // Token: 0x040002E9 RID: 745
  2116. Mod互不兼容,
  2117. // Token: 0x040002EA RID: 746
  2118. OptiFine与Forge不兼容,
  2119. // Token: 0x040002EB RID: 747
  2120. Fabric报错,
  2121. // Token: 0x040002EC RID: 748
  2122. Fabric报错并给出解决方案,
  2123. // Token: 0x040002ED RID: 749
  2124. Forge报错,
  2125. // Token: 0x040002EE RID: 750
  2126. 低版本Forge与高版本Java不兼容,
  2127. // Token: 0x040002EF RID: 751
  2128. 版本Json中存在多个Forge,
  2129. // Token: 0x040002F0 RID: 752
  2130. Mod过多导致超出ID限制,
  2131. // Token: 0x040002F1 RID: 753
  2132. NightConfig的Bug,
  2133. // Token: 0x040002F2 RID: 754
  2134. ShadersMod与OptiFine同时安装,
  2135. // Token: 0x040002F3 RID: 755
  2136. Forge安装不完整,
  2137. // Token: 0x040002F4 RID: 756
  2138. Mod需要Java11,
  2139. // Token: 0x040002F5 RID: 757
  2140. Mod缺少前置或MC版本错误
  2141. }
  2142. }
  2143. }