Documentação

Documentação do Dance minigame

O minigame de dança de boate do GTA Online, refeito para FiveM e jogável em qualquer canto do seu mapa. Aperte no ritmo para subir os quatro níveis de intensidade, segure para não perder, dê um boost ou derrube o nível na hora que quiser, troque entre dez estilos e solte 27 movimentos especiais sem sair da pista. Todo mundo em volta vê tudo, e o seu servidor não roda uma linha disso.

  • ESX
  • QBCore
  • Qbox
  • vRP
  • Standalone
01

Instalação

  1. Coloque o resource

    Baixe o script pela sua conta Tebex, copie a pasta avenida_dance/ para o seu diretório de resources e adicione ensure avenida_dance na config do servidor. Nada precisa subir antes.

  2. Escolha como ele abre

    Abra config/config.lua. Config.Command é o comando de chat, Config.Keybind registra uma tecla remapeável com Config.DefaultKey como padrão. Fique com os dois, ou coloque o comando em false e deixe a tecla para os jogadores.

  3. Defina o idioma

    Config.Locale aceita qualquer um dos quinze códigos que vêm em locales/. Os arquivos estão fora do escrow, então dá para reescrever cada linha no tom do seu servidor.

  4. Aponte as notificações para a sua stack

    Config.Notif está em auto e detecta ox_lib, okokNotify, QBCore ou ESX nessa ordem. Force o alvo se você roda vários, ou use o caminho custom de bridges/notif.lua para o seu próprio sistema.

  5. Não existe passo cinco

    Nenhum SQL para rodar, nenhum framework para declarar, nenhuma permissão para liberar. Reinicie e digite o comando.

02

Configuração

Como os seus jogadores começam a dançar

Um comando, uma tecla, ou os dois. A tecla aparece nas configurações do FiveM, em Key Bindings, então cada jogador pode remapear ela sem encostar na sua config.

lua
-- config/config.lua
Config.Command    = 'dance'   -- chat command, false to disable
Config.Keybind    = true      -- rebindable key in FiveM settings
Config.DefaultKey = 'F7'

-- The GTA:O help panel with styles, actions and controls.
-- Off, style and move changes are announced by notification instead.
Config.ShowHints = true
03

Exports

Session

  • StartDance
    exports.avenida_dance:StartDance(styleIndex?) --> boolean

    Inicia uma sessão para o jogador local, forçando um índice de estilo de 1 a 10 se você quiser. Retorna false quando ele não pode dançar naquele momento, dentro de um veículo, na água, no ar ou já dançando, então o seu próprio script decide o que fazer com isso.

  • StopDance
    exports.avenida_dance:StopDance()

    Encerra a sessão em andamento e toca a animação final de verdade em vez de cortar a animação no meio. Não faz nada se ninguém estiver dançando, então pode chamar sem medo.

  • IsDancing
    exports.avenida_dance:IsDancing() --> boolean

    Verdadeiro enquanto o jogador local está numa sessão. Útil para bloquear as suas próprias interações, o seu inventário ou uma ação de job enquanto o minigame está com os controles na mão.

Music

  • SetDanceBeat
    exports.avenida_dance:SetDanceBeat(bpm, msToNextBeat?)

    Alimenta o ritmo simulado com o BPM da faixa que o seu próprio script de música está tocando. O segundo argumento acerta a fase, então o ícone pulsa no tempo forte de verdade e não um pouco fora dele. Ignorado se o valor não for um número positivo.

04

Receitas

Travar o minigame na sua própria música

O ritmo nativo só existe onde a Rockstar colocou um emitter de áudio. Se a sua boate toca faixas próprias, desligue o ritmo nativo e mande o seu BPM. Chame o export uma vez quando a faixa começa, e de novo a cada troca de faixa.

lua
-- config/config.lua
Config.UseNativeBeat = false
Config.FallbackBpm   = 122.0

-- in your music resource, when a track starts
exports.avenida_dance:SetDanceBeat(128.0, 180)

Iniciar uma dança por um job ou um prop

Um palco, um pódio, uma barra de pole dance, um job de dançarino: libere a dança para o seu jogador sem precisar de comando. Force um índice de estilo para o pódio ficar sempre com o mesmo visual, e leia o retorno para saber se começou mesmo.

lua
local started = exports.avenida_dance:StartDance(7) -- shuffle

if not started then
    -- the player is in a vehicle, in water, or already dancing
    return
end

Colocar o seu próprio layout de teclas

