FiveM'de araç ortaya çıkar: CreateVehicle vs CreateVehicleServerSetter

FiveM'de araçları doğru şekilde ortaya çıkarın: RequestModel ile istemci CreateVehicle, OneSync'te sunucu CreateVehicleServerSetter, net id'ler, levhalar, anahtarlar ve kaybolan arabalar.

Bir araç ortaya çıkarırsınız ve görünmez görünür, haritanın altında ortaya çıkar, bir dakika sonra kayboluyor veya sadece bunu ortaya çıkaran oyuncu görebilir. Araba ortaya çıkarmanın iki doğru yolu vardır ve her birinin farklı bir tuzak seti vardır. Bu makale her ikisini, levhayı nasıl ayarlanacağını ve anahtarları nasıl teslim edileceğini ve ortaya çıkarılan arabaların neden kayboldukları gösterir.

İstemcide CreateVehicle ile ortaya çıkar

İstemci sürümü, çoğu betiğin kullandığı sürümdür. Model, aracı oluşturmadan önce yüklenmesi gerekir, aksi takdirde CreateVehicle 0 döndürür:

lua
local function spawnVehicle(modelName, coords, heading)
    local model = joaat(modelName)

    if not IsModelInCdimage(model) or not IsModelAVehicle(model) then
        print('invalid vehicle model:', modelName)
        return nil
    end

    RequestModel(model)
    local timeout = GetGameTimer() + 5000
    while not HasModelLoaded(model) do
        if GetGameTimer() > timeout then
            print('model did not load:', modelName)
            return nil
        end
        Wait(0)
    end

    local vehicle = CreateVehicle(model, coords.x, coords.y, coords.z, heading, true, false)
    SetModelAsNoLongerNeeded(model)

    return vehicle
end

Adımlar:

  1. IsModelInCdimage modelin var olup olmadığını kontrol eder. Yazım hatası veya eksik eklenti araba burada donmak yerine durur.
  2. RequestModel ve ardından HasModelLoaded üzerindeki döngü bir zaman aşımı ile beklemeyi bekler.
  3. CreateVehicle modeli, konumu, başlığını, sonra isNetwork alır (true olur, böylece diğer oyuncular bunu görürler) ve netMissionEntity.
  4. SetModelAsNoLongerNeeded işiniz bittiğinde model belleğini serbest bırakır.

Araç bir eklentiyse, önce eklenti arabaları ekleme bölümüne bakın. Akışı yapılmayan bir model asla yüklenmez.

İpucu: ox_lib ile, lib.requestModel(model) isteme ve beklemeyi sizin için yapar ve zaman aşımında hata verir.

Oyuncuyu şoför koltuğuna koyun ve levhayı ayarlayın:

lua
local vehicle = spawnVehicle('sultan', GetEntityCoords(PlayerPedId()), GetEntityHeading(PlayerPedId()))

if vehicle then
    SetVehicleNumberPlateText(vehicle, 'MIC 001')
    SetPedIntoVehicle(PlayerPedId(), vehicle, -1)
end

Levha en fazla 8 karakter tutar.

Sunucuda CreateVehicleServerSetter ile ortaya çıkar

OneSync üzerinde sunucu aracı kendisi oluşturabilir. Bu, sunucunun ortaya çıkmayı karar verdiği betikler, garaj veya iş aracı gibi betikler için daha güvenilirdir ve hiçbir istemci yakında kalması gerekmez:

lua
RegisterNetEvent('my_script:spawnCar', function()
    local src = source
    local ped = GetPlayerPed(src)
    local coords = GetEntityCoords(ped)
    local heading = GetEntityHeading(ped)

    local vehicle = CreateVehicleServerSetter(joaat('sultan'), 'automobile', coords.x, coords.y, coords.z, heading)

    while not DoesEntityExist(vehicle) do
        Wait(0)
    end

    SetVehicleNumberPlateText(vehicle, 'MIC 001')
    TaskWarpPedIntoVehicle(ped, vehicle, -1)

    local netId = NetworkGetNetworkIdFromEntity(vehicle)
    TriggerClientEvent('my_script:vehicleSpawned', src, netId)
end)

İkinci argüman, araç türüdür, dize olarak: 'automobile', 'bike', 'boat', 'heli', 'plane', 'submarine', 'trailer' veya 'train'. Modelle eşleşeni seçin. Otomobil olarak oluşturulan bir bisiklet yanlış davranacaktır.

İstemcinin aksine, modeli sunucuda talep etmezsiniz. Çağrı aynı zamanda asenkron olur: varlık döndüğü anda var olmayabilir, bu nedenle gerçek kodda bir zaman aşımı ile DoesEntityExist için bekleyin.

server.cfg dosyasında OneSync'i etkinleştirin, aksi takdirde çağrı çalışmaz. OneSync'i nasıl etkinleştireceğinize bakın.

Net id'ler: arabayı istemciye teslim etme

Sunucuda oluşturulan araç, yalnızca sunucuda var olan bir varlık tutamacıdır. İstemci bunu kullanamaz. Makineler arasında arabaya başvurmak için, her yerde aynı olan ağ id'sini kullanın:

lua
-- server
local netId = NetworkGetNetworkIdFromEntity(vehicle)

