Spawn pojazdu w FiveM: CreateVehicle vs CreateVehicleServerSetter
Spawn pojazdy we właściwy sposób w FiveM: client CreateVehicle z RequestModel, server CreateVehicleServerSetter na OneSync, net ids, tablice i klucze oraz znikające pojazdy.
Spawnujesz pojazd i pojawia się niewidoczny, spawns pod mapą, znika po minucie, lub tylko gracz, który go spawnął, może go zobaczyć. Istnieją dwie prawidłowe sposoby, aby spawnać samochód i każdy ma inny zestaw pułapek. Ten artykuł pokazuje obie, jak ustawić tablicę i wręczyć klucze oraz dlaczego spawne samochody znikają.
Spawn na kliencie z CreateVehicle
Wersja klienta to ta, którą używa większość skryptów. Model musi być załadowany przed utworzeniem pojazdu, w przeciwnym razie CreateVehicle zwraca 0:
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
endKroki:
IsModelInCdimagesprawdza, czy model istnieje. Błąd pisowni lub brakujący samochód dodatkowy zatrzymuje się tutaj zamiast zamarznięcia.RequestModela następnie pętla naHasModelLoadedczeka na niego, z timeout'em.CreateVehiclebierze model, pozycję, nagłówek, następnieisNetwork(true, aby inni gracze go widzieli) inetMissionEntity.SetModelAsNoLongerNeededzwalnia pamięć modelu, gdy gotowe.
Jeśli pojazd jest dodatkiem, zobacz jak dodać samochody dodatkiem najpierw. Model, który nie jest streamowany, nigdy się nie ładuje.
Wskazówka: z ox_lib,
lib.requestModel(model)robi żądanie i czeka dla Ciebie, i wyrzuca błędy na timeout.
Umieść gracza na siedzeniu kierowcy i ustaw tablicę:
local vehicle = spawnVehicle('sultan', GetEntityCoords(PlayerPedId()), GetEntityHeading(PlayerPedId()))
if vehicle then
SetVehicleNumberPlateText(vehicle, 'MIC 001')
SetPedIntoVehicle(PlayerPedId(), vehicle, -1)
endTablica przechowuje maksymalnie 8 znaków.
Spawn na serwerze z CreateVehicleServerSetter
Na OneSync, serwer może stworzić pojazd sam. To jest bardziej niezawodne dla skryptów, gdzie serwer decyduje o spawn'ie, takiego jak garaż lub pojazd pracy, i żaden klient nie musi zostać blisko:
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)Drugi argument to typ pojazdu jako ciąg: 'automobile', 'bike', 'boat', 'heli', 'plane', 'submarine', 'trailer' lub 'train'. Wybierz ten, który pasuje do modelu. Motocykl utworzony jako samochód będzie się zachowywać źle.
W przeciwieństwie do klienta, nie żądasz modelu na serwerze. Wywołanie jest również asynchroniczne: jednostka może nie istnieć w momencie powrotu, więc czekaj na DoesEntityExist, z timeout'em w prawdziwym kodzie.
Włącz OneSync w server.cfg, w przeciwnym razie wywołanie nie zadziała. Zobacz jak włączyć OneSync.
Net ids: wręczenie samochodu klientowi
Pojazd utworzony na serwerze ma uchwyt jednostki, który istnieje tylko na serwerze. Klient nie może go użyć. Aby odwołać się do samochodu między maszynami, użyj jego network id, który jest taki sam wszędzie:
-- server
local netId = NetworkGetNetworkIdFromEntity(vehicle)Na kliencie czekaj, aż jednostka będzie istniała na tej maszynie, a następnie konwertuj:
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)Nigdy nie wysyłaj surowego uchwytu jednostki przez zdarzenie: nic nie znaczy na innej maszynie.
Tablice i klucze
Ustaw tablicę zaraz po istnieniu pojazdu, jak w powyższych przykładach i przed wręczeniem kluczy. Klucze zależą od skryptu kluczy pojazdu, którego używa twój serwer, ponieważ każdy skrypt ma własną funkcję. Większość działa z tablicą, więc zwyczajna kolejność to:
- Stwórz pojazd.
- Ustaw tablicę za pomocą
SetVehicleNumberPlateText. - Zadzwoń do eksportu lub zdarzenia skryptu kluczy z tą tablicą.
Przechowuj tę samą tablicę w bazie danych, jeśli pojazd jest własnością, aby garaż mógł go znaleźć ponownie. Sprawdź dokumentację skryptu kluczy, którego używasz dla dokładnego wywołania. Nie kopiuj wywołania z innego serwera.
Dlaczego spawne samochody znikają
Nie istotne dla nikogo. Gra usuwa jednostkę w sieci, gdy nikt nie jest blisko. Samochód spawnowany na serwerze dla gracza, który potem się oddala, można usunąć.
Właściciel odszedł. Jednostka należy do gracza, który ją posiadł. Gdy właściciel pojazdu spawnowanego na kliencie się rozłączy lub odejdzie poza zasięg, może być usunięty. Na serwerze możesz ustawić co się dzieje:
SetEntityOrphanMode(vehicle, 2)Tryb sierocki 2 to „zachowaj jednostkę", 0 to domyślnie (usuń, gdy nie jest istotne) i 1 usuwa go, gdy właściciel się rozłączy. Sprawdź dokumentację native'a dla Twojej kompilacji serwera.
Nie oznaczone jako jednostka misji. Na kliencie czyszczenie otoczenia może usunąć samochód, który stworzyłeś. Oznacz go, aby gra traktowała go jako twojego:
SetEntityAsMissionEntity(vehicle, true, true)Skrypt czyszczenia. Wiele serwerów uruchamia skrypt, który usuwa niezajęte pojazdy. Jeśli Twoje samochody znikają w ustalonym czasie, to jest przyczyna, a nie Twój kod spawn'u.
Nigdy się nie spawnął. Niewidoczny lub brakujący samochód zwykle oznacza, że model nie został załadowany, CreateVehicle zwrócił 0 i skrypt poszedł dalej. Zawsze sprawdzaj zwracany uchwyt.
Usuń samochody sam, gdy gotowe, za pomocą DeleteEntity(vehicle), aby się nie spiętrzały.
Lista kontrolna
| Objaw | Rozwiązanie |
|---|---|
CreateVehicle zwraca 0 |
RequestModel i czekaj na HasModelLoaded najpierw |
| Zamrażanie na złej nazwie modelu | Sprawdź IsModelInCdimage przed żądaniem |
| Tylko spawner widzi samochód | Przekaż isNetwork = true do CreateVehicle |
CreateVehicleServerSetter nic nie robi |
Włącz OneSync i czekaj na DoesEntityExist |
| Klient otrzymuje bezużyteczny identyfikator jednostki | Wyślij net id, następnie użyj NetToVeh na kliencie |
| Samochód znika później | Oznacz jako jednostkę misji, ustaw tryb sierocki, sprawdź skrypty czyszczenia |
| Gracz nie może prowadzić swojego samochodu | Daj klucze skryptem kluczy, używając tablicy |
Szybkie odpowiedzi
Czy potrzebuję OneSync, aby użyć CreateVehicleServerSetter?
Tak. Tworzenie jednostek po stronie serwera wymaga włączonego OneSync. Na serwerze bez niego spawn pojazdu na kliencie za pomocą CreateVehicle.
Dlaczego mój spawny samochód znika?
Pojazd w sieci jest usuwany, gdy nie jest już istotny dla nikogo, lub gdy jego właściciel opuszcza, chyba że powiesz grze, aby go zachowała. Oznacz go jako jednostkę misji na kliencie lub ustaw jego tryb sierociego na serwerze.
Jak dać graczowi klucze?
To zależy od skryptu kluczy pojazdu, który używa twój serwer. Większość ma eksport klienta lub zdarzenie, które bierze tablicę, więc zadzwoń do niego po ustawieniu tablicy.

