启动 1.4.2 崩溃
检查项
- [x] 我所启动的游戏不是整合包,且未安装任何 Mod。 安装 Mod 后的游戏崩溃基本不是 PCL 的原因,请 不要 提交反馈。你可以在论坛或社区找人求助,但这里并不是你求助的地方。
- [x] 我已尝试使用 HMCL 启动,HMCL 没有出现问题。 如果 HMCL 也无法启动就不是 PCL 导致的问题,请 不要 提交反馈。下载 HMCL
- [x] 我已在 Issues 页面 和 常见&难检反馈及问题列表 中搜索,确认了这一 Bug 未被提交过。
描述
启动 1.4.2 版本时崩溃
这个核心甚至通过 PCL 装的
HMCL 使用 8.0.432 不会崩溃,PCL 用 8u51 却崩溃了....
PCL 错误报告、日志与附件
HMCL 启动脚本
尝试进行以下分析:
使用PCL最新快照发布版本下载并尝试启动1.4.2版本,注意到PCL在下载成功后似乎并没有按常规创建低版本的资源文件,而后启动后报错为读不到icon文件,与issue中错误报告一致。由于issue提到了HMCL,下载并将HMCL放置于PCL同目录下,使用HMCL尝试启动1.4.2核心,注意到HMCL对资源文件进行了重新下载,基本锁定问题所在。HMCL在.minecraft\assets\virtual下建立了pre-1.6并将版本所需资源放置在这个文件夹下,在启动脚本中设置--assetsDir "C:\\Users\\Administrator\\Downloads\\-shot 2.10.2\\.minecraft\\assets\\virtual\\pre-1.6"
基于此发现,打开PCL输出的最后一次启动脚本,发现PCL使用的目录为--assetsDir "C:\Users\Administrator\Downloads\-shot 2.10.2\.minecraft\assets\virtual\legacy" 与报错中的以下部分相吻合
Loading current icons for window from: D:\project\downloads\.minecraft\assets\virtual\legacy\icons\icon_16x16.png and D:\project\downloads\.minecraft\assets\virtual\legacy\icons\icon_32x32.png
javax.imageio.IIOException: Can't read input file!
同时阅读本机PCL日志发现,发现PCL在输出中正确识别出了版本并且下载了文件
[00:55:43.670] [Download] 版本 1.4.2 对应的资源文件索引为 pre-1.6
[00:55:43.680] [Loader] 加载器 分析资源文件索引地址(副加载器) 状态改变:Finished
[00:55:43.680] [Loader] 加载器 下载资源文件索引(副加载器) 状态改变:Loading
[00:55:43.711] [Download] pre-1.6.json 891#:开始,起始点 0,https://launchermeta.mojang.com/v1/packages/3d8e55480977e32acd9844e545177e69a52f594b/pre-1.6.json
[00:55:43.727] [Download] 开始分析原版支持库文件:C:\Users\Administrator\Downloads\-shot 2.10.2\.minecraft\versions\1.4.2\
[00:55:43.744] [Minecraft] 获取支持库列表:1.4.2
[00:55:43.751] [Minecraft] 发现重复的支持库:[Native] 152 K | C:\Users\Administrator\Downloads\-shot 2.10.2\.minecraft\libraries\net\java\jinput\jinput-platform\2.0.5\jinput-platform-2.0.5-natives-windows.jar (2.0.5) 与 [Native] 152 K | C:\Users\Administrator\Downloads\-shot 2.10.2\.minecraft\libraries\net\java\jinput\jinput-platform\2.0.5\jinput-platform-2.0.5-natives-windows.jar (2.0.5),已忽略其中之一
[00:55:43.754] [Loader] 加载器 分析原版支持库文件(副加载器) 状态改变:Finished
[00:55:43.755] [Loader] 加载器 下载原版支持库文件(副加载器) 状态改变:Loading
[00:55:43.773] [Download] 1.4.2.jar 912#:开始,起始点 0,https://launcher.mojang.com/v1/objects/42d6744cfbbd2958f9e6688dd6e78d86d658d0d4/client.jar
[00:55:43.773] [Download] jopt-simple-4.5.jar 913#:开始,起始点 0,https://libraries.minecraft.net/net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar
[00:55:43.773] [Download] jinput-2.0.5.jar 914#:开始,起始点 0,https://libraries.minecraft.net/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar
[00:55:43.774] [Download] lwjgl-2.9.0.jar 915#:开始,起始点 0,https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl/2.9.0/lwjgl-2.9.0.jar
[00:55:43.776] [Download] lwjgl-platform-2.9.0-natives-windows.jar 916#:开始,起始点 0,https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl-platform/2.9.0/lwjgl-platform-2.9.0-natives-windows.jar
[00:55:43.788] [Download] launchwrapper-1.5.jar 917#:开始,起始点 0,https://libraries.minecraft.net/net/minecraft/launchwrapper/1.5/launchwrapper-1.5.jar
[00:55:43.789] [Download] asm-all-4.1.jar 918#:开始,起始点 0,https://libraries.minecraft.net/org/ow2/asm/asm-all/4.1/asm-all-4.1.jar
[00:55:43.789] [Download] jutils-1.0.0.jar 919#:开始,起始点 0,https://libraries.minecraft.net/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar
[00:55:43.789] [Download] lwjgl_util-2.9.0.jar 920#:开始,起始点 0,https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl_util/2.9.0/lwjgl_util-2.9.0.jar
[00:55:43.789] [Download] jinput-platform-2.0.5-natives-windows.jar 921#:开始,起始点 0,https://libraries.minecraft.net/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-windows.jar
[00:55:43.798] [Download] pre-1.6.json 891#:文件大小 74091(72.4 K)
[00:55:43.808] [Download] pre-1.6.json:已完成,剩余文件 10
在下载完成后,PCL输出了以下日志
[18:44:46.021] [Download] 开始进行版本合并,输出:D:\project\downloads\.minecraft\versions\1.4.2\,Minecraft:D:\project\downloads\.minecraft\versions\1.4.2\
[18:44:46.023] [Download] 版本合并 1.4.2 完成
[18:44:46.025] [Download] 自动创建资源包文件夹:D:\project\downloads\.minecraft\versions\1.4.2\resourcepacks\
可以发现,PCL正确执行了安装过程的版本隔离。 经过分析可得,我们可以在资源下载和启动阶段设置--assetsDir的地方入手。 经过查看PCL开放的源代码我们不难发现,在PCL代码中有如下部分与其相关 1.McAssetsListGet https://github.com/Meloong-Git/PCL/blob/fdf5407ea3eecad953620dacb0e4733b1480117a/Plain Craft Launcher 2/Modules/Minecraft/ModMinecraft.vb#L2182-L2217
Private Function McAssetsListGet(Version As McVersion) As List(Of McAssetsToken)
Dim IndexName = McAssetsGetIndexName(Version)
Try
'初始化
If Not File.Exists($"{PathMcFolder}assets\indexes\{IndexName}.json") Then Throw New FileNotFoundException("未找到 Asset Index", PathMcFolder & "assets\indexes\" & IndexName & ".json")
Dim Result As New List(Of McAssetsToken)
Dim Json As JObject = GetJson(ReadFile($"{PathMcFolder}assets\indexes\{IndexName}.json"))
'读取列表
For Each File As JProperty In Json("objects").Children
Dim LocalPath As String
If Json("map_to_resources") IsNot Nothing AndAlso Json("map_to_resources").ToObject(Of Boolean) Then
'Remap
LocalPath = Version.PathIndie & "resources\" & File.Name.Replace("/", "\")
ElseIf Json("virtual") IsNot Nothing AndAlso Json("virtual").ToObject(Of Boolean) Then
'Virtual
LocalPath = PathMcFolder & "assets\virtual\legacy\" & File.Name.Replace("/", "\")
Else
'正常
LocalPath = PathMcFolder & "assets\objects\" & Left(File.Value("hash").ToString, 2) & "\" & File.Value("hash").ToString
End If
Result.Add(New McAssetsToken With {
.LocalPath = LocalPath,
.SourcePath = File.Name,
.Hash = File.Value("hash").ToString,
.Size = File.Value("size").ToString
})
Next
Return Result
Catch ex As Exception
Log(ex, "获取资源文件列表失败:" & IndexName)
Throw
End Try
End Function
这部分的代码是用于解析需要的资源列表,设定资源下载方式的关键,而在这里我们可以看到,当资源索引(*.json)中包含有objects属性并且有map_to_resources这个属性时,PCL会将下载好的资源放置在版本目录(这里应该与MC目录有区别,版本是指.minecraft\versions\1.4.12而MC目录仅仅只是.minecraft文件夹)下的resources文件夹下并通过替换字符串的方式将json中的目录+文件名变成合法的目录加文件名,例如将"icons/icon_16x16.png"替换为"icons\icon_16x16.png"
而我们可以通过阅读.minecraft\assets\indexes下的pre-1.6.json文件很快判断出它符合了我们上面所说情况的判断标准。
故而我们找到了PCL将资源文件下载到.minecraft\versions\1.4.2\resourcepacks\是一个符合预期的操作。那么为什么还是会出错呢?我认为是因为以下的原因,继续翻看PCL公开源代码,我们发现了上文所提到的--assetsDir "C:\Users\Administrator\Downloads\-shot 2.10.2\.minecraft\assets\virtual\legacy" 的来源。
2.assetsDir参数的来源
https://github.com/Meloong-Git/PCL/blob/fdf5407ea3eecad953620dacb0e4733b1480117a/Plain Craft Launcher 2/Modules/Minecraft/ModLaunch.vb#L1700
GameArguments.Add("${game_assets}", ShortenPath(PathMcFolder & "assets\virtual\legacy")) '1.5.2 的 pre-1.6 资源索引应与 legacy 合并
好的,这一下就算我们没有之前的分析也可以根据注释猜出个七七八八。也许在之前版本(是的,因为目前所下载的1.5.2版本的pre-1.6.json)虽然我认为它们是同一个,但我还是测试了下,总之也许之前版本的pre-1.6.json文件是符合
ElseIf Json("virtual") IsNot Nothing AndAlso Json("virtual").ToObject(Of Boolean) Then
'Virtual
LocalPath = PathMcFolder & "assets\virtual\legacy\" & File.Name.Replace("/", "\")
这一条判断规则的,因为如果它满足这样的条件,我推测了一下PCL的处理方式是正确的,但是不知道为什么这个文件的格式被修改了,而PCL并没有跟进,从而导致游戏无法获取到资源文件。
/cc @LTCatt
目前看来这是一个随机崩溃,我使用 HMCL 启动了三次也崩了一次,PCL 也是时崩时不崩。
minecraft-exported-crash-info-2025-07-22T00-06-29.zip
不过我的崩溃信息里没有找不到图标的报错,可能不是同一个错误就是了(
PCL 的 ${game_assets} 确实和 HMCL 不一样,但考虑到 HMCL 也崩,这应该不是导致我这里崩溃的原因?
搞不懂是咋回事……
我这里复现不出来:
使用 HMCL 全安装,系统是 Ubuntu 24.04.2 LTS
竟然是 PCL 安装 HMCL 也会崩溃,我觉得是 PCL 安装的 version json 有问题?
edit
1.4.7 也没问题
复现现象正好相反,使用 PCL 可以正常启动,而使用 HMCL 则会抛出 NPE…… ~有点神奇?~
HMCL 导出错误报告 | minecraft-exported-crash-info-2025-07-23T00-30-42.zip PCL 日志 | Log1.txt 触发调试崩溃后由开源版本 PCL 导出错误报告 | 错误报告-2025-7-23_0.49.19.zip
off-topic: 旧版 Minecraft 在部分崩溃场景下仍会输出 Someone is closing me! 导致启动器误判为正常关闭……这个要处理嘛
?我现在没法复现了? 分别使用 PCL、HMCL 各安装了一个 1.4.2,然后分别使用 PCL、HMCL 启动这两个版本数次,均无崩溃…… 如果谁有会崩溃的版本,可以发一个版本 json。
也许是我复现的时候出错了。我忙完手上的前端和高数补考再瞅瞅
……我那么大一个 virtual 文件夹呢?
错误报告-2025.9.10_23.56.14.zip 复现方式:创建一个新的文件夹,在这个文件夹里单独安装 1.4.2 版本
![]()
这个情况跟我复现的倒是一致。。。也许我忽略了我是在一个新文件夹里下载的情况?