Storage
Storage — обычная Lua-таблица для локальных данных текущего модуля. Она доступна только в клиентской Lua-части; в Reflex server.lua глобальный Storage равен nil.
Storage не имеет собственного интерфейса и не синхронизируется с сервером или другими игроками. Значения видит только код этого модуля на текущем клиенте; чтобы показать их пользователю, отрисуйте их через UI или ImGui.
Как сохраняются данные
Заголовок раздела «Как сохраняются данные»Во время работы Storage является обычной таблицей в Lua-окружении модуля. При сохранении состояния клиентский менеджер модуля сериализует поддерживаемые значения, а при следующей загрузке восстанавливает их в новую таблицу. Неподдерживаемые значения не становятся постоянными.
Присваивание меняет только локальное состояние. Оно не отправляет событие, не обновляет Config и не уведомляет другой код автоматически.
Быстрый пример
Заголовок раздела «Быстрый пример»if Storage.Settings == nil then Storage.Settings = { ShowHints = true, Scale = 1 }end
Storage.Settings.Scale = 1.25Данные изолированы по модулям: другой модуль не получает эту таблицу.
Поддерживаемые значения
Заголовок раздела «Поддерживаемые значения»| Lua-значение | Сохраняется |
|---|---|
string |
✅ |
number |
✅ |
boolean, включая false |
✅ |
вложенная table |
✅ |
nil |
удаляет ключ |
Vector2, Vector3, Color и другие userdata |
❌ |
function |
❌ |
Неподдерживаемые значения молча отбрасываются при сериализации.
Для структуры вроде Vector3 сохраните отдельные числа:
local position = Vector3.new(10, 2, 5)
Storage.Position = { x = position.x, y = position.y, z = position.z}
local saved = Storage.Positionlocal restored = Vector3.new(saved.x, saved.y, saved.z)Когда данные сохраняются
Заголовок раздела «Когда данные сохраняются»Игра сохраняет Storage при штатном выключении модуля и загружает его при следующем включении.
Удаление данных
Заголовок раздела «Удаление данных»Присвойте ключу nil, затем штатно выключите модуль:
Storage.LegacyValue = nilStorage.OldSettings = nilПосле следующего включения удалённые ключи останутся nil.
Рекомендуемая структура
Заголовок раздела «Рекомендуемая структура»Храните данные под одним версионируемым ключом. Так миграции проще контролировать:
if Storage.Data == nil or Storage.Data.Version ~= 1 then Storage.Data = { Version = 1, Enabled = true, Opacity = 0.8 }endЧастые ошибки
Заголовок раздела «Частые ошибки»Сохранение userdata напрямую
Заголовок раздела «Сохранение userdata напрямую»Storage.Position = Vector3.one работает в текущей Lua-таблице, но значение исчезает при сериализации. Преобразуйте вектор в таблицу чисел.
Проверка boolean через if not
Заголовок раздела «Проверка boolean через if not»Если false является допустимым сохранённым значением, отличайте его от отсутствующего ключа:
if Storage.Enabled == nil then Storage.Enabled = trueendСоставные значения: Vector2, Vector3 и Color нужно сохранять как таблицы чисел.