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 파일은 없습니다. |
| Framework | 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 키도, Google 계정도 필요 없습니다.
Linux 서버
Linux 서버: Latest가 아닌 Recommended 서버 아티팩트를 사용하세요. FiveM 서버 다운로드 페이지(docs.fivem.net/docs/server-download/)에서 Linux와 Recommended 업데이트 브랜치를 선택하세요. 최신 Linux 아티팩트를 쓰던 서버가 로딩 중 크래시했고(FXServer가 /proc/self/maps 덤프를 출력), Recommended 아티팩트로 바꾸자 해결되었습니다. 저희가 받은 Linux 관련 보고는 이것뿐이며, 아직 Linux 서버에서 ZeroDev Sound를 직접 실행해 보지는 않았습니다.
Linux 서버: Latest가 아닌 Recommended 서버 아티팩트를 사용하세요. FiveM 서버 다운로드 페이지(docs.fivem.net/docs/server-download/)에서 Linux와 Recommended 업데이트 브랜치를 선택하세요. 최신 Linux 아티팩트를 쓰던 서버가 로딩 중 크래시했고(FXServer가 /proc/self/maps 덤프를 출력), Recommended 아티팩트로 바꾸자 해결되었습니다. 저희가 받은 Linux 관련 보고는 이것뿐이며, 아직 Linux 서버에서 ZeroDev Sound를 직접 실행해 보지는 않았습니다.
standalone 서버(framework 없음)에서는 모든 것이 무료입니다. 매장과 차량 부품 모두 요금이 부과되지 않습니다.
2. 설치
1단계. 폴더를 넣습니다. zerodev-sound 폴더를 resources 폴더에 넣으세요(하위 폴더도 괜찮습니다. 예: resources/[zerodev]/zerodev-sound). 폴더 이름은 zerodev-sound로 유지하세요. ox_inventory 아이템 항목이 이 이름으로 호출합니다.
2단계. server.cfg에 추가하세요. 데이터베이스, framework, 인벤토리 뒤에 넣습니다:
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-sound3단계. 관리자에게 관리자 권한을 주세요(스피커 개수 제한 없음, /soundadmin 목록, 원격 정지 및 제거):
add_ace group.admin zerodev.sound.admin allow4단계. 인벤토리에 맞게 아이템을 설정하세요: 3절. ESX 인벤토리와 QBCore에서는 자동으로 처리됩니다.
5단계. 서버를 재시작하고(모든 플레이어가 모델을 불러오도록 리소스만이 아니라 서버 전체를 재시작) 콘솔을 확인하세요: 4절.
3. 인벤토리용 아이템
아이템은 12개입니다: 스피커 10종, 마이크 스탠드, 수리 키트.
| 아이템 이름 | 표시 | 무게 |
|---|---|---|
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 shared items에 추가됩니다. | 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 | codem-inventory/config/itemlist.lua에 12개 아이템을 추가하세요. 이름, 라벨, 무게는 QBCore 블록의 것을 사용합니다. QBCore에서는 QBCore.Functions.UseItem이 codem-inventory를 가리키도록 하는 codem-inventory 자체 설치 단계도 완료하세요. 그렇지 않으면 아이템을 사용할 수 없습니다. |
codem-inventory의 아이템 이미지 폴더 |
| core_inventory | 없음. 아이템이 QBCore shared items나 ESX items 테이블에 자동으로 추가됩니다. |
core_inventory의 아이템 이미지 폴더 |
| origen_inventory | origen_inventory/config/items.lua에 12개 아이템을 추가하세요. 이름, 라벨, 무게는 QBCore 블록의 것을 사용합니다. |
origen_inventory의 아이템 이미지 폴더 |
| tgiann-inventory | tgiann-inventory/items/items.lua에 12개 아이템을 추가하세요. 이름, 라벨, 무게는 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 블록
qb-, ps-, lj-, qs-inventory가 읽는 QBCore 아이템 형식:
['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를 입력하세요). 데이터베이스와 스키마, framework, 돈, 인벤토리와 아이템, 차고 테이블, 타깃, Pulse Phone, 모델, 설치 베이, 게임 안에서 바꾼 설정을 보여 줍니다. OK가 아닌 줄은 모두 해야 할 일을 알려 줍니다. docs/SETUP.md에 예시가 있고, docs/TROUBLESHOOTING.md가 각 줄을 설명합니다.
- framework 줄에 찾은 것이 표시됩니다. 잘못되었다면
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절을 참고하세요.
게임 안에서(점검 5가지)
- 지도에 Legion Square의 ZeroDev Sound 블립과 Benny's의 Car audio bay 블립이 표시됩니다.
- 매장에는 스피커가 진열된 판매대에 점원이 서 있습니다. 점원을 타깃하고(타깃 리소스가 없으면 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에 있습니다.
| 원하는 것 | 설정 |
|---|---|
| framework나 인벤토리 강제 지정 | 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을 고르거나, 타깃 리소스가 없으면 옆에 서서 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(사운드 모드 6가지, 3밴드 이퀄라이저, 음악 선택자, 운영 시간, 콘서트 구성을 위한 "Real distance"). 음악을 고르는 사람: Only me, Party(근처 누구나 곡을 요청하면 소유자가 승인), Anyone(근처 사람이 재생, 일시정지, 건너뛰기, 대기열 추가, 구간 이동 가능). Opening hours 는 두 시각 사이에 소유자의 플레이리스트 하나를 자동으로 재생합니다. 상점이나 클럽용입니다.
마이크(pma-voice 필요). 마이크를 들고 있는 동안 해당 시스템의 어느 스피커 근처에 있든 모두가 그 스피커를 통해 PA 느낌의 소리로 내 목소리를 듣습니다. 음량은 그 스피커가 음악을 트는 음량과 같고, 들리는 거리도 같습니다. 믹서나 마이크 스탠드에서 4m 멀어지거나, 연결을 끊거나, 마이크를 내려놓으면 목소리가 원래대로 돌아옵니다. 시스템 소유자(차량은 관리자도)만 그 시스템으로 노래할 수 있습니다. 다른 플레이어가 모든 시스템을 쓸 수 있게 하려면 zds.mic ace를 부여하세요. 목소리가 각 스피커 위치에서 들리는 것은 아닙니다. 보이스 채팅은 목소리를 그 위치에 둘 수 없기 때문에, 스피커 근처 사람들은 그 스피커의 음량으로 내 목소리를 듣게 됩니다. 설정: Config.Mic.
7. 카 오디오
플레이어가 장착하는 방법
- 카 오디오 베이(기본값 Benny's)로 들어가 운전자로 E를 누르세요.
- 완성 키트(Daily thump, Competition, Trunk wall, Sound quality, Clean and hidden)로 시작하거나 부품을 고르세요: 서브우퍼(8"~18"), 박스, 앰프, 도어 스피커, 트위터, 팟, 가짜 바닥, 패널, 아크릴, 캐패시터, 보조 배터리, LED 스트립, 헤드 유닛.
- 각 부품을 차의 원하는 위치로 끌어다 놓으세요. 서브우퍼는 박스 구멍에 맞춰 들어갑니다. 부품마다 마감(8가지 색상)을 고를 수 있고, 서브우퍼와 스피커는 그릴과 라이트 링도 고를 수 있습니다. Mirror는 부품을 반대쪽에 복사하고, Fine position은 조금씩 움직입니다. 카메라 시점 5가지: Boot, Cabin, Side, Front, Top. 크기: 서브우퍼는 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'(기본값): framework 소유 차량 테이블에 있는 차량만(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 |
| 고장 난 스피커 | 설치된 스피커를 쏘면 고장 납니다. 지직거리다가 멈춥니다. 매장의 Accessories에서 파는 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에서 framework보다 뒤에 시작해야 합니다. - QBCore의 codem-inventory:
QBCore.Functions.UseItem이 codem-inventory를 가리키도록 하는 codem-inventory 자체 설치 단계를 완료하세요. - 인벤토리 없음: 스피커는 아이템이 아닙니다. 플레이어는
/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로 되돌리는 것은 테스트하지 않았으므로, 이상해 보이면 데이터베이스 백업을 복원하세요.