本篇教程由作者设定使用 CC BY-NC-SA 协议。

本教程选用的 mod 版本为 Forge 端 3.1.3+1.20,其它版本以及 Fabric 端基本类似。

自定义方式概览

Mod 提供了两种自定义折叠条目的方式:代码 API 与 资源包 JSON 配置。

前者供开发者使用,具有更高的灵活度,但需要懂代码,而且很容易写死(难以二次修改);

后者面向普通玩家,比起代码 API 有一些限制,但更容易上手,同时允许他人自行修改。


本教程只介绍资源包方式,代码 API 请参照作者 wiki / Javadoc:condensed-creative

资源包制作请参照 教程:制作资源包 - 中文 Minecraft Wiki


资源包配置详解

折叠条目配置文件以 JSON 格式保存;

放置在资源包的 assets/<命名空间ID>/condensed_entries 目录下,命名空间 ID 自取;

允许多个配置文件;

文件名自取(一般为大小写字母、数字、下划线的组合,数字不开头),并以 .json 为后缀名。


配置格式一栏

{
  "my_custom:creative_itemgroup_1": {  // ①,创造模式标签页 ID
    // 标签页对象
    // 定义数个添加到该标签页的折叠条目
    "my_custom:condensed_entry_1": {   // ②,折叠条目 ID
      // 折叠条目对象
      // 配置折叠条目的各项属性与行为
      "title": "XXX",              // 选填,JSON 文本
      "title": {  },        // 选填,JSON 文本对象
      "description": "XXX",        // 选填,JSON 文本
      "description": {  },  // 选填,JSON 文本对象
      "strict_filter": false,      // 选填,布尔值(true 或 false)
      "entry_order": "DEFAULT",    // 选填,指定字符串,二选一("DEFAULT" 或 "ITEMGROUP")
      "item_comparison": false,    // 选填,布尔值(true 或 false)
      "base_item": "my_custom:item_1",             // 必填,物品 ID
      "item_tag": "my_custom:certain_item_tag",    // 必填,三选一,物品标签 ID
      "block_tag": "my_custom:certain_block_tag",  // 必填,三选一,方块标签 ID
      "items": [                                   // 必填,三选一,物品 ID 列表
        "my_custom:item_1",
        "my_custom:item_2",
        // ...
      ]
    },
    "my_custom:condensed_entry_2": {
      // ...
    },
    // ...
  },
  "my_custom:creative_itemgroup_2": {
    // ...
  },
  // ...
  "sharded_entries": {
    // 同 标签页对象,不赘述
    // ...
  }
}

第 2 行(①)中填入创造模式标签页 ID。原版标签页中,不能向 管理员用品(op_blocks)、热键栏(hotbar)以及 搜索物品(search)三项添加折叠条目。原版其余标签页的 ID 如下:

标签页名称标签页 ID
建筑方块building_blocks
染色方块colored_blocks
自然方块natural_blocks
功能方块functional_blocks
红石方块redstone_blocks
工具与实用物品tools_and_utilities
战斗combat
食物与饮品food_and_drinks
原材料ingredients
刷该蛋

spawn_eggs

第 5 行(②)中填入折叠条目 ID,自取,符合 ID 取名规范 且 不重复 即可。

其余配置项介绍见后文。


标题(title),描述(description),基准物品(base_item),物品标签(item_tag)

例 1(assets/ctidy/condensed_entries/test1.json)

{
  "minecraft:colored_blocks": {
    "ctidy:wool_carpets": {
      "title": {"text": "地毯", "color": "green"},
      "description": {"text": "所有羊毛地毯都在这里", "color": "yellow", "bold": "true", "extra": [{"text": " 哎嘿~", "color": "light_purple"}]},
      "base_item": "minecraft:white_carpet",
      "item_tag": "minecraft:wool_carpets"
    }
  }
}

第 2 行的 "minecraft:colored_blocks" 表示原版的“染色方块”标签页。

第 3 行的 "ctidy:wool_carpets" 是自己定义的折叠条目 ID。

第 4、5 两行的 title 与 description 表示折叠条目的标题与描述,支持 JSON 文本组件,详见 文本组件 - 中文 Minecraft Wiki。未指定 title 和 description  的默认行为见 例 2。

