Praca mechanika w FiveM: repair natives, tuning mods i sprawdzenia pracy

Zbuduj pracę mechanika w FiveM: napraw pojazd za pomocą SetVehicleFixed i health natives, strojenie za pomocą SetVehicleModKit i SetVehicleMod, zapisz mody i bramy akcje według pracy.

Objaw: Twój mechanik naprawia samochód i silnik wciąż się dymi, wgniecenia pozostają, dostrojony element znika po restarcie, lub każdy gracz może naprawiać pojazdy za darmo.

Praca mechanika to dwie prace w jednej: naprawa (wartości zdrowotne i natives) i tuning (mody pojazdu). Oba działają na kliencie, więc część, którą musisz chronić, to kto jest dozwolony, aby je uruchomić.

Naprawa pojazdu

Jeden native to nie dość dla czystej naprawy. Ta kombinacja robi pracę:

lua
-- client
local function repairVehicle(vehicle)
    SetVehicleFixed(vehicle)
    SetVehicleDeformationFixed(vehicle)
    SetVehicleEngineHealth(vehicle, 1000.0)
    SetVehicleBodyHealth(vehicle, 1000.0)
    SetVehicleUndriveable(vehicle, false)
    SetVehicleEngineOn(vehicle, true, true, false)
end
  • SetVehicleFixed naprawia pojazd w ogólności, łącznie z oponami.
  • SetVehicleDeformationFixed usuwa wgniecenia, które pierwszy native może zostawić.
  • SetVehicleEngineHealth i SetVehicleBodyHealth biorą wartość aż do 1000.0. Poniżej zera silnik jest martwy, więc ustawienie ich z powrotem go uruchamia.

Ponieważ pojazd to sieciowa jednostka, klient dokonujący naprawy powinien ją posiadać. Jeśli naprawa działa na Twoim własnym samochodzie, a nie na samochodzie klienta, najpierw poproś o kontrolę:

lua
NetworkRequestControlOfEntity(vehicle)
local timeout = 0
while not NetworkHasControlOfEntity(vehicle) and timeout < 50 do
    Wait(10)
    timeout += 1
end

Dla częściowych napraw (tylko silnik, tylko ciało), wywołaj tylko pasującego native'a zdrowia. Wartości zdrowia są również ważne dla innych skryptów, na przykład vehicle damage and engine health wyjaśnia co każda liczba robi.

Tuning za pomocą SetVehicleMod

Mody to ponumerowane sloty. Dwie reguły dotyczą wszystkich z nich:

  1. Wywołaj SetVehicleModKit(vehicle, 0) przed jakąkolwiek zmianą modu.
  2. Zapytaj grę ile opcji slot ma z GetNumVehicleMods. Indeks -1 to część zasobowa.
lua
-- client
local function setMod(vehicle, modType, index)
    SetVehicleModKit(vehicle, 0)
    local count = GetNumVehicleMods(vehicle, modType)
    if index >= -1 and index < count then
        SetVehicleMod(vehicle, modType, index, false)
    end
end

-- engine is mod type 11, brakes 12, transmission 13, suspension 15
setMod(vehicle, 11, 2)

-- turbo is a toggle, not a numbered mod
ToggleVehicleMod(vehicle, 18, true)

Sprawdzenie indeksu przeciwko GetNumVehicleMods unika cichej awarii, gdy pojazd ma mniej opcji niż oczekujesz. Farba i kolor używają własnych native'ów (SetVehicleColours i inne), więc traktuj je jako osobne menu.

Wskazówka: zbuduj menu tuningu z samego pojazdu, pętlując przez sloty z GetNumVehicleMods, zamiast na stałe kodować liczby. Pojazdy addon'owe często mają inną liczbę opcji.

Zapisywanie modów

Ustawienie modu zmienia tylko żywą jednostkę. Gdy gracz przechowuje samochód w garażu i wyjmuje go ponownie, mod znika, chyba że był zapisany z pojazdem. Zapisz pełny zestaw właściwości po stroeniu i zastosuj je, gdy pojazd się pojawia. Cały przepływ znajduje się w saving vehicle properties and mods.

Akcje bramowane przez pracę

Kod naprawy i tuning działa na kliencie, więc zmodyfikowany klient może go wywołać dla każdego. Umieść regułę na serwerze:

lua
-- server (ox_lib)
lib.callback.register('mechanic:canRepair', function(source)
    -- 1. job check: use your framework's player/job getter here
    -- 2. distance check: the player must be near a vehicle or workshop
    -- 3. item check and removal
    local removed = exports.ox_inventory:RemoveItem(source, 'repairkit', 1)
    return removed and true or false
end)
lua
-- client
lib.callback('mechanic:canRepair', false, function(ok)
    if ok then repairVehicle(vehicle) end
end)

Sprawdzenie pracy zależy od Twojego frameworku. Na ESX przeczytaj pracę z obiektu gracza, na QBCore i QBox przeczytaj ją z danych gracza. Użyj getera Twojego frameworku w kroku 1 i porównaj z nazwą swojej pracy mechanika, jak omówiono w adding a job on ESX i adding a job on QBCore. Dla wzorca callback'a na wszystkich frameworkach, zobacz server callbacks.

Inne rzeczy warte bramy:

  • Zestawy naprawcze jako przedmioty, więc naprawa coś kosztuje i element jest usuwany na serwerze.
  • Strefy warsztatu, więc tuning otwiera się tylko wewnątrz garażu lub przy stanowisku.
  • Płacenie mechanikowi lub kontu społeczeństwa na serwerze, nie z klienta.

Pasek postępu z opcją anulowania sprawia, że naprawy wyglądają dobrze. Zobacz progress bars on ESX, QBCore and ox_lib.

Checklist

Objaw Rozwiązanie
Wgniecenia pozostają po naprawie Dodaj SetVehicleDeformationFixed
Silnik wciąż się dymi Ustaw siłę silnika z powrotem na 1000.0
Naprawa działa tylko na Twoim własnym samochodzie Najpierw poproś o kontrolę sieciową pojazdu
SetVehicleMod nic nie robi Najpierw wywołaj SetVehicleModKit(vehicle, 0)
Indeks modu poza zakresem Sprawdzaj GetNumVehicleMods dla tego slotu
Mody znikają po restarcie Zapisz właściwości z pojazdem
Każdy może naprawiać Sprawdzaj pracę, dystans i przedmiot na serwerze

Szybkie odpowiedzi

Dlaczego SetVehicleFixed nie naprawia uszkodzenia ciała?

Naprawia większość pojazdu, ale nie zawsze widoczne zniekształcenie. Wywołaj również SetVehicleDeformationFixed(vehicle) i ustaw siłę silnika i ciała samodzielnie.

Dlaczego SetVehicleMod nic nie robi?

Musisz najpierw wywołać SetVehicleModKit(vehicle, 0). Bez modyfikacji, gra ignoruje zmianę modu.

Jak mogę upewnić się, że tylko mechanicy mogą naprawiać?

Sprawdzaj pracę na serwerze zanim zaakceptujesz naprawę, i weź przedmiot naprawy na serwerze. Sprawdzenie pracy po stronie klienta może być pominięte przez zmodyfikowanego klienta.

Skrypty bez tego problemu

Chameleon Paints82 lakiery kameleon zmieniające kolor, w jednym menu — klik i gotowe.Zobacz skrypt →Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →

Czytaj dalej