İstemci tarafında, varlığın o makinede var olmasını bekleyin, sonra dönüştürün:

lua
RegisterNetEvent('my_script:vehicleSpawned', function(netId)
    local timeout = GetGameTimer() + 5000
    while not NetworkDoesEntityExistWithNetworkId(netId) do
        if GetGameTimer() > timeout then return end
        Wait(0)
    end

    local vehicle = NetToVeh(netId)
    print('my vehicle is', vehicle)
end)

Asla raw varlık tutamacını bir olay üzerinden göndermeyiniz: başka bir makinede hiçbir şey ifade etmez.

Levhalar ve anahtarlar

Aracı oluşturduktan hemen sonra levhayı ayarlayın, yukarıdaki örneklerde olduğu gibi ve öncesinde anahtarları teslim edersiniz. Anahtarlar sunucunuzun araç anahtarları betiğine bağlıdır, çünkü her betiğin kendi işlevi vardır. Çoğu levha ile çalışır, bu nedenle olağan sıra şudur:

  1. Aracı oluşturun.
  2. Levhayı SetVehicleNumberPlateText ile ayarlayın.
  3. Anahtarlar betiğinizin dışa aktarması veya olayını bu levha ile çağırın.

Araç sahibiyse, garaj bunu tekrar bulabilsin diye veritabanınızda aynı levhayı saklayın. Kullandığınız anahtarlar betiğinin belgelendirmesini tam çağrı için kontrol edin. Başka bir sunucudan bir çağrı kopyalamayın.

Neden ortaya çıkarılan arabalar kayboluyor

Kimseye uygun değildir. Oyun ağa bağlı bir varlığı kimse yakınında olmadığında kaldırır. Sunucuda bir oyuncuya ortaya çıkarılan araba sonra uzaklaşabilir.

Sahibi gitti. Bir varlık, sahibi olan bir oyuncuya aittir. İstemci tarafından ortaya çıkarılan aracın sahibi bağlantıyı kestiğinde veya menzil dışına çıktığında, kaldırılabilir. Sunucuda ne olacağını ayarlayabilirsiniz:

lua
SetEntityOrphanMode(vehicle, 2)

Yetim modu 2, "varlığı tut" anlamı taşır, 0 varsayılandır (uygun olmadığında sil) ve 1 sahibi bağlantıyı kestiğinde siler. Sunucu derlemesi için yerel belgeleme kontrol edin.

Görev varlığı olarak işaretlenmemiş. İstemcide, ortam temizliği oluşturduğunuz bir arabayı silebilir. Bunu işaretleyin, böylece oyun bunu sizinkinin şekilde işler:

lua
SetEntityAsMissionEntity(vehicle, true, true)

Temizlik betiği. Birçok sunucu, boş arabaları kaldıran bir betik çalıştırır. Arabaları sabit bir zamanda kaybederse, bu nedendir, ortaya çıkma kodunuz değildir.

Hiçbir zaman ortaya çıkmadı. Görünmez veya kayıp araba genellikle modelin yüklenmedimesi, CreateVehicle 0 döndüğü ve betiğin devam ettiği anlamına gelir. Her zaman döndürülen tutamacı kontrol edin.

Arabaları kendiniz sildikten sonra DeleteEntity(vehicle) ile silin, böylece yığılmazlar.

Kontrol listesi

Belirti Çözüm
CreateVehicle 0 döndürür RequestModel ve önce HasModelLoaded için bekleyin
Kötü model adında dondurma İsteme yapmadan önce IsModelInCdimage kontrol edin
Yalnızca ortaya çıkaran kişi arabayı görür CreateVehicle öğesine isNetwork = true yapın
CreateVehicleServerSetter hiçbir şey yapmaz OneSync'i etkinleştirin ve DoesEntityExist için bekleyin
İstemci faydasız varlık id'si alır Net id'i gönderin, sonra istemcide NetToVeh kullanın
Araba daha sonra kayboluyor Görev varlığı olarak işaretleyin, yetim modunu ayarlayın, temizlik betikleri kontrol edin
Oyuncu arabasını süremiyor Levhayı kullanarak anahtarlar betiğinizle anahtarları verin

Kısa yanıtlar

CreateVehicleServerSetter'ı kullanmak için OneSync'e ihtiyacım var mı?

Evet. Sunucu tarafı varlık oluşturması OneSync'in etkinleştirilmesini gerektirir. OneSync olmayan sunucuda, CreateVehicle ile aracı istemcide ortaya çıkarın.

Neden ortaya çıkardığım araba kayboluyor?

Ağa bağlı araç, artık kimseye uygun olmadığında veya sahibi ayrıldığında silinir, çünkü oyunu tutmasını söylemezsiniz. İstemcide bir görev varlığı olarak işaretleyin veya sunucuda yetim modunu ayarlayın.

Oyuncuya anahtarları nasıl veriri?

Sunucunuzun kullandığı araç anahtarları betiğine bağlıdır. Çoğu, levhayı alan bir istemci dışa aktarması veya olayı vardır, bu nedenle levhayı ayarladıktan sonra bunu çağırın.

Bu sorunu yaşatmayan scriptler

Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →Chameleon PaintsTek tıkla uygulanan bir menüde 82 renk değiştiren bukalemun boya.Scripti gör →

Okumaya devam edin