[必填] 第 6 行的 base_item 表示基准物品,为一个物品 ID。wiki 上说用于折叠条目的首个物品;实际上更趋向于这则条目在标签页中的位置(物品在标签页中的位置即为条目的位置);如果物品原本不在标签页中,则会向末尾添加这个物品,并之后代替为折叠条目。

[必填,三选一] 从第 7 行开始就是为折叠条目添加物品条目了,添加方式有三种:物品标签(item_tag)、方块标签(block_tag)和 物品列表(items)。当同时指定多个添加方式时,只会奏效一种:物品标签优先度最高,物品列表则最低。

例 1 使用的就是物品标签,游戏内效果:

资源包自定义折叠条目(附带模组配置说明)-第1张图片


例 2(assets/ctidy/condensed_entries/test2.json)

{
  "redstone_blocks": {
    "ctidy:redstone_ingredients": {
      "base_item": "redstone",
      "items": [
        "redstone",
        "redstone_block"
      ]
    }
  }
}

如果没有指定标题(title),则默认使用条目 ID 的 path 部分(冒号后面的部分),下划线替换为空格,每个单词首字母大写;本例中由 "ctidy:redstone_ingredients" 生成了默认标题 Redstone Ingredients。

如果没有指定描述(description),则没有描述文本。

游戏内效果:

资源包自定义折叠条目(附带模组配置说明)-第2张图片

考虑到我们一般用中文,但 ID 中不能使用中文,所以实践中还是指定个标题为宜。当然,最万全的实践方式是在 标题 及 描述 中使用 translatable(翻译)类型的 JSON 文本组件,以支持 I18N (国际化)。


方块标签(block_tag)

例 3(assets/ctidy/condensed_entries/test3.json)

{
  "building_blocks": {
    "ctidy:woods": {
      "title": "原木",
      "base_item": "minecraft:oak_log",
      "block_tag": "minecraft:logs"
    }
  }
}

将例 1 中的 item_tag 换成 block_tag,就是指定方块标签了。游戏内效果:

资源包自定义折叠条目(附带模组配置说明)-第3张图片


物品列表(items)

例 4(assets/ctidy/condensed_entries/test4.json)

{
  "building_blocks": {
    "ctidy:oak_varients": {
      "title": {"text": "橡木制品", "color": "yellow"},
      "description": {"text": "以橡木为原料所制作的各种木质建筑方块", "color": "gray"},
      "base_item": "minecraft:oak_log",
      "items": [
        "minecraft:oak_log",
        "minecraft:oak_wood",
        "minecraft:stripped_oak_log",
        "minecraft:stripped_oak_wood",
        "minecraft:oak_planks",
        "minecraft:oak_stairs",
        "minecraft:oak_slab",
        "minecraft:oak_fence",
        "minecraft:oak_fence_gate",
        "minecraft:oak_door",
        "minecraft:oak_trapdoor",
        "minecraft:oak_pressure_plate",
        "minecraft:oak_button"
      ]
    }
  }
}

将例 1 中的 item_tag 换成 items,就能手动添加条目内的物品了。后面中括号内的每一项表示物品 ID,如本例中的 橡木原木(minecraft:oak_log)、橡木(minecraft:oak_wood)、去皮橡木原木(minecraft:stripped_oak_log)等。游戏内效果:

资源包自定义折叠条目(附带模组配置说明)-第4张图片资源包自定义折叠条目(附带模组配置说明)-第5张图片

重复物品

仔细观察下 例 3 和 例 4,你会发现我们指定了同一个基准物品,即 橡木原木(minecraft:oak_log)。实际上,原版本身就支持在标签页内添加多个相同物品。于是,第二个基准物品作为新物品,追加到标签页的末尾,所对应的条目也移动到了最后。

资源包自定义折叠条目(附带模组配置说明)-第6张图片

资源包自定义折叠条目(附带模组配置说明)-第7张图片

至于哪个在先,哪个在后,(应该)取决于文件加载顺序。但似乎不是文件名升序,可能是降序,有待考究。


碎片条目(sharded_entries)

