Patched

Patched

允许数据包/资源包和模组修改json文件的部分内容,而非完全替换它们。

工具

Patched 是一个模组,它允许数据包/资源包(以及模组!)修改 JSON 文件的各个部分,从而避免直接整体替换它们。此模组可用于修改生物群系、战利品表、模型以及游戏中大多数其他 JSON 文件。每当 Mojang 最终使实体模型数据驱动时(每次更新似乎都离这更远),Patched 也能修补这些模型,为 OptiFine 的 CEM(自定义实体模型)提供轻量级替代方案。

以下是一些可以借助 Patched 实现的功能列表:

  • 从生物群系中移除或添加世界生成特性
  • 从进度中移除或添加条件
  • 从战利品表中移除或添加战利品
  • 修改配方
  • 修改所有匹配模式的文件(例如,修改所有生物群系)
  • 根据已加载的模组或配置选项进行条件修改
  • 等等!

Patched 旨在减少数据包/资源包之间以及其他模组之间的冲突。 同时旨在简化这些文件的维护,因为您无需担心文件其他部分过时的问题(例如,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": {
    "format_version": 1 // 向 Patched 表明此包使用了 Patched,因此其中包含补丁。
  }
}

对于模组,这些信息可以放置在对应加载器的元数据文件中。 详情请参阅文档。

再举一个例子,此补丁将自定义生物群系添加到“探索的时光”进度中:

[
  {
    "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。然而,某些模组可能也会修改此资源加载代码。在较新版本中,已尝试与此类模组实现兼容——如果存在的话——但这同样取决于它们是否也进行类似的兼容性更改。

局限性

不幸的是,“合并”资源存在一些限制。澄清一下,合并资源是指 Minecraft 在运行时合并的任何资源——最显著的是标签。除了标签之外,还有少量此类资源(均为客户端):语言文件、sounds.json、纹理图集源、方块状态和字体。对此类文件的限制是,只有提供它们的包才能修补它们。原因是,否则 Patched 不知道应该将补丁应用于这 30 多个文件中的哪一个。

此外,在早于 1.19.3 的版本中,原版生物群系无法(直接)修补。这是因为在这些版本中,这些生物群系是硬编码的——也就是说,没有可修补的文件。可以通过让一个优先级较低的数据包添加生物群系(例如,从此处的世界生成导出中获取)来解决此问题,但我更建议升级到 1.19.3 或更高版本。