Saltar al contenido
Gang Fights

SDK de scripting · Luau

Crea tus propios modos de juego.

Los servidores de Gang Fights ejecutan recursos escritos en Luau (se abre en una pestaña nueva), Lua con tipos opcionales. Desde un comando para tirar dados hasta una ciudad de rol completa: si pasa en un servidor, lo puedes programar.

Estado: alfa temprana. La API de scripting solo crece dentro de una versión mayor, así que los recursos que escribas hoy seguirán funcionando. Pronto llegan modelos, texturas y sonidos personalizados.

Recursos

Un recurso es una carpeta dentro de la carpeta recursos/ del servidor: un manifiesto resource.toml más sus scripts. Los scripts de servidor corren en el servidor; los de cliente se envían a cada jugador y corren en su PC. Cada modo de juego que trae el servidor es solo un recurso: copia uno, cámbiale el nombre y modifica lo que quieras.

estructura de carpetas
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

Tu primer recurso

Saluda a los jugadores cuando entran y añade un comando /dice. Arranca el servidor y el recurso se ejecuta; después de editarlo, escribe restart hello en la consola del servidor y se recarga al instante.

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)
consola del 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

Qué cubre la API

La API del servidor está organizada en bibliotecas pequeñas y específicas. Cada jugador se identifica con un número: el que todos ven junto a su apodo en la lista de jugadores.

  • Eventos

    Entradas, salidas, golpes, nocauts, objetos, rondas, grafitis, elecciones en menús… y tus propios eventos entre recursos.

  • Chat y comandos

    Chat con colores, /comandos con argumentos, sugerencias y mensajes para cada jugador.

  • Temporizadores

    setTimeout, setInterval y clearTimer para todo lo que corre más tarde o se repite.

  • Jugadores

    Apodos, colores y etiquetas de nombre, admins, expulsiones, baneos temporales e identificadores estables.

  • Luchadores

    Vida, equipos, puntos de aparición, teletransporte, personajes, congelar, invulnerabilidad y reapariciones.

  • Policías

    Convierte a cualquier luchador en policía, esposa y libera, y reparte llaves para las esposas.

  • Bandas y órdenes

    Lee y da las seis órdenes de banda, y trabaja con las bandas del juego y sus miembros.

  • Objetos

    Da, quita y suelta armas y objetos, lista lo que hay en el suelo y ajusta su peso.

  • NPCs

    Coloca personajes que no se mueven, con nombre, icono y animación de espera: tenderos, reclutadores, quienes dan misiones.

  • Dimensiones

    Ejecuta varios mapas a la vez, mueve luchadores entre ellos y rota mapas entre partidas.

  • Marcadores y puertas

    Marcadores flotantes que muestran dónde pasa algo, y control de las puertas de cada mapa.

  • Objetos del mapa

    Coloca, mueve y quita objetos del mapa desde scripts o con el editor del juego (hasta 5.000 por servidor).

  • Grafitis

    Crea paredes para pintar, bloquéalas, reinícialas y reacciona a cada capa terminada.

  • Rondas y modos

    Inicia, termina y detén rondas, o prescinde de ellas para modo libre, deathmatch y rol.

  • Interfaz en pantalla

    Textos, paneles, barras, imágenes, anuncios grandes, menús numerados y campos de texto.

  • Ventanas y clics

    Dibujos clicables, etiquetas, imágenes de objetos y cursor libre para tus propias ventanas.

  • Iconos y zonas

    Iconos y zonas de colores en el mapa de cada jugador.

  • Datos guardados

    Un almacén clave-valor por recurso que sobrevive a los reinicios del servidor.

  • Contraseñas y baneos

    Hash de contraseñas con sal y lento a propósito para las cuentas del servidor, y baneos por id e IP con duración opcional.

Scripts de cliente

Los scripts de cliente son para lo que es de cada jugador: un HUD, menús, atajos de teclado, comandos de chat locales, la cámara y los sonidos. Cada recurso corre en su propio entorno aislado en la PC del jugador.

Pueden leer la pelea pero nunca cambiarla: eso haría que cada PC viera algo distinto y que hacer trampa fuera trivial. Para cambiar algo, el script de cliente se lo pide al servidor, y el 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)

Aislamiento y límites

  • Sin acceso externo

    Los scripts no pueden tocar archivos, la red ni el sistema operativo, ni reemplazar funciones de la API.

  • 250 ms por ejecución

    Un script que tarda demasiado de una vez se detiene: un bucle infinito no puede congelar el servidor.

  • 64 MB por recurso

    Cada recurso tiene su propio presupuesto de memoria.

  • Errores contenidos

    Los errores van al registro del servidor con el nombre del recurso; el recurso sigue funcionando.

Soporte en el editor: el SDK incluye definiciones de tipos para las APIs de servidor y de cliente. Añádelas a luau-lsp (se abre en una pestaña nueva) (por ejemplo, con una extensión de Luau para VS Code) para tener autocompletado y comprobación de tipos.

Plantillas incluidas

Todos los servidores traen estos recursos. Nada en ellos es especial para el juego: tus propios recursos pueden hacer lo mismo y más.

welcome
Saluda a los jugadores y cuenta sus visitas con datos guardados.
basic-commands
/players y un consejo periódico en el chat.
player-hud
Scripts de cliente: un HUD, F2 para ocultarlo, F3 para pedirle tus estadísticas al servidor.
scoreboard
Una tabla de nocauts, la ronda en letras grandes y un menú /stats.
fight-basics
Anuncia nocauts y ganadores de ronda, más /heal y /where.
deathmatch
Un modo sin rondas: reapariciones, registro de bajas, gana el primero en llegar a 10.
roleplay
Cuentas, personajes, posición guardada, un hospital y un metro entre barrios.
roleplay-chat
Chat local, /me, /do, /shout, /ooc y compañía.
mapvote
Una votación del próximo mapa al final de cada partida.
mapping
Objetos del mapa y el editor de colocación del juego.
admin
Herramientas de admin, como volar libremente por el mapa.

Montar un servidor

Crea un servidor desde el menú del juego para partidas rápidas, o genera un paquete de servidor dedicado con CreateServer.bat en la carpeta del juego. Te pregunta el sistema de destino (Windows o Linux) y los mapas, y crea una carpeta con el programa del servidor, sus datos, tus recursos, un servidor.cfg y la documentación del SDK.

  • Linux: Ubuntu 24.04+ o Debian 12+, 64 bits, con las bibliotecas ALSA y udev instaladas.
  • Puertos: UDP 27015 para el juego y UDP 27016 para la búsqueda de servidores (o el puerto que configures y el siguiente).
  • Actualizaciones: el servidor te avisa al arrancar cuando hay una versión nueva. Actualiza el juego, vuelve a generar el paquete y reemplaza el programa y los datos; tu configuración y tus recursos se mantienen.
  • Datos privados: la carpeta data/ del paquete se genera a partir de tu propia copia del juego original. Nunca la compartas públicamente.

Más sobre servidores

Referencia completa

La referencia completa de la API (cada función, evento y opción) viene con cada paquete de servidor en sdk/README.md, junto con las definiciones de tipos para el editor en sdk/types/. Siempre coincide con la versión que estás usando.