Ограничения среды
Исходники пишутся на 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 остаются только необходимые небольшие функции.
Многофайловая архитектура поддерживается
Заголовок раздела «Многофайловая архитектура поддерживается»Разделяйте код как в обычном проекте:
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 интерфейс настроек может перестать показывать стандартные бинды, хотя они продолжают работать.
Проблемы игры переданы разработчику и описаны здесь временно, чтобы код и ИИ не считали вызов рабочим только из-за отсутствия ошибки.
При ошибке сборки сначала читайте первую диагностику компилятора. Частые проблемы проекта и синхронизации собраны в Решении проблем.