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

Первый Reflex-модуль

Reflex-модуль состоит из двух частей:

  • scripts/main.lua выполняется на клиенте игрока;
  • scripts/server.lua выполняется в серверном контексте этого игрока.

Они имеют разные наборы API и обмениваются Lua-таблицами через Network.

  1. Откройте меню модулей и нажмите Create.
  2. Назовите модуль HelloReflex.
  3. Включите Is Reflex.
  4. Подтвердите создание и выберите этот Reflex-модуль активным.
  5. Запустите пользовательскую игровую сессию.

В папке проекта должны находиться обе точки входа:

HelloReflex/
├── module.json
└── scripts/
├── main.lua
└── server.lua

Откройте scripts/main.lua:

scripts/main.lua
Network:OnTableReceived(function(data)
if data.kind == "server_tick" then
print("Server tick: " .. tostring(data.tick))
end
end)
Network:SendTable({
kind = "get_server_tick"
})

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

Откройте scripts/server.lua:

scripts/server.lua
Network:OnTableReceived(function(data)
if data.kind == "get_server_tick" then
Network:SendTable({
kind = "server_tick",
tick = Time.Tick
})
end
end)

Сервер проверяет тип сообщения и отправляет текущий тик обратно. После загрузки обеих частей в консоли клиента появится строка Server tick: ....

Если ответ не появился сразу после hot reload, сохраните main.lua ещё раз: клиентский запрос должен отправиться после готовности серверной части.

Не переносите клиентский код в server.lua без проверки справочника.

Возможность main.lua server.lua
ImGui, UI, Cameras
Scheduler:OnFrame()
Scheduler:OnTick()
Network
Серверные методы игрового API Ограничено

На страницах API клиентские и серверные методы отмечены отдельно.

Можно передавать строки, числа, boolean и вложенные Lua-таблицы. Функции и объекты API, например Agent или Vector3, не сериализуются.

Передавайте составные значения как числа:

Network:SendTable({
position = {
x = position.x,
y = position.y,
z = position.z
}
})
  • проверяйте поле типа сообщения, например kind;
  • проверяйте диапазон и смысл каждого значения от клиента;
  • не считайте клиентские данные достоверными только потому, что они пришли через Network;
  • не вызывайте клиентские API из server.lua;
  • используйте Scheduler:OnTick() для повторяющейся серверной работы.

Дальше изучите Network, Scheduler и страницы нужных игровых объектов.