本帖最后由 洞穴夜莺 于 2021-4-17 22:09 编辑 
前言
最近几天有一名用户私信找我说他的电脑过热自动关机导致存档损坏了,我帮他解决之后,他便问我怎么看出来的。因为整个过程比较难解释,所以打算发一篇主题帖来解释。询问绵羊之后,他说可以发在茶馆。于是有了这篇帖子。
先来说说这位用户的症状
一些例行分析
帖子他在https://www.mcbbs.net/thread-1190437-1-1.html也发了
首先看到SystemDetails
可以看出这位用户的版本是1.12.2 Forge,但是由于安装了VanillaFix,所以他的崩溃栈帧全部是反混淆状态,故我们不需要准备Forge 1.12.2的混淆映射表即可阅读这位用户的崩溃报告。
关于崩溃异常栈帧的解读
机翻一下
翻译一下
通俗一点讲,就好比你去看绵羊的女装,结果突然断网了,只加载出来上半部分,而这里Minecraft在保存压缩文件的时候突然断电,它的压缩文件只保存了一半,然后再加载的时候就会发现,这东西只能解压得了前半部分,那么公认的妥当处理方法就是退出来让玩家处理。
但是这里有一个很缺德的地方在于:他不说到底解压的是哪个文件,只说解压文件出了问题,于是我们继续看后面的调用栈帧
可以注意到有这么一段:
可以看到是AnvilChunkLoader(铁砧区块加载器)在loadChunk(加载区块)的时候出现了错误,联想一下,Minecraft的区块存储在区域文件里,后缀是.mca。所以先列举一下所有的.mca文件(我向他要了整个整合包,这里就不放出来了,只贴一下列举的结果)
这就是说,玩家目前在主世界(注:0 - 主世界,-1 - 下界,1 - 末地),主世界的区域文件直接存储在存档的region文件夹中,范围可以进一步缩小到
解释一下这里文件名的意思,“r.<rX>.<rZ>.mca”是区域坐标为(rX, rZ)的区域的存档文件,又知玩家进入游戏时只会加载玩家附近的区域和强制加载区块和出生点,这个存档我看过没有常加载区块,所以只是需要考虑玩家附近的区域和出生点。
于是乎再到level.dat里面找玩家位置和出生点坐标,玩家位置位于/Data/Player/Pos
然后出生点位置位于/Data/SpawnX、/Data/SpawnY和/Data/SpawnZ
根据已有知识区域坐标和实体坐标(X, Y, Z)的换算
[注:floor是一个函数,floor(x) = 不小于x的最大整数]
根据如上公式算出玩家区域坐标为(-8, 20),出生点区域坐标为(-1, 0),所以排查范围进一步缩小为
接着备份之后挨个删除测试能不能进就完事。最后找出来是./region/r.-9.20.mca
再把备份解压一下,只删除./region/r.-9.20.mca而不删除其他文件,能进,NICE!
这样我们就实现数据丢失较少的存档抢救
一般化的存档损坏的判断
Minecraft:Java Edition存档的目录结构
Minecraft:Java Edition 1.12和Minecraft:Java Edition1.16的目录结构有所不同,在中间的版本介于这两这种目录结构之间,没有太多花样,下面以这两个版本为例讲一下Minecraft存档的目录结构
如果你的Minecraft安装了Mod,那你可能就要自己看看有哪些结构有什么改变了,将损坏的文件备份并删除或者从备份中恢复损坏的文件,很多时候可以进入存档(代价是某些内容会丢失)
Minecraft: Java Edition 1.16
下面这里看到的是一个简单的Minecraft: Java Edition 1.16.x的存档的文件列表,请注意,这个结构不适用于插件服务器,Bukkit对这个结构魔改过
advancements/<UUID>.json
这些文件存放玩家的进度达成情况,你可以注意到有个5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.json文件,其中5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f是我的UUID,当中的内容是以JSON格式存放玩家5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f的进度达成情况(玩家的UUID我想不需要解释吧)
data/idcounts.dat
这个文件只保存一个数字:世界上有多少地图(物品)
data/map_<Numberic Map ID>.dat
这些文件存储每个地图的中心位置坐标、维度和地图上每个像素点的颜色,放大倍率,以及地图上记录的旗帜。通过制图台复制的地图会在被不同玩家编辑其中任意一张时其他地图同步修改,这就是地图需要单独建文件的原因(不然根本不知道剩下几张地图在谁手里、哪个区块),格式为NBT
data/raids.dat
这个记录世界上所有袭击的信息以及世界上总共打了几场袭击,格式为NBT。
datapacks
数据包存放目录,一般不会损坏,因为Minecraft在运行过程中对这个文件夹只读不写,不展开讲。
playerdata/<UUID>.dat
字面意思,存放玩家的有关信息,不过请注意客户端中单人游戏/局域网联机的服主的玩家信息是存贮在level.dat中的,格式为NBT。它有个备份在文件名的后面加了个_old,Minecraft每次写入新的<UUID>.dat文件之前都会把旧的<UUID>.dat重命名为<UUID>.dat_old,如果你认为这个文件损坏了,可以试试重命名这个文件然后用对应的_old文件覆盖它。
poi/r.<rX>.<rZ>.mca
这里的poi是指PointOfInterest,通俗地讲就是有些生物会和某些方块建立联系(例如村民与职业方块、村民与床等等),而这些文件记载了主世界中这些方块的信息,格式为铁砧区域格式。
region/r.<rX>.<rZ>.mca
这个上面那个案例讲过了,是主世界的区块保存的地方(例如各种方块与实体),格式为铁砧区域格式。
DIM1、DIM-1、和所有有poi、data、region子文件夹的文件夹
这些文件夹中的poi、data、region三个子文件夹和存档根目录下的poi、data、region三个文件夹的结构相似,但存储的数据不是主世界而是对应其他维度的,文件夹名的规律为minecraft:the_end使用DIM1作为文件夹名,minecraft:nether使用DIM-1作为文件夹名,剩余的维度使用其ID作为文件夹名。
stats/<UUID>.json
这个文件记录了玩家的统计信息,格式为JSON格式。
forcedchunks.dat
这个文件记录了玩家的设置的常加载区块,格式为解压缩的NBT。
icon.png
世界的图标,一般这个文件损坏无大碍。
generated
据我所知这个文件夹好像只用来存放在游戏中使用结构方块保存的结构。generated/<命名空间>/structures/<路径>.nbt是以解压缩的nbt格式存储<命名空间>:<路径>这个结构。
level.dat
这个文件是决定你的世界能不能出现在世界菜单上的重要文件,如果你的存档从存档列表中消失了,跟这个文件损坏多半有关系。它记载一些有关存档的重要全局信息,例如:世界种子、世界出生点、世界名称、游戏规则、服主信息等等,甚至还有注册表信息(对于Forge/Fabric等)。它和playerdata下的各个文件一样,这里面的数据基本生都是重要数据,Minecraft会在保存之前把旧的level.dat备份到level.dat_old,如果你觉得level.dat损坏了,可以尝试把level.dat_old恢复到level.dat。有用的数据很多,比如上文提到的玩家坐标、维度,出生点坐标、维度等等。
lsession.lock
这个文件里并没有什么信息。
Minecraft: Java Edition 1.12
1.12的目录结构和1.16的大同小异,区别在于,1.12没有datapacks文件夹(因为不支持数据包),会将一些结构的信息写入data/<结构名称>.dat中(在新版中,这些东西跟随区块保存了),没有poi文件夹(Minecraft1.12没有PointOfInterest这个游戏机制),自定义维度(仅能通过Mod实现)的存储路径从维度ID变成“DIM<维度数字ID>”例如暮色的存档位置可能是DIM7(和配置有关),此外一些在高版本中由数据包实现的内容在1.12中在data文件夹中保存(例如函数被放到了data/functions)。(说实话我具体的也并不是很清楚,因为不怎么玩1.12.x,剩下的具体碰到的时候再说吧 )
 )
关于诊断
存档不识别怀疑level.dat损坏
如果你好几个存档都进不去,那多半不是存档损坏造成的,更建议去找找Mod的问题
有的时候进不去存档不一定是存档损坏,如果是卡半天进不去可能是由于网络原因,这时候我建议你去试试断开网络之后能不能打开存档,能打开的话说明上面的内容全白看了 ,你这个不是存档损坏,单纯的是连接到mojang超时了
 ,你这个不是存档损坏,单纯的是连接到mojang超时了 ,而有的时候你可以在forge.cfg中将removeErroringEntity和removeErroringTileEntity设为true试试能不能进入游戏,可能只是你周围的某个实体卡了BUG导致你进不去游戏,启用这个选项会将出错的方块和方块实体删除。
