Серверный цикл
Повторяющаяся логика server.lua запускается через Scheduler:OnTick(). Callback вызывается один раз на тик симуляции.
Минимальный цикл
Заголовок раздела «Минимальный цикл»local function Tick() local agent = Agents:GetLocalAgent()
if agent == nil or agent.Health == nil then return end
-- Серверная логикаend
Scheduler:OnTick(Tick)Получайте живые объекты заново. Агент или предмет, сохранённый между раундами, может стать недоступным.
Работа не на каждом тике
Заголовок раздела «Работа не на каждом тике»Для редкой проверки храните следующий целевой тик:
local TickDuration = Time:TickToSeconds(1)local IntervalTicks = math.ceil(0.25 / TickDuration)local NextUpdateTick = 0
local function Tick() if Time.Tick < NextUpdateTick then return end
NextUpdateTick = Time.Tick + IntervalTicks
-- Выполняется не чаще четырёх раз в секундуend
Scheduler:OnTick(Tick)math.ceil(seconds / tickDuration) не сокращает заданный положительный интервал на один тик из-за погрешности преобразования.
CPU-бюджет
Заголовок раздела «CPU-бюджет»Reflex server имеет ограниченный бюджет выполнения. Проверить остаток можно через CpuLimit:
if CpuLimit.RemainingCpuTime < 0.2 then returnendЭто аварийная защита, а не замена оптимизации. Сначала:
- уменьшайте частоту тяжёлых обходов;
- выходите раньше при отсутствии агента или нужного состояния;
- не формируйте и не отправляйте одинаковые таблицы каждый тик;
- используйте
LengthAPI-массива и не обходите коллекцию повторно без необходимости.
Управление подпиской
Заголовок раздела «Управление подпиской»OnTick() возвращает EventSubscription:
local subscription
subscription = Scheduler:OnTick(function() if DefusalGame.IsGameEnded then subscription:Cancel() return endend)Сохраняйте ссылку, если цикл должен останавливаться до reload.
Ошибка контекста останавливает выполнение
Заголовок раздела «Ошибка контекста останавливает выполнение»В server.lua нет OnFrame, UI, камер и клиентского ввода. Обращение к отсутствующему члену может завершить текущую Lua-логику. Не используйте пробные вызовы недоступного API внутри основного цикла.