Pular para o conteúdo
Gang Fights

SDK de scripts · Luau

Crie seus próprios modos de jogo.

Os servidores de Gang Fights executam recursos escritos em Luau (abre em uma nova aba) — Lua com tipos opcionais. De um comando de rolar dados a uma cidade de roleplay completa: se acontece em um servidor, você pode programar.

Status: alfa inicial. A API de scripts só cresce dentro de uma versão principal, então os recursos que você escrever hoje continuam funcionando. Modelos, texturas e sons personalizados vêm a seguir.

Recursos

Um recurso é uma pasta dentro da pasta recursos/ do servidor: um manifesto resource.toml mais os seus scripts. Scripts de servidor rodam no servidor; scripts de cliente são enviados a cada jogador e rodam no PC dele. Cada modo de jogo que vem com o servidor é só um recurso — copie um, renomeie e mude o que quiser.

estrutura de pastas
recursos/
  hello/
    resource.toml
    server/main.luau
    client/hud.luau        -- optional: runs on each player's PC
resource.toml
name = "hello"
version = "1.0.0"
description = "Says hello"
author = "You"
server_scripts = ["server/main.luau"]
client_scripts = []   # sent to each player and run on their PC
dependencies = []     # resources that must be running first
gamemode = false      # true: this resource runs the rounds
autostart = true

Seu primeiro recurso

Cumprimente os jogadores quando entram e adicione um comando /dice. Inicie o servidor e o recurso roda; depois de editar, digite restart hello no console do servidor e ele recarrega na hora.

hello/server/main.luau
on("playerJoin", function(player: number)
  players.message(player, "Hello, " .. (players.name(player) or "?") .. "!")
end)

registerCommand("dice", function(player: number)
  chat.broadcast((players.name(player) or "?") .. " rolls " .. math.random(1, 6))
end)
console do servidor
> resources            # list what's running
> restart hello        # reload after editing — no server restart
> players
> say Round starts in 1 minute
> ban 7 60 spamming    # by player number, for 60 minutes

O que a API cobre

A API do servidor é organizada em bibliotecas pequenas e focadas. Cada jogador é identificado por um número — o mesmo que todos veem ao lado do apelido na lista de jogadores.

  • Eventos

    Entradas, saídas, golpes, nocautes, itens, rodadas, grafites, escolhas em menus — e seus próprios eventos entre recursos.

  • Chat e comandos

    Chat colorido, /comandos com argumentos, sugestões e mensagens por jogador.

  • Temporizadores

    setTimeout, setInterval e clearTimer para tudo que roda depois ou se repete.

  • Jogadores

    Apelidos, cores e tags de nome, admins, expulsões, banimentos temporários e ids estáveis.

  • Lutadores

    Vida, equipes, pontos de surgimento, teleporte, personagens, congelamento, invulnerabilidade e renascimento.

  • Policiais

    Transforme qualquer lutador em policial, algeme e solte, e distribua chaves das algemas.

  • Gangues e ordens

    Leia e dê as seis ordens de gangue, e trabalhe com as gangues do jogo e seus membros.

  • Itens

    Dê, tire e largue armas e objetos, liste o que está no chão e ajuste o peso.

  • NPCs

    Posicione personagens que ficam parados, com nome, ícone e animação de espera — lojistas, recrutadores, quem dá missões.

  • Dimensões

    Rode vários mapas ao mesmo tempo, mova lutadores entre eles e faça rotação de mapas entre partidas.

  • Marcadores e portas

    Marcadores flutuantes que mostram onde algo acontece, e controle das portas de cada mapa.

  • Objetos

    Coloque, mova e remova objetos do mapa por script ou com o editor do jogo (até 5.000 por servidor).

  • Grafite

    Crie paredes para pintar, trave, reinicie e reaja a cada camada terminada.

  • Rodadas e modos

    Inicie, termine e pare rodadas — ou dispense-as para modo livre, deathmatch e roleplay.

  • Interface na tela

    Textos, painéis, barras, imagens, anúncios grandes, menus numerados e campos de texto.

  • Janelas e cliques

    Desenhos clicáveis, rótulos, imagens de itens e cursor livre para suas próprias janelas.

  • Ícones e zonas

    Ícones e zonas coloridas no mapa de cada jogador.

  • Dados salvos

    Um armazenamento chave-valor por recurso que sobrevive aos reinícios do servidor.

  • Senhas e banimentos

    Hash de senha com sal e propositalmente lento para contas do servidor, e banimentos por id e IP com duração opcional.

