Armazenamento KVP em FiveM: guia de SetResourceKvp e GetResourceKvpString

Salve configurações de cliente sem banco de dados usando KVP de FiveM: SetResourceKvp, GetResourceKvpString, SetResourceKvpInt, DeleteResourceKvp, json.encode para tabelas, e seus limites.

Você quer que um script lembre de uma configuração entre sessões: o volume de um rádio, uma posição HUD, a última aba que um jogador usou em um menu. Uma tabela de banco de dados por configuração é muito, e um arquivo não é possível no cliente. FiveM tem um armazenamento chave-valor integrado exatamente para isso, chamado KVP.

Este artigo cobre as funções, como armazenar tabelas, onde os dados vivem, e o que você não deve colocar nele.

As funções

KVP armazena um valor sob uma chave. Strings, inteiros e floats têm suas próprias funções:

Tarefa Função
Salvar uma string SetResourceKvp(key, value)
Ler uma string GetResourceKvpString(key)
Salvar um inteiro SetResourceKvpInt(key, value)
Ler um inteiro GetResourceKvpInt(key)
Salvar um float SetResourceKvpFloat(key, value)
Ler um float GetResourceKvpFloat(key)
Remover uma chave 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')

Observe a diferença em "não encontrado": o leitor de string dá nil, enquanto os leitores de número dão 0. Se 0 é um valor válido para sua configuração, armazene como string, ou mantenha uma segunda chave que diz que o valor foi definido.

Sempre forneça um padrão

Um novo jogador não tem nada salvo ainda, então leia com um fallback:

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

Armazenando tabelas com json.encode

KVP só conhece strings e números. Para uma tabela, serialize-a:

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á disponível em todo recurso Lua de FiveM, sem importação. Sempre lide com o caso onde a chave não existe, e mantenha a tabela armazenada pequena: este não é um lugar para grandes listas.

Dica: coloque uma versão na tabela, como version = 1. Quando você muda o layout em uma atualização posterior, você pode ler a forma antiga e convertê-la em vez de falhar em um campo faltante.

Onde está armazenado

KVP do cliente vive no computador do jogador, na pasta de dados FiveM, não em seu servidor. É mantido por recurso e por servidor: a mesma chave no mesmo recurso em outro servidor é um valor diferente, e dois recursos podem ambos usar a chave volume sem se tocar.

Isso tem três consequências:

  • Reinstalar FiveM ou limpar sua pasta de dados pode apagá-lo. Se um jogador for instruído a clear the cache, faça-os manter os dados KVP quando puderem.
  • Um jogador que joga de dois PCs tem dois conjuntos separados de configurações.
  • Você não pode ler KVP de um jogador do servidor. É um recurso do cliente.

Atenção: os dados são um arquivo local simples sob o controle do jogador. Um jogador pode editá-lo, deletá-lo ou copiá-lo para um amigo. Nunca mantenha nada que o servidor deve confiar lá: dinheiro, itens, permissões, cooldowns, flags de ban ou progresso com recompensa.

KVP do servidor

As mesmas funções existem no servidor. Lá os dados são salvos no disco do servidor na pasta de dados do servidor, por recurso, e sobrevivem a reinicializações:

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

É útil para pequenos valores globais que não merecem uma tabela SQL: um contador, uma flag de recurso alternada com um comando, a data do último evento. Para qualquer coisa com muitas linhas, ou que você queira consultar, editar manualmente ou fazer backup com o resto de seus dados, use o banco de dados (oxmysql queries guide). KVP do servidor não é visível em sua ferramenta SQL, e backing up the server precisa da pasta de dados também.

Escrevendo muitas chaves

Cada SetResourceKvp escreve em disco. Se você salvar muitas chaves de uma vez, por exemplo quando um jogador fecha um menu de configurações, FiveM oferece uma variante que não escreve imediatamente e uma chamada que libera o lote:

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

Para um punhado de chaves salvas de vez em quando, as funções normais são boas. Não escreva a cada frame, por exemplo enquanto um slider é arrastado: salve quando o jogador soltá-lo.

Listando chaves

Para encontrar todas as chaves que começam com um prefixo, use as funções de busca:

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

Prefixe suas chaves com um nome curto do que elas são (hud:x, hud:y) para que isso permaneça fácil.

Quando usar algo diferente

Você precisa armazenar Use
Uma preferência de UI ou uma configuração local KVP do cliente
Um pequeno valor global no servidor KVP do servidor
Dados do jogador que o servidor depende Uma tabela de banco de dados
Dados compartilhados entre jogadores Banco de dados do servidor, ou um state bag para estado ao vivo

Lista de verificação

Sintoma Solução
Configuração é nil para novos jogadores Leia com um valor padrão
Salvo 0 parece não salvo Leitores de número retornam 0 quando faltando: armazene como string, ou adicione uma flag
Preciso salvar uma tabela json.encode para armazenar, json.decode para ler
Jogadores editam seus valores salvos Não armazene nada que o servidor confie em KVP
Configuração perdida em outro PC ou servidor KVP é por computador e por servidor: esperado
Muitas escritas seguidas Salve uma vez quando o jogador terminar, ou use SetResourceKvpNoSync com FlushResourceKvp

Respostas rápidas

Onde os dados KVP de FiveM são armazenados?

KVP do cliente é salvo no próprio PC do jogador, na pasta de dados FiveM, por recurso e por servidor. KVP do servidor é salvo no disco do servidor, na pasta de dados do servidor.

Posso armazenar uma tabela em KVP?

Não diretamente. Codifique com json.encode(table), armazene a string, e leia de volta com json.decode.

KVP é seguro para dinheiro, inventário ou bans?

Não. Um cliente pode editar seus próprios dados KVP, então apenas mantenha preferências lá, como um volume ou um layout de UI. Qualquer coisa com valor pertence ao banco de dados do servidor.

Scripts sem esse problema

Clothing DesignerCrie roupas dentro do FiveM — pincel, camadas, importação de imagens e IA — e vista na hora.Ver script →Mic PhoneUm celular dobrável que abre em tablet e chega ao celular de verdade do jogador.Ver script →Hookah SystemNarguilés e móveis de lounge posicionáveis, com mais de 50 sabores e efeitos.Ver script →

Continue lendo