无需替换原版即可添加自定义画和音乐唱片
画和音乐唱片现在都是数据包注册表,因此你可以新增而不是覆盖原版内容。以下是它们各自需要的两个文件,以及画必须遵循的尺寸比例规则,画作只需要两个文件,音乐唱片则需要三个文件,各自的注册表彼此相互独立运作,互不影响。
过去要获得自定义画,只能覆盖 paintings_kristoffer_zetterstrand.png,代价是失去一幅原版画。现在画和音乐唱片都是注册表 (registry),所以你是在新增,而不是替换。
画需要两个文件
一个定义画的数据包条目:
data/<namespace>/painting_variant/my_art.json
{
"asset_id": "my_pack:my_art",
"width": 2,
"height": 2,
"title": { "text": "My Art" },
"author": { "text": "Me" }
}
以及一个提供图像的资源包:
assets/my_pack/textures/painting/my_art.png
width 和 height 的单位是方块,纹理必须符合这个比例。原版每方块绘制 16 像素,所以一幅 2×1 的画是 32×16——但 64×32 也完全没问题。比例不对就会被拉伸,没有自动适配。
原版尺寸从 1×1 到 4×4。更大的尺寸也能用,但需要相应大小的墙面。
让它能获得
只添加变体并不会让它出现在游戏里。有两条途径:
- 放置标签——把它加入
#minecraft:placeable,这样普通的画物品就能随机变成它。 - 直接指定——
/give @p painting[entity_data={id:"minecraft:painting",variant:"my_pack:my_art"}]
大多数地图作者想要第二种:一幅特定的画,而不是随机的。
音乐唱片需要三个
data/<namespace>/jukebox_song/my_song.json
{
"sound_event": { "sound_id": "my_pack:music/my_song" },
"description": { "text": "My Artist - My Song" },
"length_in_seconds": 154,
"comparator_output": 12
}
再加上把该声音 id 映射到文件的 sounds.json,以及 .ogg 本身:
assets/my_pack/sounds.json
assets/my_pack/sounds/music/my_song.ogg
有三个细节很重要:
length_in_seconds必须正确。 它决定唱片机何时停止——粒子、红石输出,以及音频都会在该点被切断。太长会导致结尾静音;太短会把曲目截断。comparator_output取值 0–15,是比较器读取的值。原版有 22 张唱片却只有 15 个值,所以已经有七对共用同一个值;请选一个你的红石电路无需区分的唱片都没用到的值。- 以流式播放 ogg。 对于音乐长度的音频,在
sounds.json中设置"stream": true。
然后给它:
/give @p music_disc_13[jukebox_playable="my_pack:my_song"]
任何唱片物品都可以作为载体——决定播放内容的是组件。
为什么这比覆盖更好
替换原版资源的资源包会与所有做同样事情的资源包冲突,而且当 Mojang 重命名文件时就会失效。注册表新增的内容带有命名空间,所以两个添加画的资源包可以共存。这也是唯一一种在版本更新后无需修改就能继续使用的方法。
用 自定义内容包生成器 把画变体、唱片机歌曲、图腾和聊天表情打包进一个现成的资源包 zip。