物品覆盖

ItemOverrides

ItemOverrides 让 BakedModel 处理 ItemStack 的状态并返回新的 BakedModel,随后新模型替换旧模型。它表示任意函数 (BakedModel, ItemStack, ClientLevel, LivingEntity, int) → BakedModel,因此适合动态模型。原版使用它实现物品属性覆盖。

ItemOverrides.resolve 处理当前模型和物品状态等输入,返回替换使用的 BakedModel;原版 BakedOverride 保存属性最小值匹配条件和目标模型。

原创说明图,依据 Forge 1.21.x 官方文档 绘制。

ItemOverrides()

构造函数接收 ItemOverride 列表,将其复制并烘焙。可通过 #getOverrides 访问烘焙后的覆盖项。

resolve

接收 BakedModel、ItemStack、ClientLevel、LivingEntity 和 int,生成另一个用于渲染的 BakedModel。模型可在此处理物品状态。此方法不应修改世界。

getOverrides

返回不可变列表,其中包含该 ItemOverrides 使用的所有 BakedOverride。没有适用项时返回空列表。

BakedOverride

此类表示原版物品覆盖,保存多个针对物品属性的 ItemOverrides$PropertyMatcher,以及满足这些匹配条件时使用的模型。它们是原版物品 JSON 模型的 overrides 数组中的对象:

以下带注释的示例用于说明结构;实际 JSON 文件不支持注释和省略号,应移除并补全。

{
  // 在原版 JSON 物品模型内
  "overrides": [
    {
      // 这是一个 ItemOverride
      "predicate": {
        // 这是 Map<ResourceLocation, Float>,包含属性名称及其最小值
        "example1:prop": 0.5
      },
      // 覆盖的 location 或目标模型;上方谓词匹配时使用
      "model": "example1:item/model"
    },
    {
      // 这是另一个 ItemOverride
      "predicate": { "example2:prop": 1 },
      "model": "example2:item/model"
    }
  ]
}

原文:Item Overrides。