,而有的时候你可以在forge.cfg中将removeErroringEntity和removeErroringTileEntity设为true试试能不能进入游戏,可能只是你周围的某个实体卡了BUG导致你进不去游戏,启用这个选项会将出错的方块和方块实体删除。 
关于如何阅读崩溃报告可以参考https://www.mcbbs.net/thread-860103-1-1.html,不过蝙蝠这篇文章没有讲到的一点,如果你的报告的栈帧是混淆的(例如有很多诸如dcb、sqk、class_2407、class_1023、method_19375、method_40223、func_45353_k、func_2971_b这样的无意义内容),你需要对照混淆映射表阅读报告,Minecraft混淆映射表的使用方法建议去问度娘
如果你的报告中有出现java.io.EOFException这样的字眼,基本上可以确定是和存档损坏有关(有时是数据包/材质包的锅),从栈帧上可以大致确定是在加载什么内容时崩溃(比如上面那位其实就有AnvilChunkLoader.loadChunk这样的字眼提示),再通过一些Minecraft知识可以缩小范围,剩下基本二分法能解决
最重要的,不要让你的电脑过热保护断电(对电脑是一种伤害,也威胁你的其他数据安全)
以及多备份Minecraft存档
水怪席
@⚡️👮 @🥶❄️☠️ @bleake @伟大的小安 @诡灬稽 @enderman_JC @🐦💕🌸🌸 @RarityEG @800805 @水怪诗人 @小孩孩 @小灬望 @北极仙光 @离 @🌱⛄🐏 @Arrosin @板砖w @Ender56 @immangguo @Flavor_xy
来自群组: 后花园
前言
最近几天有一名用户私信找我说他的电脑过热自动关机导致存档损坏了,我帮他解决之后,他便问我怎么看出来的。因为整个过程比较难解释,所以打算发一篇主题帖来解释。询问绵羊之后,他说可以发在茶馆。于是有了这篇帖子。