例 5(assets/ctidy/condensed_entries/test5.json)

{
  "minecraft:natural_blocks": {
    "ctidy:sculk_things": {
      "title": "古城方块"
    }
  },
  "minecraft:redstone_blocks": {
    "ctidy:sculk_things": {}
  },
  "sharded_entries": {
    "ctidy:sculk_things": {
        "title": "幽匿装置",
        "base_item": "minecraft:sculk_shrieker",
        "items": [
            "minecraft:sculk_shrieker",
            "minecraft:sculk_sensor"
        ]
    }
  }
}

如果想要给多个标签页添加同一个条目,则可以使用 碎片条目(sharded_entries)。碎片条目与标签页对象十分类似,同样定义在顶层,同样接受多个折叠条目对象。而使用碎片条目跟添加普通的折叠条目一样,在标签页对象中引用即可,条目 ID 需一致。

例 5 中,我们定义了名为 ctidy:sculk_things 的碎片条目,并在上面的 natural_blocks(自然方块)与 redstone_blocks(红石方块)中同时使用了该条目。在“自然方块”中,我们还重写了碎片条目原有的标题。游戏内效果:

资源包自定义折叠条目(附带模组配置说明)-第8张图片

资源包自定义折叠条目(附带模组配置说明)-第9张图片

碎片条目有几点需要注意:

  1. 碎片条目的物品条目定义不能被重写,即 物品标签、方块标签或物品列表只能在在碎片条目中定义。

  2. 在标签页对象中引用碎片条目时,如果不想重写任何配置项,指定一个空对象({ })即可,如 例 5 的第 8 行。不能指定 null,否则无法解析。

  3. 碎片条目的作用域只有当前文件,即 不能跨文件引用。


添加不属于标签页的物品

例 6(assets/ctidy/condensed_entries/test6.json)

{
  "minecraft:ingredients": {
    "ctidy:copper_ingredients": {
      "title": "铜",
      "base_item": "minecraft:copper_ingot",
      "items": [
        "minecraft:raw_copper",
        "minecraft:raw_copper_block",
        "minecraft:copper_ingot",
        "minecraft:copper_block"
      ]
    }
  }
}

在折叠条目定义不属于标签页的物品,可以向标签页中添加该物品。原版的“原材料”标签页中没有 粗铜块(minecraft:raw_copper_block)和 铜块(minecraft:copper_block),但我们在 例 6 中定义了这两个方块。游戏内效果:

资源包自定义折叠条目(附带模组配置说明)-第10张图片

(没错,我写教程的时候发现 bug 了)


严格筛选(strict_filter) —— 筛除不属于标签页的物品

例 7(assets/ctidy/condensed_entries/test7.json)

{
  "minecraft:ingredients": {
    "ctidy:iron_ingredients": {
      "title": "铁",
      "strict_filter": true,
      "base_item": "minecraft:iron_ingot",
      "items": [
        "minecraft:raw_iron",
        "minecraft:raw_iron_block",
        "minecraft:iron_nugget",
        "minecraft:iron_ingot",
        "minecraft:iron_block"
      ]
    }
  }
}

与 例 6 类似,但多了第 5 行 严格筛选(strict_filter)。该项默认为 false,与 例 6 效果一致。设为 true 后,如果所添加的物品不属于该标签页,则条目中不会出现。所以,例 7 中定义的 粗铁块(minecraft:raw_iron_block)和 铁块(minecraft:iron_block)最终不会出现在条目中。游戏内效果:

资源包自定义折叠条目(附带模组配置说明)-第11张图片



物品顺序(entry_order)

例 8(assets/ctidy/condensed_entries/test8.json)

{
  "minecraft:tools_and_utilities": {
    "ctidy:pickaxes_desc": {
      "title": "镐",
      "entry_order": "DEFAULT",
      "base_item": "minecraft:wooden_pickaxe",
      "items": [
        "minecraft:netherite_pickaxe",
        "minecraft:diamond_pickaxe",
        "minecraft:golden_pickaxe",
        "minecraft:iron_pickaxe",
        "minecraft:stone_pickaxe",
        "minecraft:wooden_pickaxe"
      ]
    }
  }
}

