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:
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
endAdımlar:
IsModelInCdimagemodelin var olup olmadığını kontrol eder. Yazım hatası veya eksik eklenti araba burada donmak yerine durur.RequestModelve ardındanHasModelLoadedüzerindeki döngü bir zaman aşımı ile beklemeyi bekler.CreateVehiclemodeli, konumu, başlığını, sonraisNetworkalır (trueolur, böylece diğer oyuncular bunu görürler) venetMissionEntity.SetModelAsNoLongerNeedediş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:
local vehicle = spawnVehicle('sultan', GetEntityCoords(PlayerPedId()), GetEntityHeading(PlayerPedId()))
if vehicle then
SetVehicleNumberPlateText(vehicle, 'MIC 001')
SetPedIntoVehicle(PlayerPedId(), vehicle, -1)
endLevha 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:
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:
-- server
local netId = NetworkGetNetworkIdFromEntity(vehicle)İstemci tarafında, varlığın o makinede var olmasını bekleyin, sonra dönüştürün:
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:
- Aracı oluşturun.
- Levhayı
SetVehicleNumberPlateTextile ayarlayın. - 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:
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:
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.