先来说说这位用户的症状
一些例行分析
帖子他在https://www.mcbbs.net/thread-1190437-1-1.html也发了
首先看到SystemDetails
可以看出这位用户的版本是1.12.2 Forge,但是由于安装了VanillaFix,所以他的崩溃栈帧全部是反混淆状态,故我们不需要准备Forge 1.12.2的混淆映射表即可阅读这位用户的崩溃报告。
关于崩溃异常栈帧的解读
java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.DataInputStream.readFully(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at net.minecraft.nbt.NBTTagCompound.readKey(NBTTagCompound.java:487)
at net.minecraft.nbt.NBTTagCompound.read(NBTTagCompound.java:56)
at net.minecraft.nbt.NBTTagList.read(NBTTagList.java:63)
at net.minecraft.nbt.NBTTagCompound.readNBT(NBTTagCompound.java:497)
at net.minecraft.nbt.NBTTagCompound.read(NBTTagCompound.java:58)
at net.minecraft.nbt.NBTTagCompound.readNBT(NBTTagCompound.java:497)
at net.minecraft.nbt.NBTTagCompound.read(NBTTagCompound.java:58)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:133)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:88)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:83)
at net.minecraft.world.chunk.storage.AnvilChunkLoader.loadChunk__Async(AnvilChunkLoader.java:89)
at net.minecraftforge.common.chunkio.ChunkIOProvider.run(ChunkIOProvider.java:70)
at net.minecraftforge.common.chunkio.ChunkIOExecutor.syncChunkLoad(ChunkIOExecutor.java:92)
at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:118)
at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:89)
at net.minecraft.server.management.PlayerChunkMapEntry$1.run(PlayerChunkMapEntry.java:39)
at net.minecraftforge.common.chunkio.ChunkIOProvider.runCallbacks(ChunkIOProvider.java:134)
at net.minecraftforge.common.chunkio.ChunkIOProvider.syncCallback(ChunkIOProvider.java:96)
at net.minecraftforge.common.chunkio.ChunkIOExecutor.syncChunkLoad(ChunkIOExecutor.java:94)
at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:118)
at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:89)
at net.minecraft.server.management.PlayerChunkMapEntry$1.run(PlayerChunkMapEntry.java:39)
at net.minecraftforge.common.chunkio.ChunkIOProvider.runCallbacks(ChunkIOProvider.java:134)
at net.minecraftforge.common.chunkio.ChunkIOProvider.syncCallback(ChunkIOProvider.java:96)
at net.minecraftforge.common.chunkio.ChunkIOExecutor.tick(ChunkIOExecutor.java:150)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:728)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:668)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:252)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526)
at java.lang.Thread.run(Unknown Source)
给出的异常提示也就上面一行
机翻一下java.io.EOFException:ZLIB输入流的意外结束 
翻译一下
通俗一点讲,就好比你去看绵羊的女装,结果突然断网了,只加载出来上半部分,而这里Minecraft在保存压缩文件的时候突然断电,它的压缩文件只保存了一半,然后再加载的时候就会发现,这东西只能解压得了前半部分,那么公认的妥当处理方法就是退出来让玩家处理。
但是这里有一个很缺德的地方在于:他不说到底解压的是哪个文件,只说解压文件出了问题,于是我们继续看后面的调用栈帧
可以注意到有这么一段:
可以看到是AnvilChunkLoader(铁砧区块加载器)在loadChunk(加载区块)的时候出现了错误,联想一下,Minecraft的区块存储在区域文件里,后缀是.mca。所以先列举一下所有的.mca文件(我向他要了整个整合包,这里就不放出来了,只贴一下列举的结果)./DIM-1/region/r.-1.-1.mca
./DIM-1/region/r.-1.-2.mca
./DIM-1/region/r.-1.0.mca
./DIM-1/region/r.-2.-1.mca
./DIM-1/region/r.-2.-2.mca
./DIM-1/region/r.-2.0.mca
./DIM-1/region/r.0.-1.mca
./DIM-1/region/r.0.-2.mca
./DIM-1/region/r.0.0.mca
./DIM1/region/r.-1.-1.mca
./DIM1/region/r.-1.-2.mca
./DIM1/region/r.-1.-3.mca
./DIM1/region/r.-1.-4.mca
./DIM1/region/r.-1.0.mca
./DIM1/region/r.-2.-1.mca
./DIM1/region/r.-2.-3.mca
./DIM1/region/r.-2.-4.mca
./DIM1/region/r.-2.0.mca
./DIM1/region/r.-3.-2.mca
./DIM1/region/r.-3.-3.mca
./DIM1/region/r.-4.-2.mca
./DIM1/region/r.-4.-3.mca
./DIM1/region/r.0.-1.mca
./DIM1/region/r.0.-2.mca
./DIM1/region/r.0.-3.mca
./DIM1/region/r.0.-4.mca
./DIM1/region/r.0.0.mca
./DIM1/region/r.1.-1.mca
./DIM1/region/r.1.0.mca
./DIM7/region/r.-1.-1.mca
./DIM7/region/r.-1.-2.mca
./DIM7/region/r.-1.0.mca
./DIM7/region/r.-2.-1.mca
./DIM7/region/r.-2.-2.mca
./DIM7/region/r.-2.0.mca
./DIM7/region/r.0.-1.mca
./DIM7/region/r.0.-2.mca
./DIM7/region/r.0.0.mca
./DIM7/region/r.1.-1.mca
./region/r.-1.-1.mca
./region/r.-1.-2.mca
./region/r.-1.-3.mca
./region/r.-1.0.mca
./region/r.-1.1.mca
./region/r.-2.-1.mca
./region/r.-2.-2.mca
./region/r.-2.-3.mca
./region/r.-2.-4.mca
./region/r.-2.0.mca
./region/r.-2.1.mca
./region/r.-3.-1.mca
./region/r.-3.-2.mca
./region/r.-3.-3.mca
./region/r.-3.-4.mca
./region/r.-3.0.mca
./region/r.-3.1.mca
./region/r.-3.2.mca
./region/r.-4.-1.mca
./region/r.-4.-2.mca
./region/r.-4.-3.mca
./region/r.-4.-4.mca
./region/r.-4.0.mca
./region/r.-4.1.mca
./region/r.-4.2.mca
./region/r.-5.-2.mca
./region/r.-5.-3.mca
./region/r.-5.-4.mca
./region/r.-5.0.mca
./region/r.-5.1.mca
./region/r.-9.20.mca
./region/r.-9.21.mca
./region/r.-20.-20.mca
./region/r.-23.-26.mca
./region/r.-24.-26.mca
./region/r.0.-1.mca
./region/r.0.-2.mca
./region/r.0.-3.mca
./region/r.0.0.mca
./region/r.0.1.mca
./region/r.20.5.mca
./region/r.20.6.mca
./region/r.21.5.mca
./region/r.21.6.mca
./region/r.22.2.mca
./region/r.23.2.mca
./region/r.23.3.mca有点小多,但是我们知道理论上没有被加载的维度没有理由会加载区块甚至因为加载失败而造成崩溃,所以可以通过确定玩家目前所在的维度来缩小范围,用我很久之前写的一个程序把level.dat序列化成文本(nbtexplorer似乎不能在我的电脑上正常运行),可以找到这样一句话
这就是说,玩家目前在主世界(注:0 - 主世界,-1 - 下界,1 - 末地),主世界的区域文件直接存储在存档的region文件夹中,范围可以进一步缩小到./region/r.-1.-1.mca
./region/r.-1.-2.mca
./region/r.-1.-3.mca
./region/r.-1.0.mca
./region/r.-1.1.mca
./region/r.-2.-1.mca
./region/r.-2.-2.mca
./region/r.-2.-3.mca
./region/r.-2.-4.mca
./region/r.-2.0.mca
./region/r.-2.1.mca
./region/r.-3.-1.mca
./region/r.-3.-2.mca
./region/r.-3.-3.mca
./region/r.-3.-4.mca
./region/r.-3.0.mca
./region/r.-3.1.mca
./region/r.-3.2.mca
./region/r.-4.-1.mca
./region/r.-4.-2.mca
./region/r.-4.-3.mca
./region/r.-4.-4.mca
./region/r.-4.0.mca
./region/r.-4.1.mca
./region/r.-4.2.mca
./region/r.-5.-2.mca
./region/r.-5.-3.mca
./region/r.-5.-4.mca
./region/r.-5.0.mca
./region/r.-5.1.mca
./region/r.-9.20.mca
./region/r.-9.21.mca
./region/r.-20.-20.mca
./region/r.-23.-26.mca
./region/r.-24.-26.mca
./region/r.0.-1.mca
./region/r.0.-2.mca
./region/r.0.-3.mca
./region/r.0.0.mca
./region/r.0.1.mca
./region/r.20.5.mca
./region/r.20.6.mca
./region/r.21.5.mca
./region/r.21.6.mca
./region/r.22.2.mca
./region/r.23.2.mca
./region/r.23.3.mca
解释一下这里文件名的意思,“r.<rX>.<rZ>.mca”是区域坐标为(rX, rZ)的区域的存档文件,又知玩家进入游戏时只会加载玩家附近的区域和强制加载区块和出生点,这个存档我看过没有常加载区块,所以只是需要考虑玩家附近的区域和出生点。
于是乎再到level.dat里面找玩家位置和出生点坐标,玩家位置位于/Data/Player/Pos
然后出生点位置位于/Data/SpawnX、/Data/SpawnY和/Data/SpawnZ
根据已有知识区域坐标和实体坐标(X, Y, Z)的换算
[注:floor是一个函数,floor(x) = 不小于x的最大整数]
根据如上公式算出玩家区域坐标为(-8, 20),出生点区域坐标为(-1, 0),所以排查范围进一步缩小为
./region/r.0.-1.mca
./region/r.-9.20.mca
./region/r.-9.21.mca
接着备份之后挨个删除测试能不能进就完事。最后找出来是./region/r.-9.20.mca
再把备份解压一下,只删除./region/r.-9.20.mca而不删除其他文件,能进,NICE!
这样我们就实现数据丢失较少的存档抢救
一般化的存档损坏的判断
Minecraft:Java Edition存档的目录结构
Minecraft:Java Edition 1.12和Minecraft:Java Edition1.16的目录结构有所不同,在中间的版本介于这两这种目录结构之间,没有太多花样,下面以这两个版本为例讲一下Minecraft存档的目录结构
如果你的Minecraft安装了Mod,那你可能就要自己看看有哪些结构有什么改变了,将损坏的文件备份并删除或者从备份中恢复损坏的文件,很多时候可以进入存档(代价是某些内容会丢失)
Minecraft: Java Edition 1.16
下面这里看到的是一个简单的Minecraft: Java Edition 1.16.x的存档的文件列表,请注意,这个结构不适用于插件服务器,Bukkit对这个结构魔改过
.
./advancements
./advancements/5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.json
./data./advancements
./data/idcounts.dat
./data/map_0.dat
./data/map_1.dat
./data/map_2.dat
./data/map_3.dat
./data/map_4.dat
./data/raids.dat
./datapacks
./DIM-1
./DIM-1/data
./DIM-1/data/raids.dat
./DIM-1/poi
./DIM-1/poi/r.-1.-1.mca
./DIM-1/poi/r.-1.0.mca
./DIM-1/poi/r.0.-1.mca
./DIM-1/poi/r.1.0.mca
./DIM-1/poi/r.0.0.mca
./DIM-1/region
./DIM-1/region/r.-1.-1.mca
./DIM-1/region/r.-1.0.mca
./DIM-1/region/r.0.-1.mca
./DIM-1/region/r.0.0.mca
./DIM-1/region/r.1.0.mca
./DIM1
./DIM1/data
./DIM1/data/raids_end.dat
./playerdata
./playerdata/5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.dat
./playerdata/5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.dat_old
./poi
./poi/r.-1.-1.mca
./poi/r.0.-1.mca
./poi/r.0.-2.mca
./poi/r.2.-2.mca
./poi/r.3.-2.mca
./poi/r.-1.0.mca
./poi/r.-2.0.mca
./poi/r.-3.0.mca
./poi/r.0.0.mca
./poi/r.0.1.mca
./poi/r.1.-1.mca
./poi/r.1.-2.mca
./poi/r.1.0.mca
./poi/r.1.1.mca
./poi/r.2.-1.mca
./poi/r.2.0.mca
./poi/r.2.1.mca
./poi/r.3.-1.mca
./region
./region/r.-1.-1.mca
./region/r.-1.0.mca
./region/r.-1.1.mca
./region/r.-2.-1.mca
./region/r.-2.0.mca
./region/r.-2.1.mca
./region/r.-3.-1.mca
./region/r.-3.0.mca
./region/r.-3.1.mca
./region/r.-4.0.mca
./region/r.-4.1.mca
./region/r.0.-1.mca
./region/r.0.-2.mca
./region/r.0.-3.mca
./region/r.0.0.mca
./region/r.0.1.mca
./region/r.1.-1.mca
./region/r.1.-2.mca
./region/r.1.-3.mca
./region/r.1.0.mca
./region/r.1.1.mca
./region/r.2.-1.mca
./region/r.2.-2.mca
./region/r.2.-3.mca
./region/r.2.0.mca
./region/r.2.1.mca
./region/r.3.-1.mca
./region/r.3.-2.mca
./region/r.3.0.mca
./stats
./stats/5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.json
./icon.png
./level.dat
./level.dat_old
./session.lock
advancements/<UUID>.json
这些文件存放玩家的进度达成情况,你可以注意到有个5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.json文件,其中5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f是我的UUID,当中的内容是以JSON格式存放玩家5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f的进度达成情况(玩家的UUID我想不需要解释吧)
data/idcounts.dat
这个文件只保存一个数字:世界上有多少地图(物品)
data/map_<Numberic Map ID>.dat
这些文件存储每个地图的中心位置坐标、维度和地图上每个像素点的颜色,放大倍率,以及地图上记录的旗帜。通过制图台复制的地图会在被不同玩家编辑其中任意一张时其他地图同步修改,这就是地图需要单独建文件的原因(不然根本不知道剩下几张地图在谁手里、哪个区块),格式为NBT
data/raids.dat
这个记录世界上所有袭击的信息以及世界上总共打了几场袭击,格式为NBT。
datapacks
数据包存放目录,一般不会损坏,因为Minecraft在运行过程中对这个文件夹只读不写,不展开讲。
playerdata/<UUID>.dat
字面意思,存放玩家的有关信息,不过请注意客户端中单人游戏/局域网联机的服主的玩家信息是存贮在level.dat中的,格式为NBT。它有个备份在文件名的后面加了个_old,Minecraft每次写入新的<UUID>.dat文件之前都会把旧的<UUID>.dat重命名为<UUID>.dat_old,如果你认为这个文件损坏了,可以试试重命名这个文件然后用对应的_old文件覆盖它。
poi/r.<rX>.<rZ>.mca
这里的poi是指PointOfInterest,通俗地讲就是有些生物会和某些方块建立联系(例如村民与职业方块、村民与床等等),而这些文件记载了主世界中这些方块的信息,格式为铁砧区域格式。
region/r.<rX>.<rZ>.mca
这个上面那个案例讲过了,是主世界的区块保存的地方(例如各种方块与实体),格式为铁砧区域格式。
DIM1、DIM-1、和所有有poi、data、region子文件夹的文件夹
这些文件夹中的poi、data、region三个子文件夹和存档根目录下的poi、data、region三个文件夹的结构相似,但存储的数据不是主世界而是对应其他维度的,文件夹名的规律为minecraft:the_end使用DIM1作为文件夹名,minecraft:nether使用DIM-1作为文件夹名,剩余的维度使用其ID作为文件夹名。
stats/<UUID>.json
这个文件记录了玩家的统计信息,格式为JSON格式。
forcedchunks.dat
这个文件记录了玩家的设置的常加载区块,格式为解压缩的NBT。
icon.png
世界的图标,一般这个文件损坏无大碍。
generated
据我所知这个文件夹好像只用来存放在游戏中使用结构方块保存的结构。generated/<命名空间>/structures/<路径>.nbt是以解压缩的nbt格式存储<命名空间>:<路径>这个结构。
level.dat
这个文件是决定你的世界能不能出现在世界菜单上的重要文件,如果你的存档从存档列表中消失了,跟这个文件损坏多半有关系。它记载一些有关存档的重要全局信息,例如:世界种子、世界出生点、世界名称、游戏规则、服主信息等等,甚至还有注册表信息(对于Forge/Fabric等)。它和playerdata下的各个文件一样,这里面的数据基本生都是重要数据,Minecraft会在保存之前把旧的level.dat备份到level.dat_old,如果你觉得level.dat损坏了,可以尝试把level.dat_old恢复到level.dat。有用的数据很多,比如上文提到的玩家坐标、维度,出生点坐标、维度等等。
lsession.lock
这个文件里并没有什么信息。
Minecraft: Java Edition 1.12
1.12的目录结构和1.16的大同小异,区别在于,1.12没有datapacks文件夹(因为不支持数据包),会将一些结构的信息写入data/<结构名称>.dat中(在新版中,这些东西跟随区块保存了),没有poi文件夹(Minecraft1.12没有PointOfInterest这个游戏机制),自定义维度(仅能通过Mod实现)的存储路径从维度ID变成“DIM<维度数字ID>”例如暮色的存档位置可能是DIM7(和配置有关),此外一些在高版本中由数据包实现的内容在1.12中在data文件夹中保存(例如函数被放到了data/functions)。(说实话我具体的也并不是很清楚,因为不怎么玩1.12.x,剩下的具体碰到的时候再说吧 )
 )
