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) |
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:
local function getVolume()
local saved = GetResourceKvpString('volume')
return saved and tonumber(saved) or 0.5
endjson.encode ile tabloları depolama
KVP yalnızca dizeler ve sayıları bilir. Bir tablo için, onu seri hale getirin:
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 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 = 1gibi 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:
-- 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:
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:
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)
endAnahtarları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 →