Перейти к содержимому
Gang Fights

SDK для скриптов · Luau

Создавайте свои режимы.

Серверы Gang Fights запускают ресурсы, написанные на Luau (откроется в новой вкладке) — Lua с необязательной типизацией. От команды броска кубика до полноценного ролевого города: если это происходит на сервере, это можно заскриптовать.

Статус: ранняя альфа. В пределах мажорной версии API скриптов только расширяется, так что написанные сегодня ресурсы продолжат работать. Следующими появятся свои модели, текстуры и звуки.

Ресурсы

Ресурс — это папка внутри папки сервера recursos/: манифест resource.toml и его скрипты. Серверные скрипты работают на сервере; клиентские отправляются каждому игроку и выполняются на его ПК. Каждый игровой режим, который идёт с сервером, — это просто ресурс: скопируйте, переименуйте и меняйте что угодно.

структура папок
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

Ваш первый ресурс

Поприветствуйте игроков при входе и добавьте команду /dice. Запустите сервер — ресурс заработает; после правок введите restart hello в консоли сервера, и он мгновенно перезагрузится.

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)
консоль сервера
> 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

Что умеет API

Серверный API разбит на небольшие специализированные библиотеки. Игрок определяется номером — тем, что все видят рядом с его ником в списке игроков.

  • События

    Входы, выходы, удары, нокауты, предметы, раунды, граффити, выбор в меню — и ваши собственные события между ресурсами.

  • Чат и команды

    Цветной чат, /команды с аргументами, подсказки и сообщения отдельным игрокам.

  • Таймеры

    setTimeout, setInterval и clearTimer для всего, что выполняется позже или повторяется.

  • Игроки

    Ники, цвета и теги имён, админы, кики, временные баны и постоянные идентификаторы игроков.

  • Бойцы

    Здоровье, команды, точки появления, телепорты, персонажи, заморозка, неуязвимость и возрождения.

  • Копы

    Сделайте любого бойца полицейским, надевайте и снимайте наручники, раздавайте ключи от них.

  • Банды и приказы

    Читайте и отдавайте шесть приказов банде, работайте с бандами игры и их участниками.

  • Предметы

    Выдавайте, забирайте и бросайте оружие и предметы, получайте список лежащего на земле, настраивайте вес.

  • NPC

    Расставляйте неподвижных персонажей с именем, значком и анимацией ожидания — продавцов, вербовщиков, тех, кто выдаёт задания.

  • Измерения

    Запускайте несколько карт одновременно, перемещайте бойцов между ними и меняйте карты между матчами.

  • Маркеры и двери

    Парящие маркеры, показывающие, где что-то происходит, и управление дверями каждой карты.

  • Объекты

    Размещайте, двигайте и удаляйте объекты на карте из скриптов или во встроенном редакторе (до 5000 на сервер).

  • Граффити

    Создавайте стены для граффити, блокируйте и сбрасывайте их и реагируйте на каждый законченный слой.

  • Раунды и режимы

    Запускайте, завершайте и останавливайте раунды — или обходитесь без них в свободном режиме, deathmatch и ролевой игре.

  • Экранный интерфейс

    Тексты, панели, полосы, изображения, крупные объявления, нумерованные меню и поля ввода.

  • Окна и клики

    Кликабельные элементы, подписи, изображения предметов и свободный курсор для ваших собственных окон.

  • Значки и зоны

    Значки и цветные зоны на карте каждого игрока.

  • Сохранённые данные

    Хранилище «ключ — значение» для каждого ресурса, которое переживает перезапуск сервера.

  • Пароли и баны

    Солёное и намеренно медленное хеширование паролей для серверных аккаунтов, баны по идентификатору и IP с необязательным сроком.

Клиентские скрипты

Клиентские скрипты — для того, что принадлежит каждому игроку: HUD, меню, горячие клавиши, локальные команды чата, камера и звуки. Каждый ресурс работает в своей изолированной среде на ПК игрока.

Они могут читать состояние боя, но никогда его не меняют — иначе каждый ПК видел бы своё, а читерство стало бы элементарным. Чтобы что-то изменить, клиентский скрипт просит сервер, и решение принимает сервер.

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)

Изоляция и ограничения

  • Нет доступа наружу

    Скрипты не могут работать с файлами, сетью или операционной системой и не могут подменять функции API.

  • 250 мс на запуск

    Скрипт, который слишком долго работает за один раз, останавливается — бесконечный цикл не повесит сервер.

  • 64 МБ на ресурс

    У каждого ресурса свой лимит памяти.

  • Ошибки изолированы

    Ошибки пишутся в журнал сервера с именем ресурса; ресурс продолжает работать.

Поддержка в редакторе: SDK включает определения типов для серверного и клиентского API. Подключите их к luau-lsp (откроется в новой вкладке) (например, через расширение Luau для VS Code), чтобы получить автодополнение и проверку типов.

Встроенные шаблоны

Эти ресурсы есть на каждом сервере. В них нет ничего особенного для игры — ваши собственные ресурсы могут то же самое и больше.

welcome
Приветствует игроков и считает их визиты с помощью сохранённых данных.
basic-commands
/players и периодическая подсказка в чате.
player-hud
Клиентские скрипты: HUD, F2 — скрыть, F3 — запросить у сервера вашу статистику.
scoreboard
Таблица нокаутов, номер раунда крупными буквами и меню /stats.
fight-basics
Объявляет нокауты и победителей раунда, плюс /heal и /where.
deathmatch
Режим без раундов: возрождения, лента нокаутов, побеждает первый, набравший 10.
roleplay
Аккаунты, персонажи, сохранённая позиция, больница и метро между районами.
roleplay-chat
Локальный чат, /me, /do, /shout, /ooc и другие.
mapvote
Голосование за следующую карту в конце каждого матча.
mapping
Объекты на карте и встроенный редактор их размещения.
admin
Инструменты администратора, например свободный полёт по карте.

Запуск сервера

Создайте сервер из меню игры для быстрых матчей или соберите пакет выделенного сервера с помощью CreateServer.bat в папке игры. Он спросит целевую систему (Windows или Linux) и карты и создаст папку с программой сервера, её данными, вашими ресурсами, файлом servidor.cfg и документацией SDK.

  • Linux: Ubuntu 24.04+ или Debian 12+, 64 бита, с установленными библиотеками ALSA и udev.
  • Порты: UDP 27015 для игры и UDP 27016 для поиска серверов (или настроенный вами порт и следующий за ним).
  • Обновления: при запуске сервер сообщает о новой версии. Обновите игру, пересоберите пакет и замените программу и данные — настройки и ресурсы останутся.
  • Личные данные: папка data/ в пакете создаётся из вашей собственной копии оригинальной игры. Никогда не публикуйте её.

Подробнее о серверах

Полный справочник

Полный справочник по API — каждая функция, событие и параметр — поставляется с каждым пакетом сервера в sdk/README.md вместе с определениями типов для редактора в sdk/types/. Он всегда соответствует вашей версии.