自定义画和唱片需要两个包,其中一个安装失败是常见问题
数据包注册内容;资源包提供纹理和声音。只有数据包,内容注册了却什么也显示不出来。另外还有4x4的尺寸限制,以及唱片长度并非只是装饰。
画和音乐唱片在现代 Java 版中都是真正的注册表项,这意味着你可以添加它们,而不是替换原版内容。你添加的任何内容都不会取代现有的画或唱片。
问题在于,内容被分成了两种不同的包类型,而且每种单独使用都毫无用处。
各自的作用
数据包注册内容:
data/<ns>/painting_variant/<id>.json asset_id, width, height, title, author
data/<ns>/jukebox_song/<id>.json sound_event, description, length, comparator
资源包提供你看到和听到的内容:
assets/<ns>/textures/painting/<id>.png
assets/<ns>/sounds/<id>.ogg
assets/<ns>/sounds.json
如果只安装数据包,内容会成功注册——它存在,/give 也能找到它,但就是没有纹理和音频。这比直接失败更令人困惑,也是自定义画“不工作”的常见原因。本页上的工具将两者打包在一个 zip 文件中,正是为了防止它们被分开。
请注意这两个 pack.mcmeta 文件。它们是独立的包,拥有独立的身份;没有能同时包含两者的组合格式。
注册 ID 比文件名更严格
ID 只能包含 a-z、0-9、_、. 和 -。任何其他字符都会导致包加载失败——不是损坏的那一个条目,而是整个包。大写字母和空格是两个常见的陷阱,因为它们在拖入的文件名中都非常普通。
画:从 1×1 到 4×4
原版画的尺寸从 1×1 到 4×4 格不等,共有十六种可能的形状。超出此范围的变体仍然可以渲染——游戏不会拒绝它——但它无法挂在玩家期望尺寸的墙上,因此在正常建造中实际上无法放置。
尺寸在 JSON 中以 width 和 height(以格为单位)声明。它不是从 PNG 推断出来的,所以一个纹理是方形的 3×1 画是一个有效文件,但会拉伸显示。
唱片长度并非只是标签
length_in_seconds 驱动着两件事:唱片机的时间,以及比较器斜坡——比较器从正在播放的唱片机读取的信号会随着唱片声明的持续时间而上升。
因此,不准确的长度并非只是外观上的错误。如果将一首 200 秒的曲目声明为 100 秒,比较器会在中途完成其斜坡,这会悄无声息地破坏任何与唱片结束相关的红石电路。正是出于这个原因,此工具会从文件中读取实际持续时间,而不是要求你手动输入。
曲目也以 "stream": true 写入 sounds.json。音乐很长,在播放前将整个曲目加载到内存中会导致卡顿——流式传输是任何唱片长度内容的正确默认设置,但对于短音效来说则是错误的。