关于诊断
存档不识别怀疑level.dat损坏
如果你好几个存档都进不去,那多半不是存档损坏造成的,更建议去找找Mod的问题
有的时候进不去存档不一定是存档损坏,如果是卡半天进不去可能是由于网络原因,这时候我建议你去试试断开网络之后能不能打开存档,能打开的话说明上面的内容全白看了 ,你这个不是存档损坏,单纯的是连接到mojang超时了
 ,你这个不是存档损坏,单纯的是连接到mojang超时了 ,而有的时候你可以在forge.cfg中将removeErroringEntity和removeErroringTileEntity设为true试试能不能进入游戏,可能只是你周围的某个实体卡了BUG导致你进不去游戏,启用这个选项会将出错的方块和方块实体删除。
,而有的时候你可以在forge.cfg中将removeErroringEntity和removeErroringTileEntity设为true试试能不能进入游戏,可能只是你周围的某个实体卡了BUG导致你进不去游戏,启用这个选项会将出错的方块和方块实体删除。 
关于如何阅读崩溃报告可以参考https://www.mcbbs.net/thread-860103-1-1.html,不过蝙蝠这篇文章没有讲到的一点,如果你的报告的栈帧是混淆的(例如有很多诸如dcb、sqk、class_2407、class_1023、method_19375、method_40223、func_45353_k、func_2971_b这样的无意义内容),你需要对照混淆映射表阅读报告,Minecraft混淆映射表的使用方法建议去问度娘
如果你的报告中有出现java.io.EOFException这样的字眼,基本上可以确定是和存档损坏有关(有时是数据包/材质包的锅),从栈帧上可以大致确定是在加载什么内容时崩溃(比如上面那位其实就有AnvilChunkLoader.loadChunk这样的字眼提示),再通过一些Minecraft知识可以缩小范围,剩下基本二分法能解决
最重要的,不要让你的电脑过热保护断电(对电脑是一种伤害,也威胁你的其他数据安全)
以及多备份Minecraft存档
水怪席
@⚡️👮 @🥶❄️☠️ @bleake @伟大的小安 @诡灬稽 @enderman_JC @🐦💕🌸🌸 @RarityEG @800805 @水怪诗人 @小孩孩 @小灬望 @北极仙光 @离 @🌱⛄🐏 @Arrosin @板砖w @Ender56 @immangguo @Flavor_xy
以下内容需要积分高于 10 才可浏览
前言
最近几天有一名用户私信找我说他的电脑过热自动关机导致存档损坏了,我帮他解决之后,他便问我怎么看出来的。因为整个过程比较难解释,所以打算发一篇主题帖来解释。询问绵羊之后,他说可以发在茶馆。于是有了这篇帖子。
先来说说这位用户的症状
一些例行分析
帖子他在https://www.mcbbs.net/thread-1190437-1-1.html也发了
首先看到SystemDetails
Minecraft Version: 1.12.2
Is Modded: Definitely; Client brand changed to 'fml,forge'
可以看出这位用户的版本是1.12.2 Forge,但是由于安装了VanillaFix,所以他的崩溃栈帧全部是反混淆状态,故我们不需要准备Forge 1.12.2的混淆映射表即可阅读这位用户的崩溃报告。
关于崩溃异常栈帧的解读
给出的异常提示也就上面一行
java.io.EOFException: Unexpected end of ZLIB input stream
java.io.EOFException:ZLIB输入流的意外结束
翻译一下
java.io.EOFException: 预料之外的ZLIB文件结尾
通俗一点讲,就好比你去看绵羊的女装,结果突然断网了,只加载出来上半部分,而这里Minecraft在保存压缩文件的时候突然断电,它的压缩文件只保存了一半,然后再加载的时候就会发现,这东西只能解压得了前半部分,那么公认的妥当处理方法就是退出来让玩家处理。
但是这里有一个很缺德的地方在于:他不说到底解压的是哪个文件,只说解压文件出了问题,于是我们继续看后面的调用栈帧
可以注意到有这么一段:
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:133)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:88)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:83)
at net.minecraft.world.chunk.storage.AnvilChunkLoader.loadChunk__Async(AnvilChunkLoader.java:89)
可以看到是AnvilChunkLoader(铁砧区块加载器)在loadChunk(加载区块)的时候出现了错误,联想一下,Minecraft的区块存储在区域文件里,后缀是.mca。所以先列举一下所有的.mca文件(我向他要了整个整合包,这里就不放出来了,只贴一下列举的结果)
有点小多,但是我们知道理论上没有被加载的维度没有理由会加载区块甚至因为加载失败而造成崩溃,所以可以通过确定玩家目前所在的维度来缩小范围,用我很久之前写的一个程序把level.dat序列化成文本(nbtexplorer似乎不能在我的电脑上正常运行),可以找到这样一句话
Dimension: 0,
这就是说,玩家目前在主世界(注:0 - 主世界,-1 - 下界,1 - 末地),主世界的区域文件直接存储在存档的region文件夹中,范围可以进一步缩小到
解释一下这里文件名的意思,“r.<rX>.<rZ>.mca”是区域坐标为(rX, rZ)的区域的存档文件,又知玩家进入游戏时只会加载玩家附近的区域和强制加载区块和出生点,这个存档我看过没有常加载区块,所以只是需要考虑玩家附近的区域和出生点。
于是乎再到level.dat里面找玩家位置和出生点坐标,玩家位置位于/Data/Player/Pos
Pos: [-3983.784817326783d, 104.64643967339671d, 10600.191288437396d],
然后出生点位置位于/Data/SpawnX、/Data/SpawnY和/Data/SpawnZ
SpawnX: -240,
SpawnZ: 208,
根据已有知识区域坐标和实体坐标(X, Y, Z)的换算
rX = floor(X / 512.0)
rY = floor(Y / 512.0)
[注:floor是一个函数,floor(x) = 不小于x的最大整数]
根据如上公式算出玩家区域坐标为(-8, 20),出生点区域坐标为(-1, 0),所以排查范围进一步缩小为
接着备份之后挨个删除测试能不能进就完事。最后找出来是./region/r.-9.20.mca
再把备份解压一下,只删除./region/r.-9.20.mca而不删除其他文件,能进,NICE!
这样我们就实现数据丢失较少的存档抢救
一般化的存档损坏的判断
Minecraft:Java Edition存档的目录结构
Minecraft:Java Edition 1.12和Minecraft:Java Edition1.16的目录结构有所不同,在中间的版本介于这两这种目录结构之间,没有太多花样,下面以这两个版本为例讲一下Minecraft存档的目录结构
如果你的Minecraft安装了Mod,那你可能就要自己看看有哪些结构有什么改变了,将损坏的文件备份并删除或者从备份中恢复损坏的文件,很多时候可以进入存档(代价是某些内容会丢失)
Minecraft: Java Edition 1.16
下面这里看到的是一个简单的Minecraft: Java Edition 1.16.x的存档的文件列表,请注意,这个结构不适用于插件服务器,Bukkit对这个结构魔改过
advancements/<UUID>.json
这些文件存放玩家的进度达成情况,你可以注意到有个5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.json文件,其中5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f是我的UUID,当中的内容是以JSON格式存放玩家5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f的进度达成情况(玩家的UUID我想不需要解释吧)
data/idcounts.dat
这个文件只保存一个数字:世界上有多少地图(物品)
data/map_<Numberic Map ID>.dat
这些文件存储每个地图的中心位置坐标、维度和地图上每个像素点的颜色,放大倍率,以及地图上记录的旗帜。通过制图台复制的地图会在被不同玩家编辑其中任意一张时其他地图同步修改,这就是地图需要单独建文件的原因(不然根本不知道剩下几张地图在谁手里、哪个区块),格式为NBT
data/raids.dat
这个记录世界上所有袭击的信息以及世界上总共打了几场袭击,格式为NBT。
datapacks
数据包存放目录,一般不会损坏,因为Minecraft在运行过程中对这个文件夹只读不写,不展开讲。
playerdata/<UUID>.dat
字面意思,存放玩家的有关信息,不过请注意客户端中单人游戏/局域网联机的服主的玩家信息是存贮在level.dat中的,格式为NBT。它有个备份在文件名的后面加了个_old,Minecraft每次写入新的<UUID>.dat文件之前都会把旧的<UUID>.dat重命名为<UUID>.dat_old,如果你认为这个文件损坏了,可以试试重命名这个文件然后用对应的_old文件覆盖它。
poi/r.<rX>.<rZ>.mca
这里的poi是指PointOfInterest,通俗地讲就是有些生物会和某些方块建立联系(例如村民与职业方块、村民与床等等),而这些文件记载了主世界中这些方块的信息,格式为铁砧区域格式。
region/r.<rX>.<rZ>.mca
这个上面那个案例讲过了,是主世界的区块保存的地方(例如各种方块与实体),格式为铁砧区域格式。
DIM1、DIM-1、和所有有poi、data、region子文件夹的文件夹
这些文件夹中的poi、data、region三个子文件夹和存档根目录下的poi、data、region三个文件夹的结构相似,但存储的数据不是主世界而是对应其他维度的,文件夹名的规律为minecraft:the_end使用DIM1作为文件夹名,minecraft:nether使用DIM-1作为文件夹名,剩余的维度使用其ID作为文件夹名。
stats/<UUID>.json
这个文件记录了玩家的统计信息,格式为JSON格式。
forcedchunks.dat
这个文件记录了玩家的设置的常加载区块,格式为解压缩的NBT。
icon.png
世界的图标,一般这个文件损坏无大碍。
generated
据我所知这个文件夹好像只用来存放在游戏中使用结构方块保存的结构。generated/<命名空间>/structures/<路径>.nbt是以解压缩的nbt格式存储<命名空间>:<路径>这个结构。
level.dat
这个文件是决定你的世界能不能出现在世界菜单上的重要文件,如果你的存档从存档列表中消失了,跟这个文件损坏多半有关系。它记载一些有关存档的重要全局信息,例如:世界种子、世界出生点、世界名称、游戏规则、服主信息等等,甚至还有注册表信息(对于Forge/Fabric等)。它和playerdata下的各个文件一样,这里面的数据基本生都是重要数据,Minecraft会在保存之前把旧的level.dat备份到level.dat_old,如果你觉得level.dat损坏了,可以尝试把level.dat_old恢复到level.dat。有用的数据很多,比如上文提到的玩家坐标、维度,出生点坐标、维度等等。
lsession.lock
这个文件里并没有什么信息。
Minecraft: Java Edition 1.12
1.12的目录结构和1.16的大同小异,区别在于,1.12没有datapacks文件夹(因为不支持数据包),会将一些结构的信息写入data/<结构名称>.dat中(在新版中,这些东西跟随区块保存了),没有poi文件夹(Minecraft1.12没有PointOfInterest这个游戏机制),自定义维度(仅能通过Mod实现)的存储路径从维度ID变成“DIM<维度数字ID>”例如暮色的存档位置可能是DIM7(和配置有关),此外一些在高版本中由数据包实现的内容在1.12中在data文件夹中保存(例如函数被放到了data/functions)。(说实话我具体的也并不是很清楚,因为不怎么玩1.12.x,剩下的具体碰到的时候再说吧
关于诊断
存档不识别怀疑level.dat损坏
如果你好几个存档都进不去,那多半不是存档损坏造成的,更建议去找找Mod的问题
有的时候进不去存档不一定是存档损坏,如果是卡半天进不去可能是由于网络原因,这时候我建议你去试试断开网络之后能不能打开存档,能打开的话说明上面的内容全白看了
关于如何阅读崩溃报告可以参考https://www.mcbbs.net/thread-860103-1-1.html,不过蝙蝠这篇文章没有讲到的一点,如果你的报告的栈帧是混淆的(例如有很多诸如dcb、sqk、class_2407、class_1023、method_19375、method_40223、func_45353_k、func_2971_b这样的无意义内容),你需要对照混淆映射表阅读报告,Minecraft混淆映射表的使用方法建议去问度娘
如果你的报告中有出现java.io.EOFException这样的字眼,基本上可以确定是和存档损坏有关(有时是数据包/材质包的锅),从栈帧上可以大致确定是在加载什么内容时崩溃(比如上面那位其实就有AnvilChunkLoader.loadChunk这样的字眼提示),再通过一些Minecraft知识可以缩小范围,剩下基本二分法能解决
最重要的,不要让你的电脑过热保护断电(对电脑是一种伤害,也威胁你的其他数据安全)
以及多备份Minecraft存档
水怪席
@⚡️👮 @🥶❄️☠️ @bleake @伟大的小安 @诡灬稽 @enderman_JC @🐦💕🌸🌸 @RarityEG @800805 @水怪诗人 @小孩孩 @小灬望 @北极仙光 @离 @🌱⛄🐏 @Arrosin @板砖w @Ender56 @immangguo @Flavor_xy
来自群组: 后花园
2021.12 数据,可能有更多内容
以下内容需要积分高于 10 才可浏览
前言
最近几天有一名用户私信找我说他的电脑过热自动关机导致存档损坏了,我帮他解决之后,他便问我怎么看出来的。因为整个过程比较难解释,所以打算发一篇主题帖来解释。询问绵羊之后,他说可以发在茶馆。于是有了这篇帖子。



先来说说这位用户的症状
一些例行分析
帖子他在https://www.mcbbs.net/thread-1190437-1-1.html也发了
首先看到SystemDetails
Minecraft Version: 1.12.2
Is Modded: Definitely; Client brand changed to 'fml,forge'
可以看出这位用户的版本是1.12.2 Forge,但是由于安装了VanillaFix,所以他的崩溃栈帧全部是反混淆状态,故我们不需要准备Forge 1.12.2的混淆映射表即可阅读这位用户的崩溃报告。
关于崩溃异常栈帧的解读
java.io.EOFException: Unexpected end of ZLIB input stream
at java.util.zip.InflaterInputStream.fill(Unknown Source)
at java.util.zip.InflaterInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.DataInputStream.readFully(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at net.minecraft.nbt.NBTTagCompound.readKey(NBTTagCompound.java:487)
at net.minecraft.nbt.NBTTagCompound.read(NBTTagCompound.java:56)
at net.minecraft.nbt.NBTTagList.read(NBTTagList.java:63)
at net.minecraft.nbt.NBTTagCompound.readNBT(NBTTagCompound.java:497)
at net.minecraft.nbt.NBTTagCompound.read(NBTTagCompound.java:58)
at net.minecraft.nbt.NBTTagCompound.readNBT(NBTTagCompound.java:497)
at net.minecraft.nbt.NBTTagCompound.read(NBTTagCompound.java:58)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:133)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:88)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:83)
at net.minecraft.world.chunk.storage.AnvilChunkLoader.loadChunk__Async(AnvilChunkLoader.java:89)
at net.minecraftforge.common.chunkio.ChunkIOProvider.run(ChunkIOProvider.java:70)
at net.minecraftforge.common.chunkio.ChunkIOExecutor.syncChunkLoad(ChunkIOExecutor.java:92)
at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:118)
at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:89)
at net.minecraft.server.management.PlayerChunkMapEntry$1.run(PlayerChunkMapEntry.java:39)
at net.minecraftforge.common.chunkio.ChunkIOProvider.runCallbacks(ChunkIOProvider.java:134)
at net.minecraftforge.common.chunkio.ChunkIOProvider.syncCallback(ChunkIOProvider.java:96)
at net.minecraftforge.common.chunkio.ChunkIOExecutor.syncChunkLoad(ChunkIOExecutor.java:94)
at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:118)
at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:89)
at net.minecraft.server.management.PlayerChunkMapEntry$1.run(PlayerChunkMapEntry.java:39)
at net.minecraftforge.common.chunkio.ChunkIOProvider.runCallbacks(ChunkIOProvider.java:134)
at net.minecraftforge.common.chunkio.ChunkIOProvider.syncCallback(ChunkIOProvider.java:96)
at net.minecraftforge.common.chunkio.ChunkIOExecutor.tick(ChunkIOExecutor.java:150)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:728)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:668)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:252)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526)
at java.lang.Thread.run(Unknown Source)
给出的异常提示也就上面一行
java.io.EOFException: Unexpected end of ZLIB input stream
翻译一下
java.io.EOFException: 预料之外的ZLIB文件结尾
通俗一点讲,就好比你去看绵羊的女装,结果突然断网了,只加载出来上半部分,而这里Minecraft在保存压缩文件的时候突然断电,它的压缩文件只保存了一半,然后再加载的时候就会发现,这东西只能解压得了前半部分,那么公认的妥当处理方法就是退出来让玩家处理。
但是这里有一个很缺德的地方在于:他不说到底解压的是哪个文件,只说解压文件出了问题,于是我们继续看后面的调用栈帧
可以注意到有这么一段:
    at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:133)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:88)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:83)