Um controle não precisa de nada aqui, os padrões são inputs do FiveM e o jogo já joga eles no controle. Isso aqui é para o servidor que quer as próprias teclas. Deixe o toque e o segurar em dois inputs diferentes, o minigame lê os dois separadamente.

lua
-- config/config.lua
Config.Controls = {
    beat        = 201, -- INPUT_FRONTEND_ACCEPT
    hold        = 202, -- INPUT_FRONTEND_CANCEL
    boost       = 22,  -- INPUT_JUMP
    drop        = 23,  -- INPUT_ENTER
    flourish    = 45,  -- INPUT_RELOAD
    stop        = 73,
    -- the rest keeps its default
}

Deixar o minigame fácil, ou impiedoso

A dificuldade são quatro números. Baixe BeatsHit e um público casual chega ao nível quatro; suba BeatsFail e sair martelando o botão deixa de ser punido. São os primeiros valores que o dono de uma boate vai querer mexer.

lua
-- config/config.lua
Config.BeatsHit  = 8    -- clean beats to cross a level
Config.BeatsMiss = 16   -- missed beats to drop one
Config.BeatsFail = 8    -- bad inputs to drop one

Config.Level3Min = 0.25
Config.Level4Min = 0.75
05

Perguntas

Precisa de framework?

Não, nem como plano B: não existe nada neste script que um framework pudesse entregar. Ele nunca lê dinheiro, itens, jobs nem identidade. Por isso o mesmo arquivo roda em ESX, QBCore, Qbox, vRP, ox_core ou num servidor standalone sem configurar um único bridge. A única coisa que um framework pode fazer aqui é mostrar uma notificação, e isso é um arquivo aberto.

Preciso do ox_lib?

Não. Config.UseOxLib vem desligado, e assim o script usa as APIs nativas do FiveM para tudo: o ped, a checagem de veículo, o ID do jogador. Ligue a flag e ele passa a usar os caches do ox_lib, o que compensa num servidor que já roda a stack ox. O único outro lugar onde ele aparece é um dos seis caminhos do bridge de notificações.

Tem script de servidor ou banco de dados?

Nem um nem outro. Não existe arquivo de servidor no script, nem SQL, nem tabela, nem event vindo do client. Tudo o que os jogadores próximos veem vem de quatro statebags empurradas por quem dança. É uma escolha de arquitetura com uma consequência que vale dizer: nada fica guardado do lado do servidor, então a preferência de estilo do seu jogador fica nas configurações de jogo dele, não no seu banco.

Por que os dançarinos remotos ficam menos fluidos que o meu?

A rede de animação que o GTA usa para esse minigame não clona no OneSync, então os dançarinos remotos são ressimulados localmente a partir das statebags. Na maior parte do tempo o resultado é igual ao original. Quando um clone fica preso na intro, o script tenta duas vezes e depois passa a rodar em loop o clipe dominante da grade de 27 clipes. O estilo, a intensidade e a direção continuam certos, só a transição entre poses fica menos rica. Os movimentos de corpo inteiro replicam sempre de forma nativa.

Minha boate toca música própria, o ritmo continua funcionando?

Sim, com SetDanceBeat. O ritmo nativo é lido dos emitters de áudio da Rockstar, que só existem onde a Rockstar colocou eles. Para uma faixa própria, desligue Config.UseNativeBeat e entregue ao script o seu BPM mais o intervalo até a próxima batida. O ícone passa a pulsar no tempo da sua faixa, e não num chute.

O que acontece numa faixa muito rápida?

Acima de Config.MaxBpm, 140 por padrão, as animações de dança começam a sair do tempo da música. Para isso não ficar visível, a velocidade da animação cai um quarto acima desse limite e a reprodução fica entre 0,8 e 1,2 vez a velocidade normal. Os dois valores estão na config aberta se você quiser forçar eles.

Dá para dançar em qualquer lugar ou só na boate?

Em qualquer lugar, a pé e com os pés no chão. Não tem zona para declarar nem lista de locais para manter. A sessão para sozinha se o seu jogador entrar na água, ficar no ar, pegar fogo ou entrar em ragdoll, então ninguém acaba dançando no ar depois de sair da beirada de um telhado.

Quanto custa quando ninguém está dançando?

0.00ms. O script não tem nenhum loop rodando de fundo: registra um comando, uma tecla e um handler de statebag, e depois não faz mais nada até alguém começar uma sessão. Cada thread criada por uma sessão morre com ela.

Carrinho
Spirit RP
Discord