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

Разработка и отладка

Для папочного модуля обычный цикл разработки занимает несколько секунд:

  1. запустите пользовательскую игровую сессию;
  2. включите модуль;
  3. измените файл в редакторе;
  4. сохраните его;
  5. проверьте результат и консоль.

Игра следит за файлами внутри папочного модуля и запрашивает перезагрузку после сохранения. Это относится к Lua-коду, конфигурации и ресурсам.

Некоторые файлы требуют дополнительного обновления:

  • изменение inputs.json перестраивает действия ввода;
  • изменение module.json обновляет метаданные и может перезагрузить клиентские модули;
  • изменение scripts/server.lua обновляет серверную часть активного Reflex-модуля.

При hot reload прежний экземпляр Lua-модуля заменяется новым. Поэтому инициализируйте состояние, подписки и окна в коде так, как будто файл запускается заново.

Консоль открывается клавишей ~. В ней отображаются:

  • сообщения print();
  • ошибки Lua с именем файла и строкой;
  • сообщения загрузки и hot reload;
  • предупреждения о неверных JSON-файлах и ресурсах.

Возле поля Search находится значок фильтра. Он управляет видимостью категорий сообщений. Также в консоли выбирается раздел или источник логов.

Проверьте оба пункта:

  1. выбран раздел вашего модуля;
  2. в фильтре включены информационные сообщения.

После этого ищите строки вида:

[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 'SomeProperty'

Свойство или метод отсутствует в текущем контексте либо не поддерживает выбранную операцию. Например, getter-only свойство нельзя присвоить, а client-only API нельзя вызвать из server.lua.

Проверьте отметку контекста и режим get/set на странице нужного API.

attempt to call a nil value (global 'type')

Глобальная функция не предоставлена Lua-песочницей или имя написано неверно. Не все функции стандартного Lua доступны модулю.

Сначала проверьте форму корневого значения. Например, config.json должен содержать массив:

[
{
"label": "Enabled",
"key": "Enabled",
"type": "bool",
"value": true
}
]

Объект { "Enabled": true } не соответствует формату настроек.

Если проект открыт через сетевую папку или редактор удерживает файл во время записи, hot reload может сообщить Sharing violation. Дождитесь завершения сохранения и сохраните файл ещё раз. Также отключите расширения или программы, которые надолго блокируют изменяемый файл.

Клиентский Lua-код запускается после входа в игровую сессию. В главном меню можно управлять модулями, но проверять main.lua нужно на загруженной карте.

Проверьте, что:

  • в module.json указано "IsReflex": true;
  • существует scripts/server.lua;
  • выбран именно этот Reflex-модуль;
  • другой Reflex-модуль не занимает единственный активный слот.

Для обычных правок кода достаточно hot reload. Выключите и снова включите модуль, если его состояние выглядит неконсистентным. Полный перезапуск игры оставляйте для случаев, когда изменённый пакет не перечитывается или сама игровая сессия находится в ошибочном состоянии.

Дальше: структура модуля, редактор и подсказки API и организация Lua-кода.