概述
Patched 提供了修改 json 文件的一部分以供数据/资源包使用的能力。它可以用于修补游戏中的生物群系、战利品表、模型和大多数其他 json 文件。
Mojang 将实体模型制作为数据驱动时,Patched 很可能也能对这些模型进行修补,从而为 OptiFine 的 CEM 提供基本的替代方案。
以下是使用 Patched 可以实现的一些不同功能的列表:
删除或添加世界生成特性到生物群系;
删除或添加准则到进度;
删除或添加战利品到战利品表;
修改配方;
还有更多!
Patched 旨在减少数据/资源包之间以及其他 Mod 之间的冲突。它还旨在简化这些文件的维护,因为你不必担心文件的其他部分会过时(例如 Minecraft 更新会修改你正在更改的不相关部分的生物群系)。
Patched 还提供了一些命令来检查游戏状态(客户端命令 /patchedc):
/patched list packs 显示具有修补程序的包的列表;
/patched list patches <pack> 显示指定包提供的修补程序列表;
/patched dump patch <pack> <name> 显示指定包提供的修补程序的内容;
/patched dump file <name>显示文件内容,并用注释说明对文件所做的更改和更改者。
工作原理
Patched 允许创建这些所谓的 "补丁 "文件,文件名与被打补丁的文件相同。这些补丁文件采用 RFC 6902 的语法,并增加了一些功能,以便更好地用于修改。这里是补丁语法文档,这里是编写补丁的指南。
例如,删除平原生物群落中的沙砾:
{
"op": "find",
"path": "/features/6",
"test": {
"path": "",
"value": "minecraft:ore_gravel"
},
"then": {
"op": "remove",
"path": ""
}
}
然后,该补丁将被放置在数据包中,位置为 data/minecraft/worldgen/biome,名称为 plains.json.patch。
为了尽可能提高性能,Patched 只查找自称有补丁的数据包(即选择加入)。这样做是为了避免在你的模组中查找全部 200 个模组,即使其中只有一个实际上有补丁。
一个包可以通过在 pack.mcmeta 中加入此选项来启用补丁:
{
"pack": {
"patched:has_patches": true // Indicates to Patched that this pack would like to patch things.
}
}
另一个例子是,在“探索的时光”进度中增加一个自定义生物群系:
[
{
"op": "add",
"path": "/criteria/mydatapack:mybiome",
"value": {
"conditions": {
"player": [
{
"condition": "minecraft:entity_properties",
"entity": "this",
"predicate": {
"location": {
"biome": "mydatapack:mybiome"
}
}
}
]
},
"trigger": "minecraft:location"
}
},
{
"op": "add",
"path": "/requirements/-",
"value": [ "mydatapack:mybiome" ]
}
]
兼容性
Patched 与基础资源加载代码挂钩,允许对任何 json 文件打补丁,甚至是其他补丁(理论上)。这将与大多数多模组兼容,因为它们无需修改代码,而且任何使用 Minecraft 资源加载的模组(这也算是一种使用需求)都将获得 Patched 的好处。不过,有些模组也可能会修改资源加载代码,轻则造成功能缺失,重则导致崩溃。
限制
不幸的是,有一种 json 文件无法打补丁。目前,这应该是标签,这是因为 Minecraft 从每个包中加载标签以合并它们的方式。以类似方式加载的资源也会遇到这个问题。
除此之外,在 1.19.3- 的旧版本中,无法(直接)修补原版生物群落。这是因为在这些版本中,这些生物群落是硬编码的,也就是说,没有可以修补的文件。这可以通过之前的数据包来解决,可以在这里添加来自世界生成出的生物群落,但作者建议更新到 1.19.3。