at net.minecraft.world.chunk.storage.AnvilChunkLoader.loadChunk__Async(AnvilChunkLoader.java:89)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:88)
at net.minecraft.nbt.CompressedStreamTools.read(CompressedStreamTools.java:83)
at net.minecraft.world.chunk.storage.AnvilChunkLoader.loadChunk__Async(AnvilChunkLoader.java:89)
可以看到是AnvilChunkLoader(铁砧区块加载器)在loadChunk(加载区块)的时候出现了错误,联想一下,Minecraft的区块存储在区域文件里,后缀是.mca。所以先列举一下所有的.mca文件(我向他要了整个整合包,这里就不放出来了,只贴一下列举的结果)./DIM-1/region/r.-1.-1.mca
./DIM-1/region/r.-1.-2.mca
./DIM-1/region/r.-1.0.mca
./DIM-1/region/r.-2.-1.mca
./DIM-1/region/r.-2.-2.mca
./DIM-1/region/r.-2.0.mca
./DIM-1/region/r.0.-1.mca
./DIM-1/region/r.0.-2.mca
./DIM-1/region/r.0.0.mca
./DIM1/region/r.-1.-1.mca
./DIM1/region/r.-1.-2.mca
./DIM1/region/r.-1.-3.mca
./DIM1/region/r.-1.-4.mca
./DIM1/region/r.-1.0.mca
./DIM1/region/r.-2.-1.mca
./DIM1/region/r.-2.-3.mca
./DIM1/region/r.-2.-4.mca
./DIM1/region/r.-2.0.mca
./DIM1/region/r.-3.-2.mca
./DIM1/region/r.-3.-3.mca
./DIM1/region/r.-4.-2.mca
./DIM1/region/r.-4.-3.mca
./DIM1/region/r.0.-1.mca
./DIM1/region/r.0.-2.mca
./DIM1/region/r.0.-3.mca
./DIM1/region/r.0.-4.mca
./DIM1/region/r.0.0.mca
./DIM1/region/r.1.-1.mca
./DIM1/region/r.1.0.mca
./DIM7/region/r.-1.-1.mca
./DIM7/region/r.-1.-2.mca
./DIM7/region/r.-1.0.mca
./DIM7/region/r.-2.-1.mca
./DIM7/region/r.-2.-2.mca
./DIM7/region/r.-2.0.mca
./DIM7/region/r.0.-1.mca
./DIM7/region/r.0.-2.mca
./DIM7/region/r.0.0.mca
./DIM7/region/r.1.-1.mca
./region/r.-1.-1.mca
./region/r.-1.-2.mca
./region/r.-1.-3.mca
./region/r.-1.0.mca
./region/r.-1.1.mca
./region/r.-2.-1.mca
./region/r.-2.-2.mca
./region/r.-2.-3.mca
./region/r.-2.-4.mca
./region/r.-2.0.mca
./region/r.-2.1.mca
./region/r.-3.-1.mca
./region/r.-3.-2.mca
./region/r.-3.-3.mca
./region/r.-3.-4.mca
./region/r.-3.0.mca
./region/r.-3.1.mca
./region/r.-3.2.mca
./region/r.-4.-1.mca
./region/r.-4.-2.mca
./region/r.-4.-3.mca
./region/r.-4.-4.mca
./region/r.-4.0.mca
./region/r.-4.1.mca
./region/r.-4.2.mca
./region/r.-5.-2.mca
./region/r.-5.-3.mca
./region/r.-5.-4.mca
./region/r.-5.0.mca
./region/r.-5.1.mca
./region/r.-9.20.mca
./region/r.-9.21.mca
./region/r.-20.-20.mca
./region/r.-23.-26.mca
./region/r.-24.-26.mca
./region/r.0.-1.mca
./region/r.0.-2.mca
./region/r.0.-3.mca
./region/r.0.0.mca
./region/r.0.1.mca
./region/r.20.5.mca
./region/r.20.6.mca
./region/r.21.5.mca
./region/r.21.6.mca
./region/r.22.2.mca
./region/r.23.2.mca
./region/r.23.3.mca有点小多,但是我们知道理论上没有被加载的维度没有理由会加载区块甚至因为加载失败而造成崩溃,所以可以通过确定玩家目前所在的维度来缩小范围,用我很久之前写的一个程序把level.dat序列化成文本(nbtexplorer似乎不能在我的电脑上正常运行),可以找到这样一句话
          Dimension: 0, 
