Skip to content

Kayfy ​

Música no jogo, tocada pelo app do celular ou pela mesa de DJ. O som sai em 3D de uma caixa de som, do bluetooth do carro ou da mesa. No fone, só o dono ouve.

Precisa de: ox_lib, krs_helper e a API de música kayfy-api

Opcionais: phone, para o app; target, ox_target ou qb-target, para as opções na caixa; skinshop, para o acessório do fone.

Relação com o celular ​

O Kayfy não depende do phone, mas sem ele a única tela de música é a da mesa de DJ. Com os dois ligados, o app Kayfy aparece no celular e no tablet, já instalado no personagem novo. Se o kayfy parar, o app some.

Instalação ​

A API é um programa Node à parte, entregue em uma pasta própria. Ela não é um resource. Precisa de Node 20 ou mais novo e de MySQL ou MariaDB, e cria as próprias tabelas.

  1. No config.json da API, preencha Server.PublicUrl com o endereço que os jogadores usam para chegar nela e Security.PlayerSecret com um segredo longo. Libere a porta no firewall.
  2. Ligue a API com start.bat e deixe sempre ligada.
  3. Configure o server.cfg:
cfg
setr ox:locale "pt-br"
setr kayfy_api_url "http://IP_PUBLICO_DA_MAQUINA:3000"
set kayfy_player_secret "MESMO_SEGREDO_DA_API"

ensure oxmysql
ensure ox_lib
ensure krs_helper
ensure kayfy

Coloque o framework antes do krs_helper. Veja a ordem de instalação.

  1. Crie os itens no inventário: earbuds ou headphones para o fone; speaker_party, speaker_flip, speaker_bluetooth e speaker_go para a caixa.
  2. Dê o grupo Kayfy aos jogadores, ou libere para todos. Veja Permissão.
ConvarTipoPara quê
kayfy_api_urlsetrBase da API, igual ao Server.PublicUrl, sem barra no fim. Vale sobre apiUrl
kayfy_player_secretset, nunca setrIgual ao Security.PlayerSecret
ox:localesetrIdioma: pt-br, en, es, fr, zh-cn, hi, ar ou bn

Como usar ​

ModoComo funcionaExige
Caixa de somAo tocar fora do carro, a caixa aparece na mãoItem de caixa e grupo Kayfy
BluetoothDentro do carro, o som sai do veículo. Cada veículo tem um único donoGrupo Kayfy
FoneEscolha o fone no app. Só o dono ouveItem de fone e grupo Kayfy
Mesa de DJChegue perto da mesa e aperte a tecla mostrada na tela. Cada mesa tem um único donoGrupo da mesa
ComandoTeclaO que faz
/kayfy_radioGLarga ou pega a caixa
kayfy_djEUsa a mesa de DJ por perto

O app abre pelo celular, com /celular ou F1. Com o target, a caixa ganha as opções de pegar e desligar. As opções no chão só existem no target do krs. Nos outros, G e o comando fazem o mesmo.

O dono perde a caixa ao se afastar mais de stealDistance. O bluetooth para ao se afastar mais de maxDistance do veículo.

Permissão ​

Por padrão, caixa, carro e fone exigem o grupo Kayfy, e a mesa de exemplo exige Premium. Para liberar para todos, troque a lista por {}: radio = {}.

FrameworkComo dar o grupo Kayfy
krs, CreativeGrupo Kayfy, pelo comando de grupo do admin
QBCoreEm Config.Groups do krs_helper: Kayfy = { "kayfy" }, e dê esse job, gang ou ACE
vRPEm Config.Groups do krs_helper: Kayfy = { "kayfy" }, e dê o grupo kayfy
Sem frameworkadd_ace group.vip group.Kayfy allow e add_principal identifier.license:SUA_LICENSE group.vip

O mesmo vale para Premium e para Admin, que abre o painel de destaques da API.

A permissão é conferida de novo em next, resume e setVolume. Se ela caiu, o som para nessa ação.

Configuração ​

