Almacenamiento KVP en FiveM: guía de SetResourceKvp y GetResourceKvpString

Guarda configuración del cliente sin base de datos usando KVP en FiveM: SetResourceKvp, GetResourceKvpString, SetResourceKvpInt, DeleteResourceKvp, json.encode para tablas, y sus límites.

Quieres que un script recuerde una configuración entre sesiones: el volumen de una radio, una posición de HUD, la última pestaña que un jugador usó en un menú. Una tabla de base de datos por configuración es demasiado, y un archivo no es posible en el cliente. FiveM tiene un almacén clave-valor integrado para exactamente esto, llamado KVP.

Este artículo cubre las funciones, cómo almacenar tablas, dónde viven los datos, y qué no debes poner en él.

Las funciones

KVP almacena un valor bajo una clave. Las cadenas, enteros y flotantes tienen sus propias funciones:

Tarea Función
Guarda una cadena SetResourceKvp(key, value)
Lee una cadena GetResourceKvpString(key)
Guarda un entero SetResourceKvpInt(key, value)
Lee un entero GetResourceKvpInt(key)
Guarda un flotante SetResourceKvpFloat(key, value)
Lee un flotante GetResourceKvpFloat(key)
Elimina una clave DeleteResourceKvp(key)
lua
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')

Ten en cuenta la diferencia en "no encontrado": el lector de cadena da nil, mientras que los lectores de números dan 0. Si 0 es un valor válido para tu configuración, guárdalo como cadena, o mantén una segunda clave que diga que el valor fue establecido.

Siempre proporciona un valor por defecto

Un jugador nuevo no tiene nada guardado aún, así que lee con un respaldo:

lua
local function getVolume()
    local saved = GetResourceKvpString('volume')
    return saved and tonumber(saved) or 0.5
end

Almacenar tablas con json.encode

KVP solo conoce cadenas y números. Para una tabla, serialízala:

lua
local settings = { volume = 0.6, hud = { x = 40, y = 12 }, tabs = { 'home', 'bank' } }
SetResourceKvp('settings', json.encode(settings))
lua
local raw = GetResourceKvpString('settings')
local settings = raw and json.decode(raw) or { volume = 0.5, hud = { x = 0, y = 0 }, tabs = {} }

json está disponible en cada recurso Lua de FiveM, sin importación. Siempre maneja el caso donde la clave no existe, y mantén la tabla almacenada pequeña: este no es un lugar para listas grandes.

Consejo: pon una versión en la tabla, como version = 1. Cuando cambies el diseño en una actualización posterior, puedes leer la forma antigua y convertirla en lugar de bloquearte en un campo faltante.

Dónde se almacena

El KVP del cliente vive en la computadora del jugador, en la carpeta de datos de FiveM, no en tu servidor. Se mantiene por recurso y por servidor: la misma clave en el mismo recurso en otro servidor es un valor diferente, y dos recursos pueden ambos usar la clave volume sin tocarse.

Eso tiene tres consecuencias:

  • Reinstalar FiveM o limpiar su carpeta de datos puede borrarlo. Si a un jugador se le dice que limpia el caché, pídele que mantenga los datos de KVP cuando pueda.
  • Un jugador que juega desde dos PCs tiene dos conjuntos separados de configuración.
  • No puedes leer el KVP de un jugador desde el servidor. Es una característica del cliente.

Cuidado: los datos son un archivo local simple bajo el control del jugador. Un jugador puede editarlo, borrarlo o copiarlo a un amigo. Nunca mantengas nada que el servidor deba confiar ahí: dinero, objetos, permisos, cooldowns, banderas de ban o progreso con recompensa.

KVP del servidor

Las mismas funciones existen en el servidor. Ahí los datos se guardan en el disco del servidor en la carpeta de datos del servidor, por recurso, y sobreviven reinicios:

lua
-- server
SetResourceKvp('last_restart', tostring(os.time()))
local last = GetResourceKvpString('last_restart')

Es práctico para pequeños valores globales que no merecen una tabla SQL: un contador, una bandera de característica toggled con un comando, la fecha del último evento. Para cualquier cosa con muchas filas, o que quieras consultar, editar a mano o respaldar con el resto de tus datos, usa la base de datos (guía de consultas oxmysql). El KVP del servidor no es visible en tu herramienta SQL, y respaldar el servidor necesita la carpeta de datos también.

Escribiendo muchas claves

Cada SetResourceKvp escribe al disco. Si guardas muchas claves a la vez, por ejemplo cuando un jugador cierra un menú de configuración, FiveM ofrece una variante que no escribe inmediatamente y una llamada que vacía el lote:

lua
SetResourceKvpNoSync('a', '1')
SetResourceKvpNoSync('b', '2')
SetResourceKvpNoSync('c', '3')
FlushResourceKvp()

Para un puñado de claves guardadas de vez en cuando, las funciones normales están bien. No escribas en cada fotograma, por ejemplo mientras se arrastra un deslizador: guarda cuando el jugador suelta.

Listando claves

Para encontrar todas las claves que comienzan con un prefijo, usa las funciones de búsqueda:

lua
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

Prefija tus claves con un nombre corto de lo que son (hud:x, hud:y) así esto permanece fácil.

Cuándo usar algo más

Necesitas almacenar Usa
Una preferencia de UI o una configuración local KVP del cliente
Un pequeño valor global en el servidor KVP del servidor
Datos del jugador en los que el servidor confía Una tabla de base de datos
Datos compartidos entre jugadores Base de datos del servidor, o una state bag para estado en vivo

Checklist

Síntoma Solución
La configuración es nil para jugadores nuevos Lee con un valor por defecto
El 0 guardado se ve como no guardado Los lectores de números devuelven 0 cuando falta: guarda como cadena, o añade una bandera
Necesita guardar una tabla json.encode para guardar, json.decode para leer
Los jugadores editan sus valores guardados No almacenes nada que el servidor confíe en KVP
La configuración se pierde en otra PC o servidor KVP es por computadora y por servidor: esperado
Muchas escrituras seguidas Guarda una vez cuando el jugador termina, o usa SetResourceKvpNoSync con FlushResourceKvp

Respuestas rápidas

¿Dónde se almacenan los datos de KVP en FiveM?

El KVP del cliente se guarda en la PC propia del jugador, en la carpeta de datos de FiveM, por recurso y por servidor. El KVP del servidor se guarda en el disco del servidor, en la carpeta de datos del servidor.

¿Puedo almacenar una tabla en KVP?

No directamente. Codifícala con json.encode(table), guarda la cadena, y léela de vuelta con json.decode.

¿Es KVP seguro para dinero, inventario o bans?

No. Un cliente puede editar sus propios datos de KVP, así que solo mantén preferencias ahí, como un volumen o un diseño de UI. Cualquier cosa con valor pertenece a la base de datos del servidor.

Scripts que evitan este problema

Clothing DesignerDiseña ropa dentro de FiveM — pincel, capas, imágenes e IA — y póntela.Ver script →Mic PhoneUn móvil plegable que se abre en tablet y llega al móvil real del jugador.Ver script →Hookah SystemCachimbas y muebles de lounge colocables, con más de 50 sabores y efectos.Ver script →

Sigue leyendo