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

Ограничения среды

Исходники пишутся на TypeScript, но сгенерированный код выполняется в ограниченной XLua-среде KILLSCRIPT с семантикой Lua 5.4. Это не Node.js, браузер, Roblox Luau или неограниченный desktop Lua.

Компилятор заранее отклоняет конструкции, которым понадобились бы недоступные глобальные функции. Поздняя ошибка Lua превращается в понятную ошибку сборки.

Не используйтеПричинаЗамена
try/catch, throw, проверка typeof во время выполненияТребуют недоступные pcall, error или typeЯвная проверка входных данных и ветвление
async, await, генераторыТребуют неподдерживаемые корутины и служебный кодОбработчики планировщика
динамический import() и прямой require()Загрузчик игры ненадёжно разрешает пути проектаСтатические относительные импорты, собираемые компилятором
импорты реализации из npmПроизвольный код пакета нельзя безопасно собратьВспомогательные функции внутри src/
глобальные API браузера и NodeВ XLua их нетТипизированный API игры или пакеты только с типами
передача или деструктуризация объектов компилятора SDKПреобразованию нужно прямое статически известное обращениеИмпортируйте объект и вызывайте его свойство или метод напрямую
клиентский Scheduler.OnTickНе доступен в клиентском контекстеscheduler.frame() или проверка времени/тика
серверный Scheduler.OnFrameУ Reflex нет кадров отрисовкиscheduler.tick()

Пакеты только с типами безопасны — они исчезают. Импорты SDK тоже безопасны: конструкции компилятора заменяются, а в Lua остаются только необходимые небольшие функции.

Многофайловая архитектура поддерживается

Заголовок раздела «Многофайловая архитектура поддерживается»

Разделяйте код как в обычном проекте:

src/client/main.ts
import "./features/status-hud";
import "./features/world-marker";

Используйте относительные импорты без расширения. Каждый достижимый файл объединяется в scripts/main.lua или scripts/server.lua, поэтому самой игре не приходится искать features/status-hud.

В сборку входят только достижимые файлы. Импорт реализации пакета за пределами src/ отклоняется, если это не импорт только типов или конструкция SDK.

Обычные TypeScript-массивы поддерживаются. Для reduce() и reduceRight() обязательно передавайте начальное значение:

const total = values.reduce((sum, value) => sum + value, 0);

Нативный LuaArray — userdata с индексацией от единицы. Для него нужны методы игровых массивов или явный цикл от 1 до Length.

Эти вызовы типизированы и существуют, но их поведение в текущей сборке ненадёжно:

  • несколько raw Network.SendTable в одном тике схлопываются в один; defineNetwork() отправляет упорядоченную пачку;
  • InputAction.Disable() меняет IsPressed(), но может не подавить уже зарегистрированный OnPerformed; проверяйте собственный флаг;
  • Reflex-методы AgentInput.SetButtonState, SetLookRotation и SetMoveDirection успешно завершаются, но не влияют на реально управляемого игрока;
  • после обновления action map интерфейс настроек может перестать показывать стандартные бинды, хотя они продолжают работать.

Проблемы игры переданы разработчику и описаны здесь временно, чтобы код и ИИ не считали вызов рабочим только из-за отсутствия ошибки.

При ошибке сборки сначала читайте первую диагностику компилятора. Частые проблемы проекта и синхронизации собраны в Решении проблем.