这就是说,玩家目前在主世界(注:0 - 主世界,-1 - 下界,1 - 末地),主世界的区域文件直接存储在存档的region文件夹中,范围可以进一步缩小到./region/r.-1.-1.mca
./region/r.-1.-2.mca
./region/r.-1.-3.mca
./region/r.-1.0.mca
./region/r.-1.1.mca
./region/r.-2.-1.mca
./region/r.-2.-2.mca
./region/r.-2.-3.mca
./region/r.-2.-4.mca
./region/r.-2.0.mca
./region/r.-2.1.mca
./region/r.-3.-1.mca
./region/r.-3.-2.mca
./region/r.-3.-3.mca
./region/r.-3.-4.mca
./region/r.-3.0.mca
./region/r.-3.1.mca
./region/r.-3.2.mca
./region/r.-4.-1.mca
./region/r.-4.-2.mca
./region/r.-4.-3.mca
./region/r.-4.-4.mca
./region/r.-4.0.mca
./region/r.-4.1.mca
./region/r.-4.2.mca
./region/r.-5.-2.mca
./region/r.-5.-3.mca
./region/r.-5.-4.mca
./region/r.-5.0.mca
./region/r.-5.1.mca
./region/r.-9.20.mca
./region/r.-9.21.mca
./region/r.-20.-20.mca
./region/r.-23.-26.mca
./region/r.-24.-26.mca
./region/r.0.-1.mca
./region/r.0.-2.mca
./region/r.0.-3.mca
./region/r.0.0.mca
./region/r.0.1.mca
./region/r.20.5.mca
./region/r.20.6.mca
./region/r.21.5.mca
./region/r.21.6.mca
./region/r.22.2.mca
./region/r.23.2.mca
./region/r.23.3.mca
解释一下这里文件名的意思,“r.<rX>.<rZ>.mca”是区域坐标为(rX, rZ)的区域的存档文件,又知玩家进入游戏时只会加载玩家附近的区域和强制加载区块和出生点,这个存档我看过没有常加载区块,所以只是需要考虑玩家附近的区域和出生点。
于是乎再到level.dat里面找玩家位置和出生点坐标,玩家位置位于/Data/Player/Pos
          Pos: [-3983.784817326783d, 104.64643967339671d, 10600.191288437396d], 
然后出生点位置位于/Data/SpawnX、/Data/SpawnY和/Data/SpawnZ
        SpawnX: -240, 
