本篇教程由作者设定使用 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 使用的就是物品标签,游戏内效果:
例 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),则没有描述文本。
游戏内效果:
考虑到我们一般用中文,但 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,就是指定方块标签了。游戏内效果:
物品列表(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)等。游戏内效果:
重复物品
仔细观察下 例 3 和 例 4,你会发现我们指定了同一个基准物品,即 橡木原木(minecraft:oak_log)。实际上,原版本身就支持在标签页内添加多个相同物品。于是,第二个基准物品作为新物品,追加到标签页的末尾,所对应的条目也移动到了最后。
至于哪个在先,哪个在后,(应该)取决于文件加载顺序。但似乎不是文件名升序,可能是降序,有待考究。
碎片条目(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(红石方块)中同时使用了该条目。在“自然方块”中,我们还重写了碎片条目原有的标题。游戏内效果:
碎片条目有几点需要注意:
碎片条目的物品条目定义不能被重写,即 物品标签、方块标签或物品列表只能在在碎片条目中定义。
在标签页对象中引用碎片条目时,如果不想重写任何配置项,指定一个空对象({ })即可,如 例 5 的第 8 行。不能指定 null,否则无法解析。
碎片条目的作用域只有当前文件,即 不能跨文件引用。
添加不属于标签页的物品
例 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 中定义了这两个方块。游戏内效果:
(没错,我写教程的时候发现 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)最终不会出现在条目中。游戏内效果:
物品顺序(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" 是默认行为,本无需额外指定,此处用于示例),于是所添加的物品将按照添加顺序排列。游戏内效果(标签页原先是按照木、石、铁、金、钻石、下界合金的顺序):
物品比较方式(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 - 一般设置
界面配置名 | 配置文件 key 值 | 描述 | 默认值 |
---|---|---|---|
Enable Builtin Entries | defaultCCGroups | 是否启用 mod 内置的折叠条目 | true |
Builtin Per Entry Config | defaultEntriesConfig | 对几项特殊的内置折叠条目进行配置 | / |
Enchantment Books | enchantmentBooks | 附魔书折叠条目设置 指定字符串,三选一 "NONE" - 不折叠 "SINGLE_GROUP"- 所有附魔书折叠在一起 "SEPARATE_COLLECTIONS" - 按附魔种类分类折叠 | "SINGLE_GROUP" |
Tipped Arrows | tippedArrows | 药水箭折叠条目设置 基本同上 "SEPARATE_COLLECTIONS" - 按药水种类分类折叠 | "SINGLE_GROUP" |
Potions | potions | 药水折叠条目设置 同上 | "SINGLE_GROUP" |
Common - 客户端设置
界面配置名 | 配置文件 key 值 | 描述 | 默认值 |
---|---|---|---|
Enable Condensed Entry Rotation Preview | rotationPreview | 折叠条目图标是否循环变化 | 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 - 调试信息设置
界面配置名 | 配置文件 key 值 | 描述 | 默认值 |
---|---|---|---|
Enable Tag Tooltip | tagPreviewForEntries | 如果折叠条目的物品由标签所定义,是否在 tooltip 中显示 标签 ID | true |
Enable Internal Identifier Tooltip | debugIdentifiersForEntries | 是否在 tooltip 中显示折叠条目 ID 在自定义折叠条目时非常有用 | false |