Scripts de cliente

Scripts de cliente são para o que pertence a cada jogador: um HUD, menus, atalhos de teclado, comandos de chat locais, a câmera e os sons. Cada recurso roda no seu próprio ambiente isolado no PC do jogador.

Eles podem ler a briga, mas nunca alterá-la — isso faria cada PC ver uma coisa diferente e tornaria trapacear trivial. Para mudar algo, o script de cliente pede ao servidor, e o servidor decide.

player-hud/client/hud.luau
-- client/hud.luau
setInterval(function()
  local me = fighters.get(localPlayer.fighter() or -1)
  if me then
    ui.text("hp", "Health " .. math.floor(me.health), { position = "bottom-right" })
  end
end, 200)

on("keyDown", function(key)
  if key == "F3" then
    emitServer("askStats")   -- handled on the server with onClient("askStats", ...)
  end
end)

Isolamento e limites

  • Sem acesso externo

    Scripts não podem mexer em arquivos, na rede ou no sistema operacional, nem substituir funções da API.

  • 250 ms por execução

    Um script que demora demais de uma vez é interrompido — um loop infinito não congela o servidor.

  • 64 MB por recurso

    Cada recurso tem seu próprio limite de memória.

  • Erros isolados

    Os erros vão para o log do servidor com o nome do recurso; o recurso continua rodando.

Suporte no editor: o SDK traz definições de tipos para as APIs de servidor e de cliente. Adicione-as ao luau-lsp (abre em uma nova aba) (por exemplo, com uma extensão de Luau para o VS Code) para ter autocompletar e verificação de tipos.

Modelos incluídos

Todo servidor vem com estes recursos. Nada neles é especial para o jogo — os seus recursos podem fazer o mesmo e mais.

welcome
Cumprimenta os jogadores e conta as visitas com dados salvos.
basic-commands
/players e uma dica periódica no chat.
player-hud
Scripts de cliente: um HUD, F2 para esconder, F3 para pedir suas estatísticas ao servidor.
scoreboard
Uma tabela de nocautes, a rodada em letras grandes e um menu /stats.
fight-basics
Anuncia nocautes e vencedores da rodada, além de /heal e /where.
deathmatch
Um modo sem rodadas: renascimento, feed de abates, vence quem chegar a 10 primeiro.
roleplay
Contas, personagens, posição salva, um hospital e um metrô entre bairros.
roleplay-chat
Chat local, /me, /do, /shout, /ooc e companhia.
mapvote
Uma votação do próximo mapa ao fim de cada partida.
mapping
Objetos do mapa e o editor de posicionamento do jogo.
admin
Ferramentas de admin, como voar livremente pelo mapa.

Rodando um servidor

Hospede pelo menu do jogo para partidas rápidas, ou gere um pacote de servidor dedicado com CreateServer.bat na pasta do jogo. Ele pergunta o sistema de destino (Windows ou Linux) e os mapas, e cria uma pasta com o programa do servidor, os dados, seus recursos, um servidor.cfg e a documentação do SDK.

  • Linux: Ubuntu 24.04+ ou Debian 12+, 64 bits, com as bibliotecas ALSA e udev instaladas.
  • Portas: UDP 27015 para o jogo e UDP 27016 para a busca de servidores (ou a porta que você configurar e a seguinte).
  • Atualizações: o servidor avisa ao iniciar quando sai uma versão nova. Atualize o jogo, gere o pacote de novo e substitua o programa e os dados — sua configuração e seus recursos ficam.
  • Dados privados: a pasta data/ do pacote é gerada a partir da sua própria cópia do jogo original. Nunca a compartilhe publicamente.

Mais sobre hospedagem

Referência completa

A referência completa da API — cada função, evento e opção — vem com todo pacote de servidor em sdk/README.md, junto com as definições de tipos para o editor em sdk/types/. Ela sempre corresponde à versão que você está rodando.