FiveM'de araç özelliklerini al ve ayarla: lib, ESX ve QBCore

FiveM'de araç modlarını, renkleri ve ekstraları kaydedin ve geri yükleyin: lib.getVehicleProperties, ESX.Game.GetVehicleProperties, QBCore.Functions.GetVehicleProperties, SetVehicleModKit ve veritabanı.

Tipik semptomlar:

text
A car comes out of the garage as a stock car: no colour, no turbo, no wheels, plain plate.

Araçların görünüşü ve ayarı özellikleri denir. Bunları tutmak için, ortaya çıkarılan araçtan okuduğunuz, JSON olarak saklarsınız ve ortaya çıkardığınız sonrakine uyguladığınız. Bu makale her çerçevenin sağladığı işlevi, mod kiti hakkındaki kuralı ve sonucu veritabanında nasıl kaydedeceğini gösterir.

Özellikler neleri içerir

Özellikler tablosu garajın geri yüklemesi gereken her şeyi tutar: model, plaka, renkler, livery, moda göre modlar, tekerlek türü, lastik dumanı, neon, pencere tonu, ekstralar ve sağlık değerleri. Düz bir Lua tablosudur, bu nedenle saklama için json.encode ile metne çevirirsiniz.

ox_lib

ox_lib sunucunuzda ise, bu en kısa yoldur ve QBox'ta ihtiyacınız olan tek yoldur:

lua
-- client
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
local props = lib.getVehicleProperties(vehicle)

-- later, on a spawned vehicle
lib.setVehicleProperties(vehicle, props)

Her ikisi de istemci işlevleridir. Oyunu doğrudan okudukları için herhangi bir çerçeve ile çalışırlar.

ESX

ESX istemcide kendi çiftine sahiptir:

lua
local props = ESX.Game.GetVehicleProperties(vehicle)

ESX.Game.SetVehicleProperties(vehicle, props)

Önce nesneyi ESX = exports['es_extended']:getSharedObject() ile alın. ESX nil ise, esx:getSharedObject düzeltme bölümüne bakın.

QBCore

QBCore istemcide aynı iki işleve sahiptir:

lua
local QBCore = exports['qb-core']:GetCoreObject()

local props = QBCore.Functions.GetVehicleProperties(vehicle)

QBCore.Functions.SetVehicleProperties(vehicle, props)

QBox'ta, yukarıdaki ox_lib çiftini kullanın.

İpucu: üç çerçevenin tümünde çalışması gereken bir betik yazarsanız, hangisinin çalıştığını kontrol edin ve eşleştirilen çifti çağırın veya sadece ox_lib'ı her yerde kullanın çünkü zaten çoğu modern sunucunun bağımlılığıdır.

SetVehicleModKit ilk gelir

Oyun SetVehicleModKit ayarlanana kadar SetVehicleMod göz ardı eder. Yukarıdaki işlevler bunu işler, ancak kendi uygulama kodunu yazarsanız, bu sırada yapın:

lua
SetVehicleModKit(vehicle, 0)

SetVehicleMod(vehicle, 11, 3, false)   -- engine, level 3
SetVehicleMod(vehicle, 12, 2, false)   -- brakes
ToggleVehicleMod(vehicle, 18, true)    -- turbo

SetVehicleModKit'in ilk argümanı kittir ve 0 herkesin kullandığı kutudur. Mod türleri sayılardır: 11 motor, 12 fren, 13 iletim, 15 süspansiyon, 16 zırh ve 18 serbest bırakma yerine geçişli turbo. Renkler, tekerlek, neon ve tont SetVehicleColours, SetVehicleWheelType ve SetVehicleNeonLightEnabled gibi kendi yerel öğelere sahiptir.

Bunu elle yazmak nadiren buna değer. Uzun ve kütüphane zaten her durumu kapsar. Bunu tek seferlik bir ince ayar için kullanın, bir garaj için değil.

Veritabanına kaydedin

Özellikler uzun metin sütununda JSON metni olarak saklanır. Olağan akış şudur:

  1. İstemci araçtan özellikleri okur.
  2. Tabakla birlikte sunucuya gönderir.
  3. Sunucu kodlar ve kaydeder.
lua
-- client
local props = lib.getVehicleProperties(vehicle)
TriggerServerEvent('my_garage:saveProps', props.plate, props)
lua
-- server
RegisterNetEvent('my_garage:saveProps', function(plate, props)
    local src = source
    -- check here that this player owns that plate before saving
    MySQL.update('UPDATE owned_vehicles SET vehicle = ? WHERE plate = ?', {
        json.encode(props), plate
    })
end)

QBCore ve QBox'ta aynı çağrı player_vehicles tablosunun mods sütununu yazar. Sütun adları garaj tabloları makalesinde vardır.

