Minecraft的疑难杂症#10-实体、方块出错啦,存档就不让进了?
Rendering Block Entity | Rendering entity in world
Colliding entity with block
Ticking Block Entity | Ticking Tile Entity | Ticking Entity
Tesselating block in world | Tesselating block model
以上为崩溃日志中的一些关键词,同时也是为本篇文章适用的范围~
因为比较多的崩溃种类挤在这一篇文章里而且标题写不下所以开头先提几个Description后的句子或者是下方的具体原因来凑字数检查你需不需要看这篇文章。当然凡事都有例外,如果你自己的崩溃类型没有出现在这篇文章里但你自己又觉得很像这种类型的就接着看下去吧,说不定就解决了呢。没错我是故意不分逗号的嘎嘎嘎嘎嘎嘎......

首先,让我先给这种由于特定的实体或方块出错导致的存档无法进入的崩溃起个名字,为了下文方便总称w,就叫作奶奶的为什么不让我进存档,进啊,不进,不进我就炸档 “物件崩溃”吧。
这个问题也是比较容易发生的(原版也会,但更多的是存在模组的情况下),特别是模组装得超多了之后,一些模组的不兼容性或者是一些方块实体就会跑出来手舞足蹈地对你的存档进行搞搞震毁灭性打击嘎嘎嘎
所以,这里先放一个~
---- Minecraft Crash Report ----
// Hey, that tickles! Hehehe!
Time: 2023-06-11 14:28:08
Description: Rendering Block Entity
java.lang.NullPointerException: Cannot invoke "net.fabricmc.fabric.api.renderer.v1.Renderer.meshBuilder()" because the return value of "net.fabricmc.fabric.api.renderer.v1.RendererAccess.getRenderer()" is null
at me.pepperbell.continuity.impl.client.ProcessingContextImpl.<init>(ProcessingContextImpl.java:19)
at me.pepperbell.continuity.client.model.CTMBakedModel$CTMQuadTransform.<init>(CTMBakedModel.java:70)
at me.pepperbell.continuity.client.model.ModelObjectsContainer.<init>(ModelObjectsContainer.java:10)
at java.base/java.lang.ThreadLocal$SuppliedThreadLocal.initialValue(ThreadLocal.java:305)
at java.base/java.lang.ThreadLocal.setInitialValue(ThreadLocal.java:195)
...[省略]...
A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------
-- Head --
Thread: Render thread
Stacktrace:
...[省略]...
-- 方块实体详情 --
详情:
名称: minecraft:piston // net.minecraft.class_2669
方块: 方块{minecraft:moving_piston}(我的世界:移动中的活塞)[facing=north,type=normal]
方块所在位置: 坐标: (139,28,89), 地段: (在 11,12,9 in 8,1,5; 区块包含的方块 128,-64,80 to 143,319,95), 区域: (0,0; 包含区块 0,0 to 31,31, 方块 0,-64,0 to 511,319,511)
方块: 方块{minecraft:moving_piston}(我的世界:移动中的活塞)[facing=north,type=normal]
方块所在位置: 坐标: (139,28,89), 地段: (在 11,12,9 in 8,1,5; 区块包含的方块 128,-64,80 to 143,319,95), 区域: (0,0; 包含区块 0,0 to 31,31, 方块 0,-64,0 to 511,319,511)
堆栈跟踪:
at net.minecraft.class_824.method_3554(class_824.java:104)
...[省略]...
-- Affected level --
Details:
All players: 1 total; [class_746['wj_lxax'/12, l='ClientLevel', x=139.93, y=29.13, z=91.99]]
...[省略]...
at oolloo.jlw.Wrapper.main(Wrapper.java:53)
-- Last reload --
...[省略]...
-- System Details --
Details:
...[省略]...
为节约空间删减了部分内容

由Description可以得知,Ticking Block Entity,某个方块实体在游戏的某一刻处理时出错了。
如果你对自己的模组列表比较熟悉,也可以在at语句中发现自己加过的一个模组continuity,一个提供方块之间连接纹理材质的模组,唔!它参与了这次崩溃~
(猜猜我为什么要先发这篇进阶版本的解决模组崩溃的文章?~)

先别急着理解啥叫方块实体,我们的目标是要解决这个崩溃的...先来看日志下面!

有一处在别的日志没出现过的东西...... 哇塞,这个日志居然这么好心,标注出来了出错的方块!

捏,不同的物件崩溃有不同的崩溃日志,下面列举一些:
为方便说明,以这句话以下的一部分内容叫做“详细清单”

