Разработка и отладка
Для папочного модуля обычный цикл разработки занимает несколько секунд:
- запустите пользовательскую игровую сессию;
- включите модуль;
- измените файл в редакторе;
- сохраните его;
- проверьте результат и консоль.
Hot reload
Заголовок раздела «Hot reload»Игра следит за файлами внутри папочного модуля и запрашивает перезагрузку после сохранения. Это относится к Lua-коду, конфигурации и ресурсам.
Некоторые файлы требуют дополнительного обновления:
- изменение
inputs.jsonперестраивает действия ввода; - изменение
module.jsonобновляет метаданные и может перезагрузить клиентские модули; - изменение
scripts/server.luaобновляет серверную часть активного Reflex-модуля.
При hot reload прежний экземпляр Lua-модуля заменяется новым. Поэтому инициализируйте состояние, подписки и окна в коде так, как будто файл запускается заново.
Консоль
Заголовок раздела «Консоль»Консоль открывается клавишей ~. В ней отображаются:
- сообщения
print(); - ошибки Lua с именем файла и строкой;
- сообщения загрузки и hot reload;
- предупреждения о неверных JSON-файлах и ресурсах.
Если print не видно
Заголовок раздела «Если print не видно»Возле поля Search находится значок фильтра. Он управляет видимостью категорий сообщений. Также в консоли выбирается раздел или источник логов.
Проверьте оба пункта:
- выбран раздел вашего модуля;
- в фильтре включены информационные сообщения.
После этого ищите строки вида:
[MyModule] [main.lua:12]: Module loadedПолезный шаблон диагностики
Заголовок раздела «Полезный шаблон диагностики»print("Module loaded")
local frames = 0
Scheduler:OnFrame(function() frames = frames + 1
if frames == 1 then print("First frame received") end
ImGui:DrawDebugText("Frames: " .. tostring(frames))end)По результату легко понять, где остановилась загрузка:
- нет первой строки — модуль не запущен или
main.luaне загрузился; - первая строка есть, второй нет — ошибка возникла до регистрации
OnFrame; - обе строки есть, но текста на экране нет — проверяйте вызов ImGui и текущий игровой контекст.
Частые ошибки
Заголовок раздела «Частые ошибки»Lua access failed for member
Заголовок раздела «Lua access failed for member»Lua access failed for member 'SomeProperty'Свойство или метод отсутствует в текущем контексте либо не поддерживает выбранную операцию. Например, getter-only свойство нельзя присвоить, а client-only API нельзя вызвать из server.lua.
Проверьте отметку контекста и режим get/set на странице нужного API.
attempt to call a nil value
Заголовок раздела «attempt to call a nil value»attempt to call a nil value (global 'type')Глобальная функция не предоставлена Lua-песочницей или имя написано неверно. Не все функции стандартного Lua доступны модулю.
JSON не загружается
Заголовок раздела «JSON не загружается»Сначала проверьте форму корневого значения. Например, config.json должен содержать массив:
[ { "label": "Enabled", "key": "Enabled", "type": "bool", "value": true }]Объект { "Enabled": true } не соответствует формату настроек.
Sharing violation
Заголовок раздела «Sharing violation»Если проект открыт через сетевую папку или редактор удерживает файл во время записи, hot reload может сообщить Sharing violation. Дождитесь завершения сохранения и сохраните файл ещё раз. Также отключите расширения или программы, которые надолго блокируют изменяемый файл.
Ничего не выполняется в меню
Заголовок раздела «Ничего не выполняется в меню»Клиентский Lua-код запускается после входа в игровую сессию. В главном меню можно управлять модулями, но проверять main.lua нужно на загруженной карте.
Reflex-код не запускается
Заголовок раздела «Reflex-код не запускается»Проверьте, что:
- в
module.jsonуказано"IsReflex": true; - существует
scripts/server.lua; - выбран именно этот Reflex-модуль;
- другой Reflex-модуль не занимает единственный активный слот.
Когда нужен полный перезапуск
Заголовок раздела «Когда нужен полный перезапуск»Для обычных правок кода достаточно hot reload. Выключите и снова включите модуль, если его состояние выглядит неконсистентным. Полный перезапуск игры оставляйте для случаев, когда изменённый пакет не перечитывается или сама игровая сессия находится в ошибочном состоянии.
Дальше: структура модуля, редактор и подсказки API и организация Lua-кода.