物品顺序(entry_order)只支持两种字符串:"ITEMGROUP" 或 "DEFAULT",默认为 "DEFAULT"。

当指定为 "DEFAULT" 时,条目内的物品按添加顺序 / 标签内的定义顺序排列。

当指定为 "ITEMGROUP" 时,条目内的物品将按照标签页内的顺序排列。

实际上可以自定义排序方式,但需要通过代码 API 方式添加,资源包方式不支持。

例 8 在第 5 行指定物品顺序为 "DEFAULT"(当然,"DEFAULT" 是默认行为,本无需额外指定,此处用于示例),于是所添加的物品将按照添加顺序排列。游戏内效果(标签页原先是按照木、石、铁、金、钻石、下界合金的顺序):

资源包自定义折叠条目(附带模组配置说明)-第12张图片


物品比较方式(item_comparison)

物品比较方式(item_comparison)为一个布尔值,默认为 false,表示比较两个物品时会考虑两者的 NBT(1.21 后为组件)。设为 true 后,则只考虑两者是否为同一个物品(等价于物品 ID 是否相同)。

实际上,通过资源包方式添加的折叠条目,其所定义物品一般是不带 NBT 的,因而该配置项的用处不大,也就不做示例了。除非在代码中某个物品的默认物品堆(ItemStack)具有 NBT,如一些 mod 自带附魔的武器、工具。


标签页子页

Mod 在 Fabric 端联动了 owo-lib,继而支持为创造模式标签页的子页添加折叠条目。(当然,Forge 端保留了这部分 API,但需要额外代码去适配)

由于这部分本身就涉及到代码,本教程不详述,具体见 github wiki。


模组配置详解

mod 前置有 Cloth Config,因而支持游戏内热配置。

配置文件位于 <游戏版本名>/config/condensed_creative.json 。


Common - 一般设置

资源包自定义折叠条目(附带模组配置说明)-第13张图片

界面配置名配置文件 key 值描述默认值
Enable Builtin EntriesdefaultCCGroups是否启用 mod 内置的折叠条目true
Builtin Per Entry ConfigdefaultEntriesConfig
对几项特殊的内置折叠条目进行配置/
Enchantment BooksenchantmentBooks

附魔书折叠条目设置

指定字符串,三选一

"NONE" - 不折叠

"SINGLE_GROUP"- 所有附魔书折叠在一起

"SEPARATE_COLLECTIONS" - 按附魔种类分类折叠

"SINGLE_GROUP"
Tipped ArrowstippedArrows

药水箭折叠条目设置

基本同上

"SEPARATE_COLLECTIONS" - 按药水种类分类折叠

"SINGLE_GROUP"
Potionspotions

药水折叠条目设置

同上

"SINGLE_GROUP"


Common - 客户端设置

资源包自定义折叠条目(附带模组配置说明)-第14张图片

界面配置名配置文件 key 值描述默认值
Enable Condensed Entry Rotation PreviewrotationPreview
折叠条目图标是否循环变化true
Enable Entry Refresh Button
entryRefreshButton

在创造模式物品栏界面的右下角添加一个刷新按钮

一般用于物品发生渲染问题时的调试

false
Enable Entry Background Coloring
entryBackgroundColor

折叠条目展开时是否加深条目内的槽位背景色

不推荐关闭,容易分不清条目是否展开

true
Enable Entry Border Coloring
entryBorderColor

折叠条目展开时是否为整个条目绘制额外的边框

不推荐关闭,容易分不清条目是否展开

true
Condensed Entry Border Coloring
condensedEntryBorderColor

折叠条目展开时边框的颜色

RGBA 值(即包含 alpha 通道)

-1069634569

对应十六进制 c03eabf7


Common - 调试信息设置

资源包自定义折叠条目(附带模组配置说明)-第15张图片

界面配置名配置文件 key 值描述默认值

Enable Tag Tooltip

tagPreviewForEntries

如果折叠条目的物品由标签所定义,是否在 tooltip 中显示 标签 ID

true
Enable Internal Identifier Tooltip
debugIdentifiersForEntries

是否在 tooltip 中显示折叠条目 ID

在自定义折叠条目时非常有用

false