如果你遇到的是Tesselating block in world(镶嵌世界中的实体)或者是Tesselating block model(镶嵌方块模型),“详细清单”下方应该会有
-- Block being tesselated(被镶嵌的方块) --
或者和-- Block model being tesselated(被镶嵌的方块模型) --一起
(不要问我镶嵌是什么,问我我只能告诉你我了解到的是曲面细分的镶嵌技术)
如果你遇到的是Rendering entity in world(渲染世界中的实体)或者是Rendering Block Entity(渲染世界中的方块),“详细清单”下方应该会有
-- Entity being rendered (被渲染的实体)-- / -- Block being rendered (被渲染的方块)--
如果你遇到的是Colliding entity with block(与方块碰撞的实体),“详细清单”下方应该会有
-- Block being collided with(被碰撞的方块) --
-- Entity being checked for collision(被检测碰撞的实体) --
如果你遇到的是Ticking XXX(滴答作响的XXX游戏在处理XXX的某刻出错),“详细清单”下方应该会有
-- XXX being ticked (XXX在某一刻被处理)--
知道了以上信息,那现在就让我们来处理处理它吧!
解决方案
注意!在进行下列操作中,都非常建议你先备份一份存档!
(第一条就不用了嘎嘎嘎()

1.如果你游玩的整合包包含了备份模组,找回上一次备份。
如果你上一次备份没有出现问题,那你依然可以接着玩w

2.自行取舍,有的时候 删掉模组 (或者更新模组)是最能无伤通关这个问题的办法。
在这一篇崩溃日志中,Continuity是一个辅助模组,它只是在视觉上影响你的游戏体验,没有在你的世界里添加物品方块,这种模组删除掉,对你的存档影响几乎没有,因此你大可直接删掉这个模组!
(所以能猜到我为什么要先发这篇进阶版本的解决模组崩溃的文章了吧~因为如果你遇到的崩溃是一个类似于这种不对游戏实质产生影响的模组,例如纳sodium模组或者是Iris模组,又或者是你可能不太需要的模组让你的游戏崩溃的话,你完全可以先删掉它们。但如果你发现不了,那你要做的事情可会变得多起来了。)
切记!如果你并不知道这个模组有没有在你的存档新增什么特性或者方块物品,在删除这个模组之前一定要先备份一份存档!
(这类触发物件崩溃的模组通常来说,删掉,进去一遍存档,再回来安装,一般很少会触发同样的崩溃)
如果你成功找到(无论是从at语句发现的还是从出问题的实体或方块的模组)引起崩溃的模组,你可以检查一下它们的版本是否是最新的,如果不是,更新。有可能作者已经解决了这个崩溃。

但如果你的模组对你的存档改动已经非常大了,又或者出于某些原因你并不想删掉这个模组,你可以接着往下看~
3.使用像 MCEdit 或 NBT 资源管理器(NBT Explorer)等外部修改的存档编辑器

就以本次崩溃日志为例子,从所在位置(location)我们可以找到方块的所在区块,坐标,以及乱七八糟的别的。都不重要,好吧,如果你想理解Region是什么个东西要怎么看,你可以看Minecraft Wiki的解释*[3]。为了直接通关崩溃修复,就直说了。
软件的下载地址我已经放在文章下面的相关链接了。(*[序号] 是相关链接的序号)
如果你要清除的是一个实体,用NBT Explorer*[8]会更方便
NBT Explorer 的用法:

以上的意思是,在存放实体的文件夹中(entities),在r. -1.0.mca文件几记录的区块[13,29](Chunk [13, 29])中有7个目标(Entities: 7 entries),在这7个 entries(说成目标好理解一点)下中的其中一个目标是一个id为minecraft:glow_squid(发光鱿鱼)的实体。
如果我们要把这只发光鱿鱼给删掉,我们要点击图片中倒数第二个被选中的那个东西然后按Delete键就好了,记得保存。(那个东西在图中叫28 entries,但不同的游戏不同,只要知道它是属于Entities: 7 entries下面的一个目标就是游戏中的一个实体就好)

那我们要怎么从崩溃日志知道这个错误实体在区域文件里的位置呢?只要知道它的坐标就能找到啦!这里举另一个例子:
-- Entity being checked for collision --
Details:
Entity Type: lmmx.LittleMaidX (littleMaidMobX.LMM_EntityLittleMaid)
Entity ID: 474
Entity Name: 女仆酱
Entity's Exact location(实体的准确坐标): -203.61, 71.94, 671.31
Entity's Block location: World(你用这个也可以): (-204,71,671), Chunk: (at 4,4,15 in -13,41; contains blocks -208,0,656 to -193,255,671), Region: (-1,1; contains chunks -32,32 to -1,63, blocks -512,0,512 to -1,255,1023)
Entity's Momentum: -0.02, 0.00, 0.05

如果你要清除的是一个方块,用MCedit*[9][10]或者Amulet*[6]会更方便
Mcedit已经有不少人做过使用说明了,我就不再赘述咯(主要是懒嘎嘎嘎)w
4.注意是不是Optifine在捣乱。(Tesselating block in world/Tesselating block model等等)
有人反馈在某些版本的Optiifne会导致某些模组的渲染问题*[12](我当然找到了更多的例子,但是不写那么多在相关链接了),如果你的游戏包含Optifine,你可以先尝试禁用Optifine重进存档。
5.启用Forge自带的移除错误实体/移除错误方块操作。(Ticking Entity/Ticking Block Entity/Ticking Tile Entity)
注意,这个方法只对以上提到的一些崩溃有效,也就是Ticking Block Entity、Ticking Tile Entity,在一些案例中是有效的。
并不建议你长期开启,同时这项操作也可能会将你世界的其他东西删除,注意备份。
(小心点,如果你看到整个结构或建筑物消失了,这正是Forge的杰作。)
在你的游戏目录下的Config文件夹中,找到并打开Forge的配置文件,里面应该有一个名为Forge.cfg的文件。
视情况,找到 removeErrorEntities (如果遇到的是Ticking Entity崩溃)
或者 removeErroringTileEntities(如果遇到的是Ticking Tile Entity/Ticking Block Entity崩溃)
将它们后面的False改为True
保存文件,启动游戏。如果成功进入存档了,立刻关掉存档,记得把True改回去False并保存,Forge有权删掉它看不顺眼的方块和实体,不要给它这个机会......
详细的修改图文可以看深湖的一篇文章~Ticking Block Entity以及其他 - 哔哩哔哩 (bilibili.com)

这里我还搜集了一些有用的建议和解决方法,但并不常用或者适用范围很小或者比较麻烦或者我觉得没什么用但确实有人成了,我都放在下面了。
CoFH Core模组删除实体。
把你的存档放进一个服务器并启动(这样可以避免玩家去碰到错误的实体),输入cofh killall
,这会杀死所有实体,即使它在未加载的区块当中。你还可以在这个命令末尾添加一个参数,以仅针对崩溃报告中提到的特定生物类型(Entity type)。例如杀死所有骷髅:cofh killall skeleton
为什么不用传统用的kill?如果你是在处理Ticking Entity的实体,它会在给予这个实体巨大伤害之前把游戏崩掉。
调和平并调整视野,让游戏删实体。*[2]
题外话:
如果你是因为ticking player进来这篇文章的,可以优先清空玩家的背包试试(我建议你还是先去删导致崩溃的模组),用NBT explorer也是可以的,记得备份。但由于这崩溃不常见,具体做法我就不提了,有人需要我在帮忙吧w
这里我放出的相关链接是我搜集的资料来源和一些推荐看的文章。
相关链接
[1]https://help.ggservers.com/en-us/article/how-to-fix-a-ticking-entity-error-1yjzxl7/ - How to Fix a Ticking Entity Error | GGServers Knowledge Base
[2]https://nodecraft.com/support/games/minecraft/fixing-ticking-entities-errors-in-minecraft#h-2-reduce-view-distance-and-set-minecraft-to-peaceful-f5932d21 - Fixing Ticking Entity / TileEntity Errors | Minecraft | Knowledgebase Article - Nodecraft
[3]区域文件格式 - Minecraft Wiki_BWIKI_哔哩哔哩 (biligame.com)
[4]https://www.jianshu.com/p/91661ddcaf50 - 「Minecraft」自动修复部分由异常实体或异常方块实体导致的崩溃 - 简书 (jianshu.com)
[5]Ticking Block Entity以及其他 - 哔哩哔哩 (bilibili.com)
[6]https://www.amuletmc.com/ -Amulet Editor (amuletmc.com)
[7]【崩溃101】第二期:Ticking block entity - 哔哩哔哩 (bilibili.com)
[8]https://github.com/jaquadro/NBTExplorer/releases - Releases · jaquadro/NBTExplorer (github.com)
[9]https://search.mcbbs.net/thread-930879-1-1.html - [持续更新]MCEdit —— 可视化地图编辑器 | 最新版1.6.0.0 | PC 1.8-1.12.2 BE 1.6 - 软件资源 - Minecraft(我的世界)中文论坛 - (mcbbs.net)
备注:注意这是MCedit 1
[10]http://www.mcedit.net/ - MCEdit - World Editor for Minecraft
备注:注意这是MCedit 2,两个版本操作界面不同的。
[11]https://hypixel.net/threads/how-to-fix-tesselating-block-model-crash.3560198/ - Guide - How to fix Tesselating Block Model crash | Hypixel Forums
[12]https://www.minecraftforum.net/forums/support/java-edition-support/2612356-help-tesselating-block-model-crash - HELP: Tesselating Block Model Crash? - Java Edition Support - Support - Minecraft Forum - Minecraft Forum
猜猜我打这篇文章用了几天?(