跳到正文

No Null Processors

修复了 1.17 及更高版本中结构因不明来源的空处理器列表而崩溃的问题。

收藏

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

文件

Forge 下载:点击这里

Fabric 下载:点击这里

————————————————————————————————————–


 注意:1.18.2 已修复空处理器,因此此模组不再适用于该 Minecraft 版本及更新版本

 

 


介绍

你是否尝试用预生成模组预生成大片地图区域,却总是随机因为这个错误而崩溃? 

Caused by: java.lang.NullPointerException: Cannot invoke “net.minecraft.structure.processor.StructureProcessorList.getList()” because the return value of “java.util.function.Supplier.get()” is null

  at net.minecraft.structure.pool.SinglePoolElement.createPlacementData(SinglePoolElement:148) ~[?:?]

  at net.minecraft.structure.pool.SinglePoolElement.generate(SinglePoolElement:124) ~[?:?]

 

Caused by: java.lang.NullPointerException: Cannot invoke “net.minecraft.class_5497.method_31027()” because the return value of “java.util.function.Supplier.get()” is null

  at net.minecraft.structure.pool.SinglePoolElement.createPlacementData(SinglePoolElement:148) ~[?:?]  

  at net.minecraft.structure.pool.SinglePoolElement.generate(SinglePoolElement:124) ~[?:?]

如果是这样,恭喜!你发现了 Minecraft 1.17.1 中一个非常古怪的漏洞!这个模组旨在修复它。

这个漏洞很难解释,但简单来说,要触发它,你需要安装一个通过世界生成 JSON 文件创建处理器列表的模组或数据包,再使用区块预生成模组或类似工具加载大量区块,之后加载所有包含使用 JSON 处理器列表的结构的区块。由于处理器列表为空,游戏有时会随机崩溃。
那么究竟发生了什么?Minecraft 中有一个处理器列表注册表,本应在世界启动时创建。游戏需要时会从注册表中获取列表,但不应该在运行时重新写入注册表。那样会出问题,对吧?嗯……

在世界生成过程中创建结构布局时,游戏会将该布局以及选中的结构部件保存到区块本身。之后生成区块时,游戏会从区块中读取该结构部件,并在世界中生成它。不过,读取区块中的结构部件时,游戏还需要读取附加到该部件的处理器列表,以确定该部件应运行哪些处理器。漏洞就出在这里。读取处理器列表的代码有误:它会把读取到的处理器再次注册到注册表中,用它自己替换它自己,然后再使用它。

而这种用自身替换自身的注册表操作并非线程安全。Minecraft 又是以多线程方式生成区块的……因此,可能会出现这样的情况:两个使用同一处理器的结构部件同时尝试读取或写入注册表中的同一个条目。当这种罕见的冲突发生时,其中一个结构部件可能会得到一个空处理器,随后导致游戏崩溃,因为游戏无法生成一个不存在的空处理器! 

是不是很离奇?这问题既奇怪又难以排查,不过多亏了另一位模组作者,我们终于找到了原因并制作了这个修复模组。据我们所知,1.16.5 没有这个问题。问题从 1.17.0 开始出现,并一直持续到 1.18.1。不过,1.18.2 已经修复了这个漏洞。这个模组的修复方式是缓存每个处理器列表各自使用的 RegistryOps,这样它只会向注册表写入自身一次,之后就一直重复使用它,从而避免对同一个注册表条目进行多次读写。(理论上是这样,哈哈)

 

希望这些说明能帮到你!

 

 

我的模组 Discord 频道 #telepathicgrunt-mods 链接: 

https://discord.gg/K8qRev3yKZ

discord-logo-png-free-transparent-png-logos-discord-png-logo-300_300 (PNG)  | BeeIMG

 

常见问题

No Null Processors 支持哪些 Minecraft 版本?

No Null Processors 支持 Minecraft Java 版 1.17–1.18.1,共 4 个版本,可用的加载器:Fabric / Forge。下载时注意选择和你游戏版本一致的文件。

No Null Processors 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Fabric / Forge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。

评论

登录后评论和评分

TelepathicGrunt 的其他作品

查看全部 →