FiveM KVP хранилище: SetResourceKvp и GetResourceKvpString руководство
Сохраняйте настройки клиента без базы данных используя FiveM KVP: SetResourceKvp, GetResourceKvpString, SetResourceKvpInt, DeleteResourceKvp, json.encode для таблиц, и его ограничения.
Вы хотите скрипт помнить настройку между сеансами: громкость радио, позицию HUD, последнюю вкладку которую игрок использовал в меню. Таблица базы данных на настройку это слишком много, и файл невозможен на клиенте. FiveM имеет встроенное хранилище ключ-значение ровно для этого, называется KVP.
Эта статья охватывает функции, как сохранять таблицы, где данные живут, и что вы не должны там помещать.
Функции
KVP хранит значение под ключом. Строки, целые и плавающие точки имеют свои собственные функции:
| Задача | Функция |
|---|---|
| Сохраняйте строку | SetResourceKvp(key, value) |
| Читайте строку | GetResourceKvpString(key) |
| Сохраняйте целое число | SetResourceKvpInt(key, value) |
| Читайте целое число | GetResourceKvpInt(key) |
| Сохраняйте число с плавающей точкой | SetResourceKvpFloat(key, value) |
| Читайте число с плавающей точкой | GetResourceKvpFloat(key) |
| Удалите ключ | DeleteResourceKvp(key) |
SetResourceKvp('volume', '0.6')
local volume = GetResourceKvpString('volume') -- '0.6', or nil if it was never saved
SetResourceKvpInt('hud:x', 40)
local x = GetResourceKvpInt('hud:x') -- 40, or 0 if it was never saved
DeleteResourceKvp('volume')Отметьте разницу в "не найдено": читатель строк даёт nil, в то время как читатели чисел дают 0. Если 0 это валидное значение для вашей настройки, сохраняйте это как строку, или держите второй ключ который говорит значение было установлено.
Всегда предоставляйте по умолчанию
Новый игрок ничего не сохранил ещё, поэтому читайте с fallback:
local function getVolume()
local saved = GetResourceKvpString('volume')
return saved and tonumber(saved) or 0.5
endСохранение таблиц с json.encode
KVP знает только строки и числа. Для таблицы, сериализуйте её:
local settings = { volume = 0.6, hud = { x = 40, y = 12 }, tabs = { 'home', 'bank' } }
SetResourceKvp('settings', json.encode(settings))local raw = GetResourceKvpString('settings')
local settings = raw and json.decode(raw) or { volume = 0.5, hud = { x = 0, y = 0 }, tabs = {} }json доступен в каждом FiveM Lua ресурсе, без импорта. Всегда обрабатывайте случай где ключ не существует, и держите сохранённую таблицу маленькой: это не место для больших списков.
Совет: поместите версию в таблицу, такую как
version = 1. Когда вы измените макет в позднейшем обновлении, вы можете прочитать старую форму и конвертировать её вместо краша на отсутствующем поле.
Где оно хранится
Клиент KVP живёт на компьютере игрока, в папке данных FiveM, не на вашем сервере. Это держится на ресурс и на сервер: одинаковый ключ в одинаковом ресурсе на другом сервере это другое значение, и два ресурса могут оба использовать ключ volume без трогания друг друга.
Это имеет три последствия:
- Переустановка FiveM или стирание его папки данных может удалить его. Если игроку сказано очистить кеш, попросите их держать данные KVP когда они могут.
- Игрок который играет с двух ПК имеет два отдельных набора настроек.
- Вы не можете читать KVP игрока с сервера. Это клиент функция.
Внимание: данные это обычный локальный файл под контролем игрока. Игрок может редактировать его, удалить его или копировать его другу. Никогда не держите что-либо сервер должен верить там: деньги, предметы, разрешения, cooldowns, флаги банов или прогресс с наградой.
Сервер KVP
Одинаковые функции существуют на сервере. Там данные сохраняются на диск сервера в папке данных сервера, на ресурс, и переживают перезагрузки:
-- server
SetResourceKvp('last_restart', tostring(os.time()))
local last = GetResourceKvpString('last_restart')Это удобно для маленьких глобальных значений которые не заслуживают таблицу SQL: счётчик, флаг функции переключённый с команды, дата последнего события. Для чего-либо с много рядами, или что вы хотите запросить, редактировать вручную или резервировать с остальными вашими данными, используйте базу данных (oxmysql руководство запросов). Сервер KVP не видим в вашем SQL инструменте, и резервирование сервера нужна папка данных также.
Запись много ключей
Каждый SetResourceKvp записывает на диск. Если вы сохраняете много ключей сразу, например когда игрок закрывает меню настроек, FiveM предлагает вариант который не пишет сразу и вызов который очищает пакет:
SetResourceKvpNoSync('a', '1')
SetResourceKvpNoSync('b', '2')
SetResourceKvpNoSync('c', '3')
FlushResourceKvp()Для горсти ключей сохранённых сейчас и потом, нормальные функции в порядке. Не пишите на каждый кадр, например пока ползунок перетаскивается: сохраняйте когда игрок отпускает.
Перечисление ключей
Чтобы найти все ключи которые начинаются с префикса, используйте функции поиска:
local handle = StartFindKvp('hud:')
if handle ~= -1 then
local key
repeat
key = FindKvp(handle)
if key then print(key, GetResourceKvpString(key)) end
until not key
EndFindKvp(handle)
endПрефиксируйте ваши ключи с коротким именем что они есть (hud:x, hud:y) так что это остаётся легким.
Когда использовать что-то другое
| Вы нуждаетесь хранить | Используйте |
|---|---|
| UI предпочтение или локальная настройка | Клиент KVP |
| Маленькое глобальное значение на сервере | Сервер KVP |
| Данные игрока сервер полагается | Таблица базы данных |
| Данные разделённые между игроками | Сервер база данных, или state bag для живого состояния |
Контрольный список
| Симптом | Решение |
|---|---|
Настройка это nil для новых игроков |
Читайте со значением по умолчанию |
Сохранённый 0 выглядит как не сохранённый |
Читатели чисел возвращают 0 когда отсутствует: храните как строку, или добавьте флаг |
| Нужно сохранить таблицу | json.encode чтобы сохранить, json.decode чтобы прочитать |
| Игроки редактируют свои сохранённые значения | Не сохраняйте что-либо сервер верит в KVP |
| Настройка потеряна на другом ПК или сервере | KVP это на компьютер и на сервер: ожидаемо |
| Много записей подряд | Сохраняйте один раз когда игрок завершит, или используйте SetResourceKvpNoSync с FlushResourceKvp |
Короткие ответы
Где хранятся данные FiveM KVP?
Клиент KVP сохраняется на собственном ПК игрока, в папке данных FiveM, на ресурс и на сервер. Сервер KVP сохраняется на диск сервера, в папке данных сервера.
Могу ли я сохранить таблицу в KVP?
Не напрямую. Закодируйте её с json.encode(table), сохраняйте строку, и читайте обратно с json.decode.
Безопасен ли KVP для денег, инвентаря или банов?
Нет. Клиент может редактировать свои собственные данные KVP, поэтому только держите предпочтения там, такие как громкость или макет UI. Что-либо с ценностью принадлежит базе данных сервера.
Скрипты без этой проблемы
Clothing DesignerСоздавайте одежду прямо в FiveM — кисть, слои, импорт изображений и ИИ — и носите её.Смотреть скрипт →
Mic PhoneСкладной телефон, который раскладывается в планшет и работает и на настоящем телефоне игрока.Смотреть скрипт →
Hookah SystemУстанавливаемые кальяны и лаунж-мебель: более 50 вкусов и эффектов.Смотреть скрипт →