ZeroDev Sound 文档
ZeroDev Sound:安装指南
本资源不包含也不提供任何第三方音频或音乐集成。音乐仅从服务器所有者添加到资源中的音频文件以及 GTA 内置电台播放。玩家无法输入链接。请只添加你自己拥有、或有权使用和分发的音频;未经许可对内容进行流媒体传输,可能违反 Cfx.re Creator Platform License Agreement 和法律。
玩家可以购买、携带、摆放和互联的音箱,以及玩家装进自己车里的车载音响。这是完整的参考文档。简短版本请看 docs/SETUP.md(5 步);遇到问题请看 docs/TROUBLESHOOTING.md;从 1.x 升级请看 UPGRADING.md。
目录 1. 运行要求 2. 安装 3. 适用于你背包的物品 4. 首次启动:你应该看到什么 5. 最常修改的设置 6. 操作 7. 车载音响 8. 音乐来源 9. Pulse Phone 10. 警察、邻居和管理员 11. 语言 12. 故障排查 13. 更新
1. 运行要求
| 必需 | oxmysql。ZeroDev Sound 会在首次启动时自己建表;没有需要导入的 SQL 文件。 |
| 框架 | ESX Legacy、QBCore、Qbox,或无框架(standalone)。自动识别。 |
| 背包 | ox_inventory、qb-inventory(以及 ps- 和 lj-inventory)、qs-inventory、codem-inventory、core_inventory、origen_inventory、tgiann-inventory、ESX 背包,或无背包。自动识别。 |
| 可选 | ox_target 或 qb-target(没有的话,玩家会看到屏幕上的按键提示)。Pulse Phone 1.2.9 或更新(增加 Sound 应用和 Pulse Drive 上的车载音响)。麦克风需要 pma-voice:没有它也能拿起麦克风唱,但没有人能通过音箱听到。 |
别的都不需要:不需要 ox_lib,不需要 API key,不需要 Google 账户。
Linux 服务器
Linux 服务器:请使用 Recommended 服务器 artifact,而不是 Latest。在 FiveM 服务器下载页面(docs.fivem.net/docs/server-download/)选择 Linux 和 Recommended 更新分支。有一台使用最新 Linux artifact 的服务器在加载时崩溃(FXServer 打印了 /proc/self/maps 转储),换成推荐版 artifact 后就解决了。这是我们收到的唯一一份 Linux 报告;我们自己还没有在 Linux 服务器上运行过 ZeroDev Sound。
Linux 服务器:请使用 Recommended 服务器 artifact,而不是 Latest。在 FiveM 服务器下载页面(docs.fivem.net/docs/server-download/)选择 Linux 和 Recommended 更新分支。有一台使用最新 Linux artifact 的服务器在加载时崩溃(FXServer 打印了 /proc/self/maps 转储),换成推荐版 artifact 后就解决了。这是我们收到的唯一一份 Linux 报告;我们自己还没有在 Linux 服务器上运行过 ZeroDev Sound。
在 standalone 服务器(无框架)上一切免费:商店和车辆部件都不收费。
2. 安装
第 1 步:放入文件夹。把 zerodev-sound 文件夹放进你的 resources 文件夹(放在任意子文件夹中都可以,例如 resources/[zerodev]/zerodev-sound)。保持文件夹名为 zerodev-sound:ox_inventory 的物品条目通过这个名称调用它。
第 2 步:把它加入 server.cfg,放在数据库、框架和背包之后:
ensure oxmysql
ensure es_extended # or qb-core / qbx_core, or nothing on a standalone server
ensure ox_inventory # or your inventory
ensure ox_target # optional, or qb-target
ensure phone # optional: Pulse Phone
ensure zerodev-sound第 3 步:给你的管理员授予管理员权限(不限音箱数量、/soundadmin 列表、远程停止和移除):
add_ace group.admin zerodev.sound.admin allow第 4 步:为你的背包设置物品:见第 3 节。在 ESX 背包和 QBCore 上会自动完成。
第 5 步:重启服务器(完整重启,而不只是重启资源,这样每位玩家都会加载模型),然后检查控制台:见第 4 节。
3. 适用于你背包的物品
共有 12 个物品:十个音箱、麦克风架和维修包。
| 物品名称 | 标签 | 重量 |
|---|---|---|
zds_roam |
Roam 便携音箱 | 2 kg |
zds_room_shelf |
书架音箱 | 4 kg |
zds_room_tower |
落地音箱 | 10 kg |
zds_room_ceiling |
吸顶音箱 | 2 kg |
zds_room_sub |
家用低音炮 | 8 kg |
zds_stage_pa |
PA 音箱 | 10 kg |
zds_stage_sub |
演唱会低音炮 | 15 kg |
zds_stage_array |
线阵列音箱 | 12 kg |
zds_stage_monitor |
舞台监听音箱 | 6 kg |
zds_stage_mixer |
DJ 调音台 | 5 kg |
zds_stage_mic |
麦克风架 | 3 kg |
zds_repair_kit |
音箱维修包 | 0.6 kg |
图片在 zerodev-sound/web/img/items/ 中。你永远不用猜:只要有东西缺失,服务器控制台就会打印适用于你背包的确切条目,并点名任何尚未放好的图片。
你用的是哪种背包?
| 背包 | 你要做的 | 图片放到 |
|---|---|---|
| ESX 背包(不带 ox 的 ESX Legacy) | 无需操作。物品会在启动时添加到 items 表中。 |
无需复制 |
| ox_inventory(ESX、Qbox 或 standalone) | 把ox_inventory 配置块粘贴到 ox_inventory/data/items.lua 的表内。先重启 ox_inventory,再重启 zerodev-sound。 |
无需复制:条目会从 zerodev-sound 加载图片 |
| qb-inventory、ps-inventory、lj-inventory(QBCore) | 无需操作。物品会在启动时添加到 QBCore 的共享物品中。 | 把 web/img/items/*.png 复制到 <your inventory>/html/images/ |
| qs-inventory | 在 QBCore 上,把QBCore 配置块粘贴到 qb-core/shared/items.lua 中。在 ESX 上,把同样的条目粘贴到 qs-inventory/shared/items.lua 中。 |
qs-inventory/html/images/ |
| codem-inventory | 把这 12 个物品添加到 codem-inventory/config/itemlist.lua 中,名称、标签和重量取自 QBCore 配置块。在 QBCore 上,还要完成 codem-inventory 自己的安装步骤,把 QBCore.Functions.UseItem 指向 codem-inventory,否则物品无法使用。 |
codem-inventory 的物品图片文件夹 |
| core_inventory | 无需操作。物品会自动添加到 QBCore 的共享物品或 ESX 的 items 表中。 |
core_inventory 的物品图片文件夹 |
| origen_inventory | 把这 12 个物品添加到 origen_inventory/config/items.lua 中,名称、标签和重量取自 QBCore 配置块。 |
origen_inventory 的物品图片文件夹 |
| tgiann-inventory | 把这 12 个物品添加到 tgiann-inventory/items/items.lua 中,名称、标签和重量取自 QBCore 配置块。 |
inventory_images/images/ |
| 无背包 | 无需操作。买来的和收起的音箱会在 /sound 的 Your speakers 下等待,带有 Set up 按钮。 |
无需复制 |
如果想手动把物品添加到 qb-core,而不是让脚本自动添加,请把QBCore 配置块粘贴到 qb-core/shared/items.lua 中。
其他沿用这些 API 之一的背包:把 Config.Inventory 设为对应的那个(见第 5 节)。自研背包可以在 server/bridge.lua 中接入,该文件可读:其中每种背包只有三个小函数(数量、添加、移除)。
ox_inventory 配置块
粘贴到 return { ... } 表内(位于 ox_inventory/data/items.lua):
['zds_repair_kit'] = { label = 'Speaker Repair Kit', weight = 600, stack = false, close = true, description = 'Fixes a broken speaker. Use it next to one.',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_repair_kit.png' } },
['zds_roam'] = { label = 'Roam Portable Speaker', weight = 2000, stack = false, close = true, description = 'Portable speaker with twin bass radiators. Carry it or set it down.',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_roam.png' } },
['zds_room_ceiling'] = { label = 'Ceiling Speaker', weight = 2000, stack = false, close = true, description = 'Indoor. Round ceiling or wall speaker for background music in a business.',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_room_ceiling.png' } },
['zds_room_shelf'] = { label = 'Shelf Speaker', weight = 4000, stack = false, close = true, description = 'Indoor. Bookshelf speaker: link several around a home or shop.',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_room_shelf.png' } },
['zds_room_sub'] = { label = 'Home Subwoofer', weight = 8000, stack = false, close = true, description = 'Indoor. Cube subwoofer: link it to your indoor speakers for deep bass.',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_room_sub.png' } },
['zds_room_tower'] = { label = 'Tower Speaker', weight = 10000, stack = false, close = true, description = 'Indoor. Floor-standing tower with two woofers: deep, clean sound for a whole room.',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_room_tower.png' } },
['zds_stage_array'] = { label = 'Line Array Speaker', weight = 12000, stack = false, close = true, description = 'Concert. Line-array speaker for long throw over a big crowd. Stack them.',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_stage_array.png' } },
['zds_stage_mic'] = { label = 'Mic Stand', weight = 3000, stack = false, close = true, description = 'Concert. A mic on a boom stand: link it to your concert speakers, stand at it and sing through them (/soundmic).',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_stage_mic.png' } },
['zds_stage_mixer'] = { label = 'DJ Mixer', weight = 5000, stack = false, close = true, description = 'Concert. Not a speaker: whoever stands at it runs every linked concert speaker (volume, bass, sound, timing).',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_stage_mixer.png' } },
['zds_stage_monitor'] = { label = 'Stage Monitor', weight = 6000, stack = false, close = true, description = 'Concert. Wedge monitor so the DJ or band hears the mix on stage.',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_stage_monitor.png' } },
['zds_stage_pa'] = { label = 'PA Speaker', weight = 10000, stack = false, close = true, description = 'Concert. Powered 15" PA top on a tripod: link many for an event.',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_stage_pa.png' } },
['zds_stage_sub'] = { label = 'Concert Subwoofer', weight = 15000, stack = false, close = true, description = 'Concert. Double 18" sub cabinet: the bass you feel at a show.',
client = { export = 'zerodev-sound.useItem', image = 'nui://zerodev-sound/web/img/items/zds_stage_sub.png' } },QBCore 配置块
QBCore 物品格式,qb-、ps-、lj- 和 qs-inventory 都能读取:
['zds_repair_kit'] = { name = 'zds_repair_kit', label = 'Speaker Repair Kit', weight = 600, type = 'item', image = 'zds_repair_kit.png', unique = true, useable = true, shouldClose = true, description = 'Fixes a broken speaker. Use it next to one.' },
['zds_roam'] = { name = 'zds_roam', label = 'Roam Portable Speaker', weight = 2000, type = 'item', image = 'zds_roam.png', unique = true, useable = true, shouldClose = true, description = 'Portable speaker with twin bass radiators. Carry it or set it down.' },
['zds_room_ceiling'] = { name = 'zds_room_ceiling', label = 'Ceiling Speaker', weight = 2000, type = 'item', image = 'zds_room_ceiling.png', unique = true, useable = true, shouldClose = true, description = 'Indoor. Round ceiling or wall speaker for background music in a business.' },
['zds_room_shelf'] = { name = 'zds_room_shelf', label = 'Shelf Speaker', weight = 4000, type = 'item', image = 'zds_room_shelf.png', unique = true, useable = true, shouldClose = true, description = 'Indoor. Bookshelf speaker: link several around a home or shop.' },
['zds_room_sub'] = { name = 'zds_room_sub', label = 'Home Subwoofer', weight = 8000, type = 'item', image = 'zds_room_sub.png', unique = true, useable = true, shouldClose = true, description = 'Indoor. Cube subwoofer: link it to your indoor speakers for deep bass.' },
['zds_room_tower'] = { name = 'zds_room_tower', label = 'Tower Speaker', weight = 10000, type = 'item', image = 'zds_room_tower.png', unique = true, useable = true, shouldClose = true, description = 'Indoor. Floor-standing tower with two woofers: deep, clean sound for a whole room.' },
['zds_stage_array'] = { name = 'zds_stage_array', label = 'Line Array Speaker', weight = 12000, type = 'item', image = 'zds_stage_array.png', unique = true, useable = true, shouldClose = true, description = 'Concert. Line-array speaker for long throw over a big crowd. Stack them.' },
['zds_stage_mic'] = { name = 'zds_stage_mic', label = 'Mic Stand', weight = 3000, type = 'item', image = 'zds_stage_mic.png', unique = true, useable = true, shouldClose = true, description = 'Concert. A mic on a boom stand: link it to your concert speakers, stand at it and sing through them (/soundmic).' },
['zds_stage_mixer'] = { name = 'zds_stage_mixer', label = 'DJ Mixer', weight = 5000, type = 'item', image = 'zds_stage_mixer.png', unique = true, useable = true, shouldClose = true, description = 'Concert. Not a speaker: whoever stands at it runs every linked concert speaker (volume, bass, sound, timing).' },
['zds_stage_monitor'] = { name = 'zds_stage_monitor', label = 'Stage Monitor', weight = 6000, type = 'item', image = 'zds_stage_monitor.png', unique = true, useable = true, shouldClose = true, description = 'Concert. Wedge monitor so the DJ or band hears the mix on stage.' },
['zds_stage_pa'] = { name = 'zds_stage_pa', label = 'PA Speaker', weight = 10000, type = 'item', image = 'zds_stage_pa.png', unique = true, useable = true, shouldClose = true, description = 'Concert. Powered 15" PA top on a tripod: link many for an event.' },
['zds_stage_sub'] = { name = 'zds_stage_sub', label = 'Concert Subwoofer', weight = 15000, type = 'item', image = 'zds_stage_sub.png', unique = true, useable = true, shouldClose = true, description = 'Concert. Double 18" sub cabinet: the bass you feel at a show.' },如果你在 config/catalogue.lua 中修改了标签、价格或重量,请改为从你自己的控制台复制条目:它会根据你的设置打印。
4. 首次启动:你应该看到什么
在服务器控制台中
ZeroDev Sound 会打印一个检查框(在服务器控制台输入 soundcheck 可再次打印):数据库和结构、框架、金钱、背包和物品、车库表、交互目标、Pulse Phone、模型、改装间,以及在游戏内修改过的设置。每一行不是 OK 的都会说明该怎么做;docs/SETUP.md 中有示例,docs/TROUBLESHOOTING.md 解释了每一行。
- 框架一行会显示找到了什么。如果不对,请设置
Config.Framework或Config.Inventory(位于config/config.lua)。 - 一行黄色的
Add these to ox_inventory/data/items.lua ...(或... if these items are not in ... yet, add them),后面跟着物品条目:按照第 3 节为你的背包操作,然后重启。物品添加后,ox_inventory 的提示就会消失。在 qs-、codem-、origen- 和 tgiann-inventory 上,无论你是否已添加,每次启动都会打印这些条目作为提醒。 - 一行黄色的
Copy zds_....png from zerodev-sound/web/img/items into ...:这些图片还不在你背包的图片文件夹中。它会点名该文件夹。 Pulse Phone app not registered: ...:Pulse Phone 在运行,但拒绝了该应用。见第 9 节。
在游戏内(五项检查)
- 地图上 Legion Square 有一个 ZeroDev Sound 图标,Benny's 有一个 Car audio bay 图标。
- 在商店里,一名店员站在展示音箱的柜台旁。对准店员(没有 target 资源时按 E),购买一个 Roam Portable Speaker。
- 从背包中使用它。它会出现在你手中。按 E,打开 Library,播放 Night Drive(脚本附带的演示曲目)。你周围的人都能听到。
- 坐进一辆车。最初几次,屏幕角落会提示哪个键打开车载音响(默认为 K)。
- 以司机身份把车开进车载音响改装间,按 E。安装界面会在你的车上打开。
5. 最常修改的设置
在游戏内:/soundadmin > Settings 可以为所有人实时修改常用设置(改装间、谁可以安装、哪些车辆、价格、最大音量、安静时段、限制、商店、警察和损坏)。这些设置保存在数据库中,并优先于 config.lua,直到你在面板中按 Reset to config。
除非另有说明,所有设置都在 config/config.lua 中。产品、价格和车辆部件在 config/catalogue.lua 中;每辆车的原厂音效在 config/vehicles.lua 中。
| 你想做的 | 设置 |
|---|---|
| 强制指定框架或背包 | Config.Framework (auto, esx, qb, qbox, standalone), Config.Inventory (auto, ox, qb, qs, codem, core, origen, tgiann, esx, none) |
| 修改遥控器命令 | Config.Command(默认 sound,即 /sound) |
| 修改车载音响按键 | Config.HeadUnitKey(默认 K)。玩家可以在 GTA 设置 > Key Bindings > FiveM 中自行重新绑定。 |
| 每位玩家的音箱数量 | Config.MaxPlacedPerPlayer(默认 8)。管理员没有限制。 |
| 一个联动组中的音箱数量 | Config.MaxLinkedPerGroup(默认 16) |
| 多近可以连接,多远可以控制 | Config.PairRange (15 m), Config.ControlRange (80 m) |
| 移动商店或添加更多商店 | Config.Shop.locations。每个位置包含 label、coords、blip,以及可选的 heading(柜台朝向)和 clerk(ped 模型)。Config.Shop.account 为 bank 或 cash。Config.Shop.enabled = false 会移除商店。 |
| 音箱价格 | 每个产品的 price,位于 config/catalogue.lua > Catalogue.Speakers。维修包价格为 Config.Damage.repairPrice。 |
| 在哪里安装车载音响 | Config.Install.bays(每个包含 label、coords、radius、blip)。默认:Benny's 一个改装间。 |
| 让车主在任何地方改装自己的车 | Config.Install.anywhere = true。会在车载音响上增加一个 Install 按钮,并增加 /caraudio 命令(Config.Install.command)。 |
| 哪些车辆可以改装 | Config.Install.vehicles:'owned'(默认)或 'any'。见第 7 节。 |
| 只允许技师安装 | Config.Install.anyone = false,并在 Config.Install.jobs 中列出职业(必须在岗)。 |
| 免费车辆部件 | Config.Install.chargeParts = false。Config.Install.account 为 bank 或 cash。 |
| 车辆部件价格和现成套装 | Catalogue.CarParts 和 Catalogue.CarKits(位于 config/catalogue.lua) |
| 车辆的原厂音效 | Vehicles.ByClass 和 Vehicles.ByModel(位于 config/vehicles.lua)(basic、premium、reference、bike、none) |
| 音乐库开关 | Config.Sources.library。参见第 8 节。 |
| 你自己的歌曲 | Config.Library(web/library/ 中的文件) |
| 安静时段 | Config.QuietHours = { enabled = true, from = 23, to = 7, maxVolume = 0.35 }(服务器本地时间) |
| 警察职业和权限 | Config.Police(见第 10 节) |
| 音箱被射击时损坏 | Config.Damage.enabled |
| 性能限制 | Config.Streaming.propRange(90 m 内绘制模型)、maxAudibleSessions(同时听到 6 首不同的歌)、maxMovingParts(每帧 24 个振膜动画) |
| 为支持排查输出更多控制台信息 | Config.Debug(排查问题时设为 true) |
物品名称。如果其他脚本已经使用了某个 zds_ 物品名称,请在 Catalogue.Speakers 中重命名该产品的键(例如 zds_roam = { ... }),然后在你的背包中使用新名称,并相应地重命名其图片。
6. 操作
| 项目 | 方法 |
|---|---|
| 打开遥控器 | /sound,或在音箱旁按 E,或使用 Pulse Phone 中的 Sound 应用 |
| 车载音响 | 坐在车里时按 K(可在 GTA 设置中重新绑定) |
| 放下音箱 | 使用它的物品。对准要放的位置:能放下的地方会显示绿色。鼠标滚轮或 Q / E 旋转。Enter 或鼠标左键放下;Backspace 或鼠标右键取消。 |
| 堆叠线阵列 | 放下时,Arrow Up / Arrow Down 可升高或降低 |
| 携带 Roam | 它会出现在你手中,边走边播放。E 音乐,G 放下,H 收起。上车或下水会自动收起。 |
| 移动或收起你拥有的音箱 | 对准它并选择 Move 或 Pack up;没有 target 资源时,站在它旁边:G 移动(对 Roam 来说是重新拿起),H 收起。遥控器的 Speakers 标签页也可以收起。 |
| 联动音箱 | 连接到你的某个音箱,打开遥控器的 Speakers 标签页,在附近你的其他音箱旁按 Link。手持音箱与手持音箱联动,室内与室内,演唱会与演唱会(分别在 40 m、60 m 和 250 m 范围内)。 |
| 车载音响安装界面 | 以司机身份把车开进改装间,按 E(或在开启随处改装时,点击车载音响上的 Install 按钮 / 输入 /caraudio)。拖动部件可让它在车身表面滑动,Alt + 拖动会让它在当前高度上平移(不吸附),Shift + 拖动会把它抬起,Q / E 或 Shift + 滚轮可旋转它。 |
| 通过音箱唱歌 | 在你所连接音箱的 DJ 调音台或麦克风架旁(商店有售,像音箱一样关联),或在车辆改装的麦克风架旁:/soundmic 拿起麦克风,再次输入 /soundmic 放回 |
| 举报音乐太吵 | /noise |
| 管理员列表 | /soundadmin |
| 发放物品(服务器控制台) | givespeaker <player id> <item name> |
| 烧坏一个低音炮来展示效果(工作人员) | 在车内使用 /soundblow,或在控制台中使用 soundblow <plate> |
遥控器里:Music(服务器的音乐库)、Queue(接下来播放、已保存的 播放列表)、Speakers(每个音箱的电源和音量、连接、收起)以及 Tune(六种音效模式、 三段均衡器、谁来选音乐、营业时间,以及用于演唱会设备的“Real distance”)。 谁来选音乐:Only me;Party,附近任何人都可以点歌,由所有者 批准;或 Anyone,附近的人可以播放、暂停、跳过、加入队列和拖动进度。Opening hours 会在两个时间点之间自动播放所有者的某个播放列表,适合商店或俱乐部。
麦克风(需要 pma-voice)。拿着麦克风时,该系统任意一个音箱附近的人都会通过音箱听到你的声音,带有扩音(PA)效果,音量与该音箱播放音乐的音量相同,传播距离也相同;离开调音台或麦克风架 4 m、断开连接或放回麦克风后,你的声音就恢复正常。只有系统的所有者(车辆的话还有管理员)可以通过它唱歌;给其他玩家 zds.mic ace 即可让他们使用任何系统。你的声音并不是从每个音箱的位置发出的:语音聊天无法把声音放到那里,所以音箱附近的人会以该音箱的音量听到你。设置:Config.Mic。
7. 车载音响
玩家如何改装
- 开进车载音响改装间(默认在 Benny's),以司机身份按 E。
- 从现成套装开始(Daily thump、Competition、Trunk wall、Sound quality、Clean and hidden),或自选部件:低音炮(8" 到 18")、箱体、功放、车门喇叭、高音头、喇叭座、假地板、面板、亚克力、电容、第二块电池、LED 灯带和主机。
- 把每个部件拖到车上的合适位置。低音炮会落入其箱体的开孔中。每个部件都可以选饰面(八种颜色),低音炮和喇叭还可以选网罩和灯圈。Mirror 把部件复制到另一侧;Fine position 以小步移动它。五个镜头视角:后备箱、车厢、侧面、前方、顶部。Size:低音炮有 8"、10"、12"、15" 和 18"(同一个箱体中的低音炮尺寸统一,箱体围绕它们构建,最多比原设计大或小 30%);车门喇叭有 5.25"、6.5" 和 6x9";其他部件可在 80% 到 130% 之间以 5% 为步长调整(主机为标准尺寸)。更大的箱体和面板更贵;调小的部件不收费。更大的喇叭振膜行程更大,更大的车门喇叭下潜更低。
- 按 Test system,在付款前听听改装后的效果。它会播放
Config.Library中的第一首歌(除非你改过,否则是附带的演示曲目)。 - 按 Install。只对车上新增的部件收费;上次安装保留下来的部件不会重复收费。
改装按车牌保存,车辆回来时改装就回来:无论来自哪个车库、扣押场还是重生。无需修改你的车库脚本。
玩家听到什么
- 每辆车都已按类别和车型配有原厂音效:4 喇叭系统、高级 10 喇叭系统或参考级 13 喇叭系统,摩托车上有导流罩喇叭;自行车、飞机和火车没有。安装的喇叭会替换离它最近的原厂喇叭;低音炮则是额外增加。
- 在车外,主要是低音能穿透车身。打开的车门、车窗和后备箱都会让更多声音朝各自朝向的一侧传出。
- 装了低音炮的车在停放或缓行时会随低音在弹簧上轻轻弹动(行驶时绝不会),车内每个人都能感受到冲击。
- 车载音响(K)有音量、低音炮音量、前后平衡和左右平衡。
- 低音炮如果在接近满音量下长时间远超其功放和额定功率驱动,就可能烧坏。车附近的每个人都会看到那个低音炮冒出一缕细烟,并听到一声闷响。烧坏的低音炮会停止振动,低音减弱,振膜一直保持烧焦状态,直到在改装间更换(新低音炮需要付费;清除痕迹不是免费维修)。工作人员可以演示:在车内使用
/soundblow,或在服务器控制台中使用soundblow <plate>。
哪些车辆可以改装(Config.Install.vehicles)
'owned'(默认):仅限你框架已拥有车辆表中的车(ESX 上为owned_vehicles,QBCore 和 Qbox 上为player_vehicles)。'any':也包括无人拥有的车(NPC 车、刷出的车、租赁车)。- 无论哪种设置,属于其他玩家的车仍归其所有:只有车主、
Config.Install.jobs中的在岗技师或管理员可以改动它。在 standalone 服务器上,所有车都算作已拥有。
车库、车牌和扣押场
- 车牌会去掉首尾空格并转为大写后再匹配,所以会补空格或改变大小写的车库仍能匹配上。
- 使用假车牌或改过车牌的车,在恢复其保存的车牌之前找不到自己的改装。
- 只存在于某个玩家屏幕上的车(车库预览、部分展厅车辆)永远无法改装:对其他人来说它们不是真正的车。
其他音响或车载音响脚本
ZeroDev Sound 是独立的资源,有自己的命令(/sound、/caraudio、...)、事件和车辆 state bag,所以它不会替换或改动其他脚本(在车内播放时,它只会关闭 GTA 自带的车载电台)。在同一辆车上同时运行两个车载音响脚本的情况尚未一起测试过:每辆车请只用一套音响。
8. 音乐来源
音乐只会从你添加到资源中的音频文件播放。玩家从你的列表中选择;无法 输入链接,也绝不会播放任何网址。请只添加你自己拥有、或有权使用和 分发的音频。
- 把 mp3 或 ogg 文件放进
zerodev-sound/web/library/,并在Config.Library中按{ title = '...', artist = '...', file = 'name.mp3' }的格式逐个列出。它们可以获得完整体验:3D 音效、房间 和墙壁、车内空间、音效模式、EQ,以及随真实低音律动的音锥。 Config.Sources.library = false会关闭音乐库。- 只要这个资源的歌曲没有在车里播放,GTA 自带的车载电台在任何车里仍然可用。
- 启动框会显示玩家可以选择多少首歌,并对每个被跳过的条目发出警告(
web/library/中 不是 mp3 或 ogg 的文件名)。 - 从 3.0.0 更新:原来是链接的已保存歌曲、最近播放的歌曲和播放列表条目将不再 显示或播放。音乐库中的歌曲仍然正常。
9. Pulse Phone
无需设置。当 Pulse Phone 在服务器上运行时(资源名称 phone,任一版本):
- 每部手机的主屏幕上都会有一个 Sound 应用。它与
/sound是同一个遥控器:连接音箱或车辆、选歌、控制整个联动组。玩家可以删除它,也可以从 App Hub 重新获取。 - 已连接的音箱或车辆正在播放的内容及剩余时间,会显示在 Island 和锁屏上。点一下即可打开 Sound 应用。
- Pulse Drive(Pulse 的车载屏幕,默认 F10)会显示你所坐车辆的音响:歌曲、艺人和封面,带播放、暂停、上一首、下一首和音量,以及一个打开 Sound 应用的 Open 按钮。这需要 Pulse Phone 1.2.9 或更新;旧版本只是不显示它。
没有手机的玩家使用 /sound 和 K,它们能做到应用能做的一切。
如果你重命名了手机的文件夹,请在 config/config.lua 中加入这一行并填上其名称:
Config.PulseResource = 'phone'10. 警察、邻居和管理员
| 项目 | 方法 | 设置 |
|---|---|---|
| 举报音乐太吵 | /noise 会把最近的正在播放的音箱(60 m 内)以闪烁图标的形式发送给在岗警察,持续 3 分钟。每位玩家每 2 分钟只能举报一次。 |
Config.Police.complaints, complaintRange |
| 关闭音箱 | 在岗警察:对准音箱 > Turn off (police),或遥控器的 Tune 标签页 > Police。距离 12 m 以内。 | Config.Police.canSilence, silenceMinutes (15) |
| 没收音箱 | 在岗警察,距离 4 m 以内:对准 > Seize (police),或 Tune > Police > Seize。音箱归该警员所有。 | Config.Police.canSeize |
| 警察职业 | 拥有这些职业且在岗的玩家 | Config.Police.jobs |
| 损坏的音箱 | 射击已摆放的音箱会把它打坏:它会发出噼啪声并停止播放。Speaker Repair Kit(在商店的配件分类中出售)可以修好它:在它旁边使用维修包。 | Config.Damage |
| 管理员列表 | /soundadmin:服务器上的每个音箱、正在播放什么以及归谁所有,带有设置路径点、停止音乐或移除音箱的按钮。 |
Config.AdminAce (zerodev.sound.admin) |
| 发放物品 | 服务器控制台:givespeaker <player id> <item name> |
11. 语言
本脚本提供与 Pulse Phone 相同的 25 种语言。在 config/config.lua 中设置一种:
| 代码 | 语言 | 代码 | 语言 | 代码 | 语言 |
|---|---|---|---|---|---|
en |
英语 | hu |
Magyar | pt-PT |
Português (Portugal) |
ar |
العربية | it |
Italiano | ro |
Română |
bs |
Bosanski | ja |
日本語 | ru |
Русский |
cs |
Čeština | ko |
한국어 | sl |
Slovenščina |
da |
Dansk | nb |
Norsk bokmål | sv |
Svenska |
de |
Deutsch | nl |
Nederlands | th |
ไทย |
es |
Español | pl |
Polski | tr |
Türkçe |
fr |
Français | pt-BR |
Português (Brasil) | uk |
Українська |
zh-CN |
简体中文 |
例如 Config.Locale = 'de'。默认值 'auto' 跟随 Pulse Phone:服务器使用 Pulse 的 Config.Locale,每位玩家看到的 Sound 是他们在手机上选择的语言。没有 Pulse 时为英文。游戏消息、按键提示、物品名称和音响按键名称在 locales/<code>.lua 中;界面(遥控器、车载音响、商店、安装界面、Pulse 应用)在 locales/<code>_ui.lua 中。缺少的内容会回退为英文。
要修改某一行,在对应语言的文件中编辑即可。保留所有 %s、%d、%.1f、%% 和 ~a~ 不变。要添加你自己的语言,把 locales/en.lua 复制为 locales/xx.lua,将 Locales['en'] 改为 Locales['xx'](两处都要改),翻译引号之间的文本,并设置 Config.Locale = 'xx'。locales/ui_strings.txt 列出了 xx_ui.lua 所需的全部界面键。
12. 故障排查
玩家无法使用音箱物品
- ox_inventory:条目必须放在
ox_inventory/data/items.lua中并带有其client行,粘贴后必须重启 ox_inventory。文件夹名称必须仍为zerodev-sound(条目调用的是zerodev-sound.useItem)。 - QBCore / ESX:
zerodev-sound必须在server.cfg中排在你的框架之后启动。 - QBCore 上的 codem-inventory:完成 codem-inventory 自己的那一步,即把
QBCore.Functions.UseItem指向它。 - 无背包:音箱不是物品。玩家打开
/sound,按 Set up(位于 Your speakers 下)。
物品图片缺失
- ox_inventory:无需复制;图片路径指向 zerodev-sound。如果图片是空白的,请检查条目中的
image = 'nui://zerodev-sound/...'一行和文件夹名称。 - 其他背包:查看控制台中的
Copy ... into ...一行:它列出了缺失的图片及其应放入的文件夹。从zerodev-sound/web/img/items/复制它们,然后重启背包。
玩家无法播放链接
这是有意的设计:玩家只能从你的音乐库中选择。请把歌曲添加到
Config.Library(第 8 节)。
完全没有声音
- FiveM 的内置浏览器无需点击即可播放声音,所以玩家永远不需要按任何东西来“允许”音频。如果某位玩家听不到而其他人能听到,请检查其 Windows 音量合成器中的 FiveM。
- 在遥控器的 Speakers 标签页中检查该音箱:它可能已关闭,或显示 Broken。
- 可能被警察关闭了(持续
Config.Police.silenceMinutes),或安静时段正在限制音量(Config.QuietHours)。 - 一名玩家同时最多听到
Config.Streaming.maxAudibleSessions首不同的歌(6 首),按距离由近到远。 - 安装界面中的 Test system 在
Config.Library为空或设置了Config.Sources.library = false时没有声音:它播放的是曲库中的第一首歌。
商店不见了
Config.Shop.enabled必须为true。- 店员和柜台只在玩家距离
Config.Shop.locations约 70 m 以内时出现,并且只显示在该玩家的屏幕上。请检查你设置的坐标。 - 有 ox_target 或 qb-target 时,对准店员。没有的话,站在店员旁边:E Browse speakers。
音箱显示为普通的 GTA 音箱,或根本不显示
stream/ 文件夹缺失或被改了名,或玩家在资源启动之前就已进入。重启服务器并重新连接。
车载音响提示及其含义
| 提示 | 原因 | 修复 |
|---|---|---|
| Drive into a car audio bay to build. | 随处改装已关闭,且车不在改装间内。 | 开进改装间(Config.Install.bays),或设置 Config.Install.anywhere = true。 |
| Stand next to your car to build its sound system. | 随处改装已开启,而你离车超过 8 m,或 /caraudio 在 4 m 内没有找到车。 |
站在车旁或坐进车里。 |
| Stop the car first. | 车在移动。 | 停车。 |
| Car audio can only be fitted to a car you own. | Config.Install.vehicles = 'owned',而这个车牌不在你的已拥有车辆表中。当该表无法读取时,除管理员外所有人也会看到这条提示:此时控制台会显示一行红色的 could not read the owned-vehicles table。 |
使用已拥有的车,设置为 'any',或修复控制台点名的数据库错误。 |
| Only the owner can change this car's audio. | 这辆车属于其他玩家。当设置了 Config.Install.anyone = false,且玩家没有 Config.Install.jobs 中的在岗职业时,也会显示这条提示。 |
由车主改装,或由在岗技师或管理员改装。 |
| Not enough money. | 新部件的费用超过了玩家在 Config.Install.account 中的余额。 |
移除部件,或设置 Config.Install.chargeParts = false。 |
| A subwoofer blew. It needs replacing. | 低音炮在接近满音量下被推得太猛太久。 | 在改装间更换低音炮;换更大的功放会有帮助。 |
警察看不到他们的选项
把你的警察职业名称加入 Config.Police.jobs。玩家必须在岗。
13. 更新
从 1.x 升级到 2.0:请阅读 UPGRADING.md。在 2.x 版本之间:
- 备份你的
config/文件夹、locales/(如果你翻译过),以及你添加到web/library/中的歌曲。 - 停止服务器。用新的
zerodev-sound文件夹替换旧的(保持名称不变)。 - 把你的
config/文件放回去。如果更新说明提到了新设置,请把那些行从新文件复制到你的文件中。 - 启动服务器并阅读控制台。如果有新物品,会针对你的背包打印出来。
已摆放的音箱、车辆改装和播放列表保存在数据库中(zds_speakers、zds_car_builds、zds_playlists、zds_stash),更新不会改动它们。
回退:在新版本运行稳定之前,把之前的 zerodev-sound 文件夹保存在 resources 之外,并在更新前备份数据库。要回退时,停止服务器,放回之前的文件夹和你的 config/,然后启动。在同一数据库上从 3.0 回退到 2.x 尚未测试,如有任何异常,请恢复数据库备份。