SDK de scripting · Luau
Crea tus propios modos de juego.
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.
recursos/
hello/
resource.toml
server/main.luau
client/hud.luau -- optional: runs on each player's PCname = "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 = trueTu 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.
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)> 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 minutesQué 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.
-- 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.
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.