Audio
概述
Audio 在 Minecraft 声音之上增加了一个小型调音台。通过该扩展播放的每个声音都属于五个层之一:MASTER、MUSIC、AMBIENT、SFX 和 VOICE。每位玩家对每一层都有一个音量(从 0.0 到 1.0),扩展在播放声音时会把该层音量乘以主音量。音量按玩家保存,因此设置在重新连接后依然有效。
在调音台之上,你还可以获得与 Protection 区域绑定的环境音区域、定时的声音序列、会根据某个 fact 作出反应的动态音乐轨道、用于对话的“打字语音”配置,以及供玩家调整自己音量的游戏内菜单。
该扩展运行于 TypeWriter 的 BTC 构建版(BTC Core,Paper/Folia),此处的文档仅供参考。菜单条目基于 GUI 扩展构建。
功能
- 五个音频层 —
MASTER、MUSIC、AMBIENT、SFX和VOICE,每个层都有各自的按玩家音量。 - 保存音量 — 一个 Player Audio Volume artifact 存储每位玩家的设置。
- 环境音区域 — 当玩家站在某个 Protection 区域内时播放声音,区域重叠时按优先级处理。
- 声音序列 — 通过一个动作,按选定的延迟依次播放多个声音。
- 动态音乐 — 启动一个基础轨道,并根据某个 fact 的值开关额外的音乐层。
- 对话语音 — 每输入一个字符播放一个声音,元音、标点和空格可分别使用不同声音,并带有随机的音高抖动。
- 音量动作 — 立即或以渐变方式为玩家设置某一层的音量。
- 设置菜单 — 一个让玩家提高、降低或静音每个层的 GUI,既可以作为独立菜单,也可以作为任意 GUI 页面中的按钮使用。
安装
- 安装 GUI 扩展:Audio 扩展基于它构建,并使用它的菜单系统来显示设置界面。
- 如果你想使用环境音区域,请安装 Protection 扩展并用它创建区域。
- 将 Audio 的 JAR 放入
plugins/Typewriter/extensions/,然后重启服务器。 - 照常播放你自己的声音:自定义声音来自你的资源包,扩展只通过声音 id 来播放它们。
快速上手
为一片森林区域添加循环风格的环境音,并给玩家提供一个音量菜单:
- 在 TypeWriter 网页面板中,使用 Protection 扩展创建一个区域,并记下它的条目 ID。
- 打开一个 static 页面,添加一个 Ambient Sound Zone 条目。
- 将
protectionRegionId设为该区域条目的 ID,选择sound,并保持layer为AMBIENT。 - 在一个 manifest 页面上添加一个 Player Audio Volume artifact,以便保存音量。
- 添加一个 Audio Settings Menu 动作。在
layoutPool中构建它的布局,设置mainLayoutId,并放置标签为audio_button:AUDIO_LAYER:MASTER、audio_button:AUDIO_LAYER:MUSIC等的物品(层名称使用大写书写)。 - 添加一个 Open Audio Settings 动作,在
menu中指向该菜单,并通过 NPC 对话选项、命令或物品来触发它。 - 发布,走进该区域,然后打开菜单并测试音量。
不支持淡入淡出。Minecraft 无法更改已经在播放的声音的音量,因此 fadeIn 和 fadeOut 不起任何作用:声音以完整音量开始,并立即停止。这些字段仍保留在区域、序列和对话配置上,但无论取何值都不会改变任何东西。同样,looping 尚未实现:声音只播放一次,不会重复,因此请为该区域使用足够长的声音。
工作原理
环境音区域、声音序列、对话配置和 Dynamic Music Track 都会经过调音台,因此它们会遵循玩家对其所属层的音量。声音直接以最终音量开始:声音自身的音量,乘以层音量(含主音量),再乘以条目自己的系数(环境音区域的 zoneVolume,序列片段的 volumeOverride)。由于 Minecraft 无法更改已在播放的声音的音量,之后修改的层音量只对修改之后开始播放的声音生效。
菜单
Audio Settings Menu 是一个 GUI 条目。它的字段(inventoryTitle、inventoryRows、guiType、layoutPool、mainLayoutId、audio)与 GUI 扩展中的作用相同。Audio 增加了特殊按钮:给布局中的物品添加 audio_button: 标签,后面跟上按钮类型。
| 按钮类型 | 作用 |
|---|---|
AUDIO_LAYER:<LAYER> | 显示该层(例如 AUDIO_LAYER:MASTER)的图标、百分比和一个十格的进度条。左键点击增加 10%,右键点击减少 10%,Shift + 左键点击则静音或恢复该层。 |
AUDIO_CLOSE | 关闭菜单。 |
该标签按 audio_button:<TYPE>:<LAYER> 的格式读取。实际使用时,应当使用的是 AUDIO_LAYER:<LAYER> 这个按钮。AUDIO_VOLUME_UP、AUDIO_VOLUME_DOWN 和 AUDIO_LAYER_MUTE 这几种类型同样能被识别,但只有当层以同样的方式给出时它们才会起作用(例如 audio_button:AUDIO_VOLUME_UP:MUSIC),并且此时它们的渲染效果与 AUDIO_LAYER:MUSIC 完全相同:三种点击始终都可用。
这些按钮会注册到每一个 GUI 页面,因此你可以把它们放在通用的“设置”菜单中,而不仅限于 Audio Settings Menu。生成的层物品使用法语的显示名称和 lore(“Volume general”、“Musique”、“Clic gauche”);这些文本在扩展中是固定的。
玩家通过一个在启动时注册、名为 audio_button 的内部命令来更改音量。它并非用于手动输入,并且自身没有权限检查。
配置
该扩展没有配置文件。音量通过 Player Audio Volume artifact 存储(artifactId 默认为 player_audio_volumes)。更改会在最后一次修改约五秒后写入,并在 TypeWriter 卸载时再次写入。如果已发布的页面中没有这个 artifact,音量只会存在于内存中,玩家离开后就会丢失。
条目
8 个条目,由扩展源码生成。
动作5
- Audio Settings MenuAudio Settings Menu
- Dynamic Music TrackMusic track that reacts to game facts
- Open Audio SettingsOpen Audio Settings Menu
- Set Master VolumeSet the master or layer volume for a player
- Sound SequenceA sequence of sounds to play
构件1
- Player Audio Volume ArtifactStores per-player audio layer volumes
定义2
- Ambient Sound ZonePlay ambient sound in a region
- Dialogue Audio ProfileAudio profile for dialogue typing sounds
故障排查
环境音区域没有播放任何声音。 该区域会与 protectionRegionId(来自 Protection 扩展的区域 ID)进行匹配。只有当 protectionRegionId 为空时才会读取 worldGuardRegionId,并且需要 WorldGuard 插件;两者都没有的区域永远不会匹配。同时检查 sound 是否为空,以及玩家是否确实在区域内跨越了方块边界,因为区域是在玩家移动到另一个方块时检查的。
对话语音始终不播放。 只有当说话者的 sound 指向一个其 ID 即为该配置的 ID,并且该条目同时也能作为声音 ID 条目被找到时,监听器才会启动。Dialogue Audio Profile 条目是一个普通的 static 条目,因此在依赖它之前,请先用一段简短的对话进行测试。文本为空或时长为零的对话会被跳过。
重新连接后音量更改丢失。 请在已发布的页面中添加一个 Player Audio Volume artifact。没有它,什么都不会被保存。
菜单按钮没有反应,并且显示为普通物品。 标签必须以 audio_button: 开头,并以大写书写的层名称结尾,例如 audio_button:AUDIO_LAYER:SFX。没有有效的层时,该物品会保持你所配置的样子。
设置菜单打不开。 该菜单基于 GUI 扩展构建。请确保已安装它,并且 Open Audio Settings 动作设置了 menu 字段。
相关扩展
- GUI — 设置菜单所使用的菜单布局和物品。
- Protection — 驱动环境音区域的区域。