Tudo fica em config.lua, aberto. O que faltar usa o padrão do script e o console avisa em uma linha. Na tabela está o valor que vem no config.lua. Quando o padrão do script é outro, ele aparece em "O que muda". Os textos ficam em locales/*.json.

Geral ​

OpçãoPadrãoO que muda
apiUrl"http://127.0.0.1:3000"Base da API, para teste local. Em produção, use a convar
prop"krs_speaker_black"Modelo da caixa. Também há _blue, _red, _green, _white e _pink. Sem a opção: "prop_boombox_01"
featuresos 4 trueLiga e desliga radio, bluetooth, headphones e dj
permission{ "Kayfy" } nos 3 modosGrupos de radio, bluetooth e headphones
adminPermission{ "Admin" }Quem recebe o passe de admin da API
headphoneItems{ "earbuds","headphones" }Itens que valem como fone. {} não exige item
speakerItems4 itens{ item = "modelo" }: a caixa exibida é a do item. {} não exige item, e é o valor sem a opção
maxDistance150Distância do dono ao veículo que encerra o bluetooth
stealDistance60Distância do dono à caixa que apaga a caixa
blacklist{ "spawn_do_veiculo" }Modelos sem bluetooth. Sem a opção: {}
allowBluetoothOnBikesfalseBluetooth em moto e bicicleta

Som ​

OpçãoPadrãoO que muda
range.vehicle["*"] = { 48,100 } e 7 modelos de exemplo{ alcance, volume% } por modelo. Acima de 100, aumenta o som
range.radio{ 20,100 }Alcance e volume da caixa
client.baseVolume0.5Multiplicador global, de 0 a 1
client.refreshRate4Atualizações de posição por segundo
client.realismtrueAbafa o som de veículo fechado
client.realismIgnore{ "pbus2" }Modelos que não abafam. Sem a opção: {}
client.blockedInteriors{}Pontos { x, y, z } em interiores sem som
client.stopOnDeathtruePara o som ao morrer

Mesa de DJ ​

OpçãoPadrãoO que muda
dj1 mesa de exemploMesas. Sem a opção: nenhuma
djUseDistance3.0Distância para abrir a tela
djPlayDistance10.0Distância para continuar tocando. Mais longe, a tela fecha
client.djKey"e"Tecla padrão
lua
dj = {
	{ table = { 120.81,-1280.32,29.49 }, speaker = { 112.71,-1287.38,28.46 }, range = 50, volume = 100, permission = { "Premium" } }
}

Caixa e fone ​

OpçãoPadrãoO que muda
client.radioCommand"kayfy_radio"Comando da caixa, sem /. Letras, números, _ e -. "" desliga
client.dropRadioKey"g"Tecla padrão. "" deixa sem tecla, e o jogador escolhe
client.handosso 18905, move_m@bagPosição da caixa na mão e estilo de andar
client.handByModel4 modelosPosição na mão por modelo. Sem a opção: vazio
client.headphoneProp"Beat Off"Trecho do nome do acessório no skinshop. "" desliga
client.headphoneModel"kroma_headphones"Fone 3D na cabeça, visto só por quem usa. "" usa headphoneProp, e é o valor sem a opção
client.headphoneAttachosso 31086Posição do fone 3D

Tela e integrações ​

OpçãoPadrãoO que muda
client.minimumHealth101Vida mínima para abrir a tela
client.targetResource"target""target", "ox_target" ou "qb-target". Para outro, copie um bloco em hooks.lua
client.skinshopResource"skinshop"Resource de skinshop
client.brandName"Kayfy"Nome na tela
client.brandColor, client.brandColorStrong"#1ed760", "#1db954"Cores da tela
client.notifyColor"vermelho"Cor do aviso: "verde", "amarelo" ou "vermelho"
client.notifyTime7000Duração do aviso, em ms

Para programadores ​

Exports do cliente:

lua
exports.kayfy:GetState()              -- último estado, ou false
exports.kayfy:Command({ name = "togglePlay" })
exports.kayfy:Api("search", { "título" })   -- { data } ou { error }
exports.kayfy:Allowed()               -- true se o jogador pode usar algum modo

Comandos: playQueue, togglePlay, next, previous, jumpTo, setShuffle, setRepeat, addToQueue, playNext, removeFromQueue, moveInQueue, clearQueue, setVolume, setLocalVolume, setMuted, setStreamerMode, setRespectStreamer, setSyncPhoneVolume, toggleMode e stop.

Métodos de Api: search, searchPlaylists, searchArtists, songs, playable, related, trending, artistTracks, featured, featuredPlaylist, externalPlaylist, likes, like, unlike, playlists, createPlaylist, updatePlaylist, deletePlaylist, addToPlaylist, removeFromPlaylist, history e addHistory.

Exports do servidor, em adapter.lua, aberto:

lua
exports.kayfy:hasPermission(source, grupo)
exports.kayfy:hasItem(source, itens)

Troque esses dois para usar outra regra de grupo ou item.

Eventos de cliente: kayfy:state sai com estado, tempoMs. kayfy:phoneVolume entra com um número de 0 a 1.

Ganchos em hooks.lua, aberto: KayfyWindowsOpen(vehicle) devolve true para veículo aberto, false para fechado e nil para a regra padrão. KayfyTargetModel e KayfyTargetGround registram as opções no target.

Problemas comuns ​

MensagemCausa
Você não tem permissão para usar o rádioFalta o grupo de permission.radio. Há mensagens iguais para bluetooth, fone e mesa
Você não tem uma caixa de somO jogador não tem nenhum item de speakerItems
Você não tem um fone de ouvidoO jogador não tem nenhum item de headphoneItems
Esta função está desligada neste servidorO modo está false em features
Este veículo já está tocando uma músicaO veículo tem outro dono
Este veículo não possui BluetoothO modelo está em blacklist
O bluetooth não pode ser emparelhado em motos ou bicicletasallowBluetoothOnBikes está false
Esta mesa de som já está em usoA mesa tem outro dono
Você está longe da mesa de somO jogador passou de djPlayDistance
Não foi possível criar a caixa de som.A caixa não apareceu em 3 segundos. Confira o modelo em prop ou speakerItems
Muitas ações seguidas. Aguarde um instante.Mais de 10 pedidos pendentes do mesmo jogador
apiUrl vazio: qualquer link de áudio será aceito.Sem kayfy_api_url e sem apiUrl. Defina a convar
convar kayfy_player_secret vaziaDefina o segredo igual ao da API
client.radioCommand inválidoO nome tem caractere proibido ou é kayfy_dj. O script volta ao padrão