SpawnZ: 208,
SpawnZ: 208,
根据已有知识区域坐标和实体坐标(X, Y, Z)的换算
rX = floor(X / 512.0)
rY = floor(Y / 512.0)
rY = floor(Y / 512.0)
[注:floor是一个函数,floor(x) = 不小于x的最大整数]
根据如上公式算出玩家区域坐标为(-8, 20),出生点区域坐标为(-1, 0),所以排查范围进一步缩小为
./region/r.0.-1.mca
./region/r.-9.20.mca
./region/r.-9.21.mca
接着备份之后挨个删除测试能不能进就完事。最后找出来是./region/r.-9.20.mca
再把备份解压一下,只删除./region/r.-9.20.mca而不删除其他文件,能进,NICE!
这样我们就实现数据丢失较少的存档抢救
一般化的存档损坏的判断
Minecraft:Java Edition存档的目录结构
Minecraft:Java Edition 1.12和Minecraft:Java Edition1.16的目录结构有所不同,在中间的版本介于这两这种目录结构之间,没有太多花样,下面以这两个版本为例讲一下Minecraft存档的目录结构
如果你的Minecraft安装了Mod,那你可能就要自己看看有哪些结构有什么改变了,将损坏的文件备份并删除或者从备份中恢复损坏的文件,很多时候可以进入存档(代价是某些内容会丢失)
Minecraft: Java Edition 1.16
下面这里看到的是一个简单的Minecraft: Java Edition 1.16.x的存档的文件列表,请注意,这个结构不适用于插件服务器,Bukkit对这个结构魔改过
.
./advancements
./advancements/5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.json
./data./advancements
./data/idcounts.dat
./data/map_0.dat
./data/map_1.dat
./data/map_2.dat
./data/map_3.dat
./data/map_4.dat
./data/raids.dat
./datapacks
./DIM-1
./DIM-1/data
./DIM-1/data/raids.dat
./DIM-1/poi
./DIM-1/poi/r.-1.-1.mca
./DIM-1/poi/r.-1.0.mca
./DIM-1/poi/r.0.-1.mca
./DIM-1/poi/r.1.0.mca
./DIM-1/poi/r.0.0.mca
./DIM-1/region
./DIM-1/region/r.-1.-1.mca
./DIM-1/region/r.-1.0.mca
./DIM-1/region/r.0.-1.mca
./DIM-1/region/r.0.0.mca
./DIM-1/region/r.1.0.mca
./DIM1
./DIM1/data
./DIM1/data/raids_end.dat
./playerdata
./playerdata/5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.dat
./playerdata/5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.dat_old
./poi
./poi/r.-1.-1.mca
./poi/r.0.-1.mca
./poi/r.0.-2.mca
./poi/r.2.-2.mca
./poi/r.3.-2.mca
./poi/r.-1.0.mca
./poi/r.-2.0.mca
./poi/r.-3.0.mca
./poi/r.0.0.mca
./poi/r.0.1.mca
./poi/r.1.-1.mca
./poi/r.1.-2.mca
./poi/r.1.0.mca
./poi/r.1.1.mca
./poi/r.2.-1.mca
./poi/r.2.0.mca
./poi/r.2.1.mca
./poi/r.3.-1.mca
./region
./region/r.-1.-1.mca
./region/r.-1.0.mca
./region/r.-1.1.mca
./region/r.-2.-1.mca
./region/r.-2.0.mca
./region/r.-2.1.mca
./region/r.-3.-1.mca
./region/r.-3.0.mca
./region/r.-3.1.mca
./region/r.-4.0.mca
./region/r.-4.1.mca
./region/r.0.-1.mca
./region/r.0.-2.mca
./region/r.0.-3.mca
./region/r.0.0.mca
./region/r.0.1.mca
./region/r.1.-1.mca
./region/r.1.-2.mca
./region/r.1.-3.mca
./region/r.1.0.mca
./region/r.1.1.mca
./region/r.2.-1.mca
./region/r.2.-2.mca
./region/r.2.-3.mca
./region/r.2.0.mca
./region/r.2.1.mca
./region/r.3.-1.mca
./region/r.3.-2.mca
./region/r.3.0.mca
./stats
./stats/5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.json
./icon.png
./level.dat
./level.dat_old
./session.lock
advancements/<UUID>.json
这些文件存放玩家的进度达成情况,你可以注意到有个5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f.json文件,其中5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f是我的UUID,当中的内容是以JSON格式存放玩家5899cf57-0d2c-3fc1-952a-ffbfa0c0f56f的进度达成情况(玩家的UUID我想不需要解释吧)
data/idcounts.dat
这个文件只保存一个数字:世界上有多少地图(物品)
data/map_<Numberic Map ID>.dat
这些文件存储每个地图的中心位置坐标、维度和地图上每个像素点的颜色,放大倍率,以及地图上记录的旗帜。通过制图台复制的地图会在被不同玩家编辑其中任意一张时其他地图同步修改,这就是地图需要单独建文件的原因(不然根本不知道剩下几张地图在谁手里、哪个区块),格式为NBT
data/raids.dat
这个记录世界上所有袭击的信息以及世界上总共打了几场袭击,格式为NBT。
datapacks
数据包存放目录,一般不会损坏,因为Minecraft在运行过程中对这个文件夹只读不写,不展开讲。
playerdata/<UUID>.dat
字面意思,存放玩家的有关信息,不过请注意客户端中单人游戏/局域网联机的服主的玩家信息是存贮在level.dat中的,格式为NBT。它有个备份在文件名的后面加了个_old,Minecraft每次写入新的<UUID>.dat文件之前都会把旧的<UUID>.dat重命名为<UUID>.dat_old,如果你认为这个文件损坏了,可以试试重命名这个文件然后用对应的_old文件覆盖它。
poi/r.<rX>.<rZ>.mca
这里的poi是指PointOfInterest,通俗地讲就是有些生物会和某些方块建立联系(例如村民与职业方块、村民与床等等),而这些文件记载了主世界中这些方块的信息,格式为铁砧区域格式。
region/r.<rX>.<rZ>.mca
这个上面那个案例讲过了,是主世界的区块保存的地方(例如各种方块与实体),格式为铁砧区域格式。
DIM1、DIM-1、和所有有poi、data、region子文件夹的文件夹
这些文件夹中的poi、data、region三个子文件夹和存档根目录下的poi、data、region三个文件夹的结构相似,但存储的数据不是主世界而是对应其他维度的,文件夹名的规律为minecraft:the_end使用DIM1作为文件夹名,minecraft:nether使用DIM-1作为文件夹名,剩余的维度使用其ID作为文件夹名。
stats/<UUID>.json
这个文件记录了玩家的统计信息,格式为JSON格式。
forcedchunks.dat
这个文件记录了玩家的设置的常加载区块,格式为解压缩的NBT。
icon.png
世界的图标,一般这个文件损坏无大碍。
generated
据我所知这个文件夹好像只用来存放在游戏中使用结构方块保存的结构。generated/<命名空间>/structures/<路径>.nbt是以解压缩的nbt格式存储<命名空间>:<路径>这个结构。
level.dat
这个文件是决定你的世界能不能出现在世界菜单上的重要文件,如果你的存档从存档列表中消失了,跟这个文件损坏多半有关系。它记载一些有关存档的重要全局信息,例如:世界种子、世界出生点、世界名称、游戏规则、服主信息等等,甚至还有注册表信息(对于Forge/Fabric等)。它和playerdata下的各个文件一样,这里面的数据基本生都是重要数据,Minecraft会在保存之前把旧的level.dat备份到level.dat_old,如果你觉得level.dat损坏了,可以尝试把level.dat_old恢复到level.dat。有用的数据很多,比如上文提到的玩家坐标、维度,出生点坐标、维度等等。
lsession.lock
这个文件里并没有什么信息。
Minecraft: Java Edition 1.12
1.12的目录结构和1.16的大同小异,区别在于,1.12没有datapacks文件夹(因为不支持数据包),会将一些结构的信息写入data/<结构名称>.dat中(在新版中,这些东西跟随区块保存了),没有poi文件夹(Minecraft1.12没有PointOfInterest这个游戏机制),自定义维度(仅能通过Mod实现)的存储路径从维度ID变成“DIM<维度数字ID>”例如暮色的存档位置可能是DIM7(和配置有关),此外一些在高版本中由数据包实现的内容在1.12中在data文件夹中保存(例如函数被放到了data/functions)。(说实话我具体的也并不是很清楚,因为不怎么玩1.12.x,剩下的具体碰到的时候再说吧
 )
 )关于诊断
