FiveM KVP depolaması: SetResourceKvp ve GetResourceKvpString kılavuzu

FiveM KVP kullanarak veritabanı olmadan istemci ayarlarını kaydedin: SetResourceKvp, GetResourceKvpString, SetResourceKvpInt, DeleteResourceKvp, tablolar için json.encode ve sınırları.

Bir komut dosyasının oturumlar arasında bir ayarı hatırlamasını istiyorsunuz: radyonun ses seviyesi, HUD konumu, oyuncunun bir menüde kullandığı son sekme. Ayar başına bir veritabanı tablosu çok fazla ve dosya istemci tarafında mümkün değil. FiveM bunun için tam olarak KVP adlı yerleşik bir anahtar değer deposuna sahiptir.

Bu makale işlevleri, tabloları depolamayı, verilerin nerede yaşadığını ve içine koymamanız gerekenleri kapsar.

İşlevler

KVP bir değeri anahtar altında depolar. Dizeler, tamsayılar ve küsuratlılar kendi işlevlerine sahiptir:

Görev İşlev
Dize kaydedin SetResourceKvp(key, value)
Dizeyi okuyun GetResourceKvpString(key)
Tamsayı kaydedin SetResourceKvpInt(key, value)
Tamsayıyı okuyun GetResourceKvpInt(key)
Kesirlili sayı kaydedin SetResourceKvpFloat(key, value)
Kesirlili sayıyı okuyun GetResourceKvpFloat(key)
Anahtarı kaldırın 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')

"Bulunamadı" farkına dikkat edin: dize okuyucu nil verirken sayı okuyucuları 0 verir. 0 ayarınız için geçerli bir değerse, onu dize olarak depolayın veya değerin ayarlandığını söyleyen ikinci bir anahtar tutun.

Her zaman varsayılan sağlayın

Yeni oyuncunun henüz kaydedilmiş bir şeyi yok, bu nedenle geri dönüşle okuyun:

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

json.encode ile tabloları depolama

KVP yalnızca dizeler ve sayıları bilir. Bir tablo için, onu seri hale getirin:

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 ithalatı olmadan her FiveM Lua kaynağında mevcuttur. Her zaman anahtarın olmama durumunu işleyin ve depolanan tabloyu küçük tutun: bu büyük listeler için bir yer değil.

İpucu: tabloya version = 1 gibi bir sürüm koyun. Sonraki bir güncellemede düzeni değiştirdiğinizde, eski şekli okuyabilir ve eksik alan üzerine çökmek yerine dönüştürebilirsiniz.

Nerede depolanır

İstemci KVP oyuncunun bilgisayarında, FiveM veri klasöründe yaşar; sunucunuzda değil. Kaynak başına ve sunucu başına tutulur: başka bir sunucuda aynı kaynaktaki aynı anahtar farklı bir değer ve iki kaynak her ikisi de anahtar volume kullanabilir birbirlerine dokunmadan.

Bunun üç sonucu vardır:

  • FiveM'i yeniden yüklemek veya veri klasörünü silmek onu silebilir. Oyuncudan önbelleği temizlemesi söylenirse, yapabilecekleri zaman KVP verilerini tutmalarını sağlayın.
  • İki PC'den oynayan oyuncunun ayrı ayar setidir.
  • Sunucudan oyuncu KVP'sini okuyamaz. İstemci özelliğidir.

Dikkat: veriler oyuncunun kontrolü altında düz bir yerel dosyadır. Oyuncu onu düzenleyebilir, silebilir veya arkadaşına kopyalayabilir. Sunucunun güvenmesi gereken hiçbir şey burada tutmayın: para, öğeler, izinler, soğuk kalış, yasaklama bayrakları veya ödül ile ilerleme.

Sunucu KVP

Aynı işlevler sunucuda vardır. Orada veriler sunucu disk üzerinde sunucu veri klasöründe, kaynak başına kaydedilir ve yeniden başlatmaları başarıyla geçirir:

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

SQL tablosunu hak etmeyen küçük genel değerler için el yordamı: sayaç, komut ile geçilen özellik bayrağı, son etkinliğin tarihi. Birçok satırı olanlar veya sorgulamak, elle düzenlemek veya kalanıyla bir yedek çıkarmak istediğiniz şeyler için, veritabanını kullanın (oxmysql sorguları kılavuzu). Sunucu KVP, SQL aracında görülmez ve sunucu yedeklemesi de veri klasörüne ihtiyaç duyar.

Bir sürü anahtar yazma

Her SetResourceKvp diske yazıyor. Bir sürü anahtarı birden kaydederseniz; örneğin oyuncu bir ayarlar menüsünü kapattığında, FiveM hemen yazılmayan ve bir toplu işi temizleyen bir çağrı sunan bir varyant sunar:

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

Bir avuç anahtar sakırlana kaydedilir, normal işlevler iyidir. Her çerçevede yazılmayın; örneğin kaydırıcı sürüklü: oyuncu bıraktığında kaydedin.

Anahtarlar listeleniyor

Önekle başlayan tüm anahtarları bulmak için bulma işlevlerini kullanın:

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

Anahtarlarınıza ne oldukları için kısa bir ad ön ekini (hud:x, hud:y) bu kolay kalır.

Ne zaman başka birini kullanacağınız

Depolama ihtiyacı Kullan
UI tercihinde veya yerel ayarda İstemci KVP
Sunucuda küçük genel değer Sunucu KVP
Sunucunun güvendiği oyuncu verileri Veritabanı tablosu
Oyuncular arasında paylaşılan veriler Sunucu veritabanı veya canlı durum için durum çantası

Kontrol listesi

Belirti Çözüm
Ayar yeni oyuncular için nil Varsayılan değer ile okuyun
Kaydedilen 0 kaydedilmiş gibi görünür Sayı okuyucuları eksik olduğunda 0 döndürür: dize olarak depolayın veya bayrak ekleyin
Bir tablo kaydetmesi gerekir json.encode depolamak için, json.decode okumak için
Oyuncular kaydedilmiş değerlerini düzenler KVP'de sunucunun güvendiği hiçbir şey depolamayın
Diğer PC veya sunucuda kaybolmuş ayar KVP bilgisayar başına ve sunucu başına: beklenen
Arka arkaya birçok yazma Oyuncu bittiğinde bir kez kaydedin veya SetResourceKvpNoSync ile FlushResourceKvp kullanın

Kısa yanıtlar

FiveM KVP verisi nereye depolanır?

İstemci KVP oyuncunun kendi PC'sinde, FiveM veri klasöründe, kaynak başına ve sunucu başına kaydedilir. Sunucu KVP sunucu disk üzerinde sunucu veri klasöründe kaydedilir.

Bir tabloyu KVP'de depolayabilir miyim?

Doğrudan değil. json.encode(table) ile kodlayın, dizeyi depolayın ve json.decode ile geri okuyun.

KVP para, envanter veya yasaklar için güvenli midir?

Hayır. İstemci kendi KVP verilerini düzenleyebilir; bu nedenle yalnızca ses seviyesi veya UI düzeni gibi tercihler burada tutun. Değeri olan her şey sunucu veritabanına aittir.

Bu sorunu yaşatmayan scriptler

Clothing DesignerFiveM içinde kıyafet tasarlayın — fırça, katmanlar, görsel içe aktarma ve yapay zekâ — sonra giyin.Scripti gör →Mic PhoneTablete dönüşen katlanabilir bir telefon; oyuncunun gerçek telefonuna da taşınır.Scripti gör →Hookah SystemYerleştirilebilir nargileler ve lounge mobilyaları; 50+ aroma ve efekt.Scripti gör →

Okumaya devam edin