Протокол Network
Network передаёт таблицы между main.lua и server.lua. Чтобы модуль оставался понятным, задайте небольшой протокол вместо набора несвязанных полей.
Всегда указывайте kind
Заголовок раздела «Всегда указывайте kind»Network:SendTable({ kind = "settings", enabled = true, threshold = 30})Получатель сначала выбирает тип сообщения:
Network:OnTableReceived(function(data) if data.kind == "settings" then -- Применить настройки elseif data.kind == "request_state" then -- Отправить состояние endend)Так один callback обслуживает весь протокол без неоднозначности.
Разделяйте команды и состояние
Заголовок раздела «Разделяйте команды и состояние»Удобная схема имён:
set_settings— клиент передаёт настройки;request_state— клиент просит снимок;state— сервер отправляет подтверждённое состояние;event— сервер сообщает о произошедшем событии.
Не используйте возвращаемое значение SendTable() как ответ: метод возвращает nil. Ответ — отдельное входящее сообщение.
Поддерживаемые данные
Заголовок раздела «Поддерживаемые данные»Передавайте:
string;number;boolean;- вложенные таблицы;
- последовательные таблицы.
Разложите структуры на числа:
local function PackVector3(value) return { x = value.x, y = value.y, z = value.z }endVector3, Agent, Texture, функции и nil-поля не сохраняются транспортом.
Проверяйте вход сервера
Заголовок раздела «Проверяйте вход сервера»Lua-песочница не предоставляет type, поэтому используйте доступные безопасные преобразования и явные сравнения:
local function ApplySettings(data) local threshold = tonumber(data.threshold)
if threshold ~= nil then threshold = math.max(1, math.min(100, threshold)) State.threshold = threshold end
State.enabled = data.enabled == trueendНикогда не используйте клиентское число как индекс, дистанцию или длительность без диапазона.
Не отправляйте состояние каждый кадр
Заголовок раздела «Не отправляйте состояние каждый кадр»Отправляйте сообщение, когда значение действительно изменилось:
local LastHealth = nil
local function SendHealthIfChanged(health) if health == LastHealth then return end
LastHealth = health Network:SendTable({ kind = "health_state", health = health })endЭто уменьшает трафик и количество Lua-callbacks.
Начальная синхронизация
Заголовок раздела «Начальная синхронизация»Обе стороны должны уметь восстановить состояние независимо от порядка загрузки:
- сервер хранит безопасные значения по умолчанию;
- клиент регистрирует приём;
- клиент отправляет настройки;
- клиент запрашивает состояние;
- сервер отвечает полным снимком.
Полный пример находится на странице готового Reflex-модуля.