存档不识别怀疑level.dat损坏
如果你好几个存档都进不去,那多半不是存档损坏造成的,更建议去找找Mod的问题
有的时候进不去存档不一定是存档损坏,如果是卡半天进不去可能是由于网络原因,这时候我建议你去试试断开网络之后能不能打开存档,能打开的话说明上面的内容全白看了
关于如何阅读崩溃报告可以参考https://www.mcbbs.net/thread-860103-1-1.html,不过蝙蝠这篇文章没有讲到的一点,如果你的报告的栈帧是混淆的(例如有很多诸如dcb、sqk、class_2407、class_1023、method_19375、method_40223、func_45353_k、func_2971_b这样的无意义内容),你需要对照混淆映射表阅读报告,Minecraft混淆映射表的使用方法建议去问度娘
如果你的报告中有出现java.io.EOFException这样的字眼,基本上可以确定是和存档损坏有关(有时是数据包/材质包的锅),从栈帧上可以大致确定是在加载什么内容时崩溃(比如上面那位其实就有AnvilChunkLoader.loadChunk这样的字眼提示),再通过一些Minecraft知识可以缩小范围,剩下基本二分法能解决
最重要的,不要让你的电脑过热保护断电(对电脑是一种伤害,也威胁你的其他数据安全)
以及多备份Minecraft存档
水怪席
@⚡️👮 @🥶❄️☠️ @bleake @伟大的小安 @诡灬稽 @enderman_JC @🐦💕🌸🌸 @RarityEG @800805 @水怪诗人 @小孩孩 @小灬望 @北极仙光 @离 @🌱⛄🐏 @Arrosin @板砖w @Ender56 @immangguo @Flavor_xy
不懂就问
你是拿谷歌生草机翻译的嘛
好东西
那个我只看出来了文件损坏,其他的没看出来
那个我只看出来了文件损坏,其他的没看出来
感觉对我启发不小,我最近就有个存档就进不去了而其他存档基本上照常进去。大概可能也是这个原因导致的。
xmdhs 发表于 2021-4-17 21:16
其实可以更简单的
https://www.mcbbs.net/thread-933294-1-1.html
好东西!
 本帖最后由 洞穴夜莺 于 2021-4-17 22:04 编辑 
被你发现了
就是拿谷歌翻译的
茶馆好像机翻不扣贡献来着?而且我后面也给了正经的翻译
immangguo 发表于 2021-4-17 21:04
不懂就问
你是拿谷歌生草机翻译的嘛
被你发现了
就是拿谷歌翻译的
是我看不懂的东西
哇,再次感谢大大帮我修好,还做了一篇教学。谢谢!!!
这非常考验我的正则表达式能力
那就咕了错误分析这个功能吧
那是不可能的,我还要靠疑难解答吃饭呢
RarityEG 发表于 2021-4-17 22:36
这非常考验我的正则表达式能力
那就咕了错误分析这个功能吧那是不可能的,我还要 ...
话说正则表达式对高度非格式化的文本基本没啥用
最基础的Mod冲突/Mod下错版本(1.12.2/1.16.5傻傻分不清楚)这种可以做
其他的都应当交给玩家自行处理,这是我的意见
确实,我果然看不懂
洞穴夜莺 发表于 2021-4-17 22:38
话说正则表达式对高度非格式化的文本基本没啥用
最基础的Mod冲突/Mod下错版本(1.12.2/1.16.5傻 ...
split 大法好
分行后用 /.+?Exception.*/gi 先把错误抓出来
再动态正则把错误原因抓出来
搞定
洞穴夜莺 发表于 2021-4-17 22:38
话说正则表达式对高度非格式化的文本基本没啥用
最基础的Mod冲突/Mod下错版本(1.12.2/1.16.5傻 ...
- let r = /Description: .*\n\n(.*[: ]|.*)(.*)/
 
 
- function test(crash) {
 
-     let s
 
-     let l = r.exec(crash)
 
-     s = l[1]
 
-     if (l.length >= 3) {
 
-         if (l[1] > 100) {
 
-             s = l[2]
 
-         } else {
 
-             s = l[1] + " " + l[2]
 
-         }
 
-     }
 
-     let u = new URL(`https://files.xmdhs.top/search/s?q=test`)
 
-     let serch = new URLSearchParams(u.search)
 
-     serch.set("q", s)
 
-     u.search = serch.toString()
 
-     window.open(u.toString())
 
- }
 
- test(`---- Minecraft Crash Report ----
 
- // I let you down. Sorry :(
 
 
- Time: 20-2-17 下午8:13
 
- Description: Initializing game
 
 
- java.lang.IllegalArgumentException: MALFORMED
 
-         at java.util.zip.ZipCoder.toString(ZipCoder.java:58)
 
-         at java.util.zip.ZipFile.getZipEntry(ZipFile.java:583)
 
-         at java.util.zip.ZipFile.access$900(ZipFile.java:60)
 
-         at java.util.zip.ZipFile$ZipEntryIterator.next(ZipFile.java:539)
 
-         at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:514)
 
-         at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:495)
 
-         at wj.a(SourceFile:73)
 
-         at xn.a(SourceFile:44)
 
-         at cyc.au(SourceFile:495)
 
-         at cyc.b(SourceFile:394)
 
-         at net.minecraft.client.main.Main.main(SourceFile:155)
 
 
 
- A detailed walkthrough of the error, its code path and all known details is as follows:
 
- ---------------------------------------------------------------------------------------
 
 
- -- Head --
 
- Thread: Client thread
 
- Stacktrace:
 
-         at java.util.zip.ZipCoder.toString(ZipCoder.java:58)
 
-         at java.util.zip.ZipFile.getZipEntry(ZipFile.java:583)
 
-         at java.util.zip.ZipFile.access$900(ZipFile.java:60)
 
-         at java.util.zip.ZipFile$ZipEntryIterator.next(ZipFile.java:539)
 
-         at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:514)
 
-         at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:495)
 
-         at wj.a(SourceFile:73)
 
-         at xn.a(SourceFile:44)
 
-         at cyc.au(SourceFile:495)
 
 
- -- Initialization --
 
- Details:
 
- Stacktrace:
 
-         at cyc.b(SourceFile:394)
 
-         at net.minecraft.client.main.Main.main(SourceFile:155)
 
 
- -- System Details --
 
- Details:
 
-         Minecraft Version: 1.14.4
 
-         Minecraft Version ID: 1.14.4
 
-         Operating System: Windows 10 (amd64) version 10.0
 
-         Java Version: 1.8.0_231, Oracle Corporation
 
-         Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
 
-         Memory: 3992861504 bytes (3807 MB) / 4294967296 bytes (4096 MB) up to 4294967296 bytes (4096 MB)
 
-         CPUs: 12
 
-         JVM Flags: 11 total; -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=16M -XX:-UseAdaptiveSizePolicy -XX:-OmitStackTraceInFastThrow -Xmn128m -Xmx4096m -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump
 
-         Launched Version: HMCL 3.2.149
 
-         LWJGL: 3.2.2 build 10
 
-         OpenGL: GeForce MX250/PCIe/SSE2 GL version 4.6.0 NVIDIA 431.40, NVIDIA Corporation
 
-         GL Caps: Using GL 1.3 multitexturing.
 
- Using GL 1.3 texture combiners.
 
- Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
 
- Shaders are available because OpenGL 2.1 is supported.
 
- VBOs are available because OpenGL 1.5 is supported.
 
 
-         Using VBOs: Yes
 
-         Is Modded: Probably not. Jar signature remains and client brand is untouched.
 
-         Type: Client (map_client.txt)
 
-         Resource Packs: vanilla, file/Dazzle Legend - Survive The Night resource pack.zip
 
-         Current Language: ~~ERROR~~ NullPointerException: null
 
-         CPU: 12x Intel(R) Core(TM) i7-10710U CPU @ 1.10GHz`)
 
好,跟看论文一样,直接看蒙了
xmdhs 发表于 2021-4-17 23:01
"基于大数据的,人工智能错误报告分析”
对于崩溃这种问题,上问答版搜帖子还不如上Github搜Issue
而且无论如何,这种报告都是应该先让玩家阅读的
洞穴夜莺 发表于 2021-4-17 23:04
对于崩溃这种问题,上问答版搜帖子还不如上Github搜Issue
而且无论如何,这种报告都是应该先让玩家阅读的 ...
非开源 mod 就找不到了,当然也有拿着别的 mod 造成的崩溃报告,到这个 mod 来开 Issue 的。
如果真要投入使用,中文对于国内玩家还是更友好。当然,现在这个只是娱乐而已。
大佬的交流 给我看蒙了。
?咋不发游戏技巧
爱心魔王FHC 发表于 2021-4-18 09:19
?咋不发游戏技巧
涉及Mod的帖子可以发在游戏技巧吗?
洞穴夜莺 发表于 2021-4-18 09:22
涉及Mod的帖子可以发在游戏技巧吗?
但是茶馆怎么都感觉不合适,别人不会在茶馆搜存档怎么修吧
没接触过代码的直接看啥了
感谢分享!
看上去好复杂,完全看不懂