Dikkat: sunucuda sahipliği kontrol etmeden istemciden plaka ve özellikleri asla güvenmeyin. Aksi takdirde bir oyuncu başka birinin aracını üzerine yazabilir. Güvenli sunucu olayları bölümüne bakın.

Araç ortaya çıktığında geri yükleyin

JSON'u okuyun, kodunu çözün, sonra araç bu istemcide var olduktan sonra uygulayın:

lua
local row = MySQL.single.await('SELECT vehicle FROM owned_vehicles WHERE plate = ?', { plate })
local props = json.decode(row.vehicle)

-- send props to the client that owns the car, which applies:
lib.setVehicleProperties(vehicle, props)

Uygulama kuralları:

  • Araç var olmalı ve yüklenmeli. CreateVehicle'den hemen sonra ağa bağlı olanlar için DoesEntityExist üzerinde beklemeyle uygulayın. Araçları ortaya çıkarma bölümüne bakın.
  • Model aynı olmalıdır. Farklı bir modelin özellikleri yanlış mod dizinleri uygulanır.
  • Araçları kontrol eden istemcide çalıştırın. Onu sahip olmayan bir istemciden uygulamak başarısız olabilir.

Yaygın sorunlar

Saklama sonrasında modlar kayıp. Araba silinirken kaydet çalıştı, bu nedenle boş bir tablo kaydettiniz. Özellikleri önce okuyun, sonra silin.

Geri yüklemeden sonra plaka değiştirir. Kaydedilen plaka özelliklerin bir parçasıdır. Bir tabakla ortaya çıkarırsanız ve başka bir özellik tabakasını uygulamak için, özellikleri kazanır. Her ikisinin de eşleştiğinden emin olun veya anahtarlar ve veritabanı uyuşmazlıkları durur.

Renkler yanlış. Özel bir renk kendi RGB değerleriyle saklanır, bazı eski betikler bunu geri yüklemez. Çerçevenizin geçerli işlevini kullanın.

JSON çok büyük veya geçersiz. vehicle sütunu uzun metin türü olmalıdır ve veriler json.encode'den gelmelidir. Karma sayı ve dize biçiminde anahtarlara sahip bir tablo bir nesne yerine bir liste olarak kodlayabilir, bu nedenle hata ayıklamada kaydedilen bir satırı her zaman yükleyin ve karşılaştırın.

Özel veya eklenti arabaları. Özel mod parçaları modelin meta ve akışına bağlıdır. Bir parça modelden eksikse, dizin hiçbir şey yapmaz. Eklenti arabaları ekleme bölümüne bakın.

Kontrol listesi

Belirti Çözüm
Araba stok ortaya çıkar Aracı var olduktan sonra, lib.setVehicleProperties veya çerçeve işleviyle özellikleri uygulayın
SetVehicleMod hiçbir şey yapmaz Önce SetVehicleModKit(vehicle, 0) çağırın
Özellikler yalnızca istemcide çalışır Al ve ayarla istemcide çalış, sunucuda kaydedin
Geri yüklemeden sonra plaka değiştirir Plakaları özelliklerde ve ortaya çıkışta aynı tutun
Herkes araba üzerine yazabilir Kaydetmeden önce sunucuda plaka sahipliğini kontrol edin
Modlar mağazada kayboluyor Aracı silmeden önce özellikleri okuyun
QBox sunucu ox_lib çiftini kullanın

Kısa yanıtlar

Neden araç modlarım ortaya çıktıktan sonra uygulanmıyor?

Modlar yalnızca mod kiti SetVehicleModKit(vehicle, 0) ile ayarlandıktan sonra uygulanır. Özellik işlevleri bunu sizin için yapar, ancak elle yazılmış SetVehicleMod çağrılarının bir döngüsü önce ihtiyaç duyar. Araç da var olmalı ve yüklenmeli.

Bu işlevler sunucuda çalışır mı?

Hayır. Özellikleri almak ve ayarlamak istemci yerel öğeleri kullanır, bu nedenle bunları istemcide çalıştırın ve sunucuda kaydetmek için sonucu gönderin.

QBox'ta hangisini kullanmalıyım?

lib.getVehicleProperties ve lib.setVehicleProperties ox_lib sürümleri. QBox ox_lib etrafında oluşturulmuştur ve aynı işlevler ox_lib çalıştıran ESX ve QBCore sunucularda da çalışır.

Bu sorunu yaşatmayan scriptler

Chameleon PaintsTek tıkla uygulanan bir menüde 82 renk değiştiren bukalemun boya.Scripti gör →Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →Car BombAraç bombası yerleştirin, tespit edin ve etkisiz hale getirin — detonatör telefon ve C4 mini oyunuyla.Scripti gör →

Okumaya devam edin