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:

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

Kroki:

  1. IsModelInCdimage sprawdza, czy model istnieje. Błąd pisowni lub brakujący samochód dodatkowy zatrzymuje się tutaj zamiast zamarznięcia.
  2. RequestModel a następnie pętla na HasModelLoaded czeka na niego, z timeout'em.
  3. CreateVehicle bierze model, pozycję, nagłówek, następnie isNetwork (true, aby inni gracze go widzieli) i netMissionEntity.
  4. SetModelAsNoLongerNeeded zwalnia 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ę:

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

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

Tablica 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:

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)

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:

lua
-- server
local netId = NetworkGetNetworkIdFromEntity(vehicle)

Na kliencie czekaj, aż jednostka będzie istniała na tej maszynie, a następnie konwertuj:

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)

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:

  1. Stwórz pojazd.
  2. Ustaw tablicę za pomocą SetVehicleNumberPlateText.
  3. 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:

lua
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:

lua
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.

Skrypty bez tego problemu

Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →Chameleon Paints82 lakiery kameleon zmieniające kolor, w jednym menu — klik i gotowe.Zobacz skrypt →

Czytaj dalej