Paliwo pojazdu w FiveM: ustaw paliwo przy spawnie i napraw samochody utknięte na 0

Jak paliwo działa w FiveM: GetVehicleFuelLevel i SetVehicleFuelLevel, paliwo w torebkach stanu, ustawianie paliwa przy spawnieniu samochodu i dlaczego pojazdy zaczynają się z pustym bakiem.

Typowe objawy:

text
A freshly spawned car has the fuel gauge at 0 and the engine cuts out after a few metres.

Paliwo w FiveM to nie jeden system. Gra ma na niego native, ale prawie każdy serwer uruchamia zasób paliwa, który przechowuje własną wartość. Ten artykuł wyjaśnia natives, gdzie zasoby paliwa przechowują poziom i jak prawidłowo ustawiać paliwo przy spawnieniu samochodu.

Dwa natives

Gra przechowuje poziom paliwa na każdym pojeździe. Czytasz i piszesz to na kliencie:

lua
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)

local fuel = GetVehicleFuelLevel(vehicle)
print('fuel', fuel)

SetVehicleFuelLevel(vehicle, 100.0)

GetVehicleFuelLevel zwraca float i SetVehicleFuelLevel przyjmuje float. Wartość podąża za objętością zbiornika paliwa z handlingu pojazdu, więc skrypty normalnie traktują to jako procent i trzymają między 0 a 100.

Sam native nie konsumuje paliwa. Gra drenaży go tylko w określonych sytuacjach, więc zasób paliwa to to, co sprawia, że samochody zużywają paliwo na podstawie prędkości i RPM.

Gdzie zasoby paliwa przechowują poziom

To jest część, która powoduje większość problemów. Zasób paliwa musi pamiętać poziom każdego samochodu i wybiera jedno z tych miejsc:

  • Torebka stanu na encji. Niektóre zasoby przechowują poziom w stanie pojazdu, na przykład Entity(vehicle).state.fuel. To jest jak ox_fuel pracuje i kilka innych nowoczesnych zasobów robi to samo. Przeczytaj torebki stanu, aby dowiedzieć się, jak wartości synchronizują się między serwerem i klientami.
  • Dekorator. Starsze zasoby przechowują poziom za pomocą DecorSetFloat na pojeździe.
  • Tylko native. Najprostsze skrypty czytają GetVehicleFuelLevel i piszą SetVehicleFuelLevel i nic więcej.
  • Baza danych. Wiele zasobów również zapisuje poziom posiadanych samochodów, aby trwał między sesjami, w kolumnie fuel tabeli pojazdów.

Natywne wezwanie, które nie jest wspierane przez miejsce, które czyta twój zasób, nie ma widocznego efektu. Jeśli wołasz SetVehicleFuelLevel(vehicle, 100.0) a wskaźnik zostaje na 0, twój zasób czyta inne źródło.

Porada: otwórz pliki zasobu paliwa i wyszukaj state.fuel, Decor i GetVehicleFuelLevel. Którekolwiek czyta, to to, które musiałbyś napisać.

Ustaw paliwo przy spawnieniu samochodu

Niezależnie od tego, co używa twój zasób paliwa, kolejność jest taka sama. Utwórz pojazd, czekaj aż będzie istnieć, następnie ustaw paliwo:

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

-- 1. the native, for the game's own value
SetVehicleFuelLevel(vehicle, 100.0)

-- 2. the state bag, if your fuel resource reads one
Entity(vehicle).state:set('fuel', 100.0, true)

Użyj tylko linii, którą czyta twój zasób. Pisanie klucza torebki stanu, który nic nie czyta, jest nieszkodliwe, ale bezużyteczne.

Niektóre zasoby również dają eksport do ustawienia poziomu, więc nie musisz wiedzieć, gdzie jest przechowywany. Jeśli masz, preferuj to i weź dokładną nazwę z jego dokumentacji:

lua
-- placeholder: the export name depends on your fuel resource
exports['your_fuel_resource']:SetFuel(vehicle, 100.0)

Dla samochodu zbudowanego na serwerze za pomocą CreateVehicleServerSetter, ustaw wartość po stronie serwera za pośrednictwem torebki stanu. Native SetVehicleFuelLevel uruchamia się na kliencie, więc dla samochodów stworzonych na serwerze dajesz net id właścicielowi i ustawiasz tam, jak opisano w spawnianiu pojazdów.

Posiadane samochody wychodzą puste

Jeśli samochody z twojego garażu zaczynają się z tą samą niską wartością za każdym razem, garaż przywraca zapisaną wartość, która jest pusta. Sprawdź tabelę pojazdów, która zwykle przechowuje ostatnią znaną poziomów w kolumnie:

sql
SELECT plate, fuel FROM player_vehicles WHERE plate = 'MIC 001';

Częste przyczyny:

  • Kolumna fuel to 0 lub NULL, ponieważ samochód został przechowywany, gdy wartość nie była zapisana.
  • Skrypt garażu nigdy nie czyta kolumny przy spawnieniu.
  • Zasób paliwa zapisuje własną wartość gdzieś indziej niż czyta garaż.

Aby naprawić pojazdy, które są już utknięte, ustaw kolumnę na pełny zbiornik:

sql
UPDATE player_vehicles SET fuel = 100 WHERE fuel IS NULL OR fuel <= 0;

Serwery ESX często nie mają kolumny fuel w owned_vehicles, ponieważ paliwo jest zapisywane wewnątrz kolumny vehicle JSON wraz z innymi właściwościami. Przeczytaj właściwości pojazdu, aby dowiedzieć się, jak ten JSON jest zbudowany.

Samochody utknięte na 0 paliwa

Przejdź przez zwykłe przyczyny:

Zasób paliwa nie działa lub uruchomił się zbyt późno. Jeśli uruchomi się po garażu, pierwsze spawniętne samochody nie mają wartości. Uruchom go przed skryptami, które spawniają pojazdy.

Dwa zasoby walczą. Zasób paliwa i skrypt, który wołają SetVehicleFuelLevel każdą ramkę, nadpisują się nawzajem i wskaźnik skacze. Utrzymuj jedno źródło.

Poziom jest ustawiony przed istnieniem encji. Na sieciowym spawnie wezwanie musi nastąpić po tym, jak DoesEntityExist to true, inaczej stosuje się do nic.

Model ma minimalny zbiornik. Objętość zbiornika paliwa pochodzi z handlingu. Niestandardowy pojazd z fPetrolTankVolume na bardzo niskiej wartości opróżnia się szybko. Sprawdź plik handlingu pojazdu, zobacz edycja handlingu pojazdu.

Pojazdy elektryczne. Zasób paliwa, który ich nie wyklucza, drenaży zbiornik, który nie istnieje. Większość zasobów ma listę modeli elektrycznych do pominięcia.

Zatankuj bez stacji

Dla pojazdu testowego lub pracę, mała pętla trzyma zbiornik pełny, gdy gracz go jeździ:

lua
CreateThread(function()
    while true do
        local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
        if vehicle ~= 0 and GetVehicleFuelLevel(vehicle) < 20.0 then
            SetVehicleFuelLevel(vehicle, 100.0)
        end
        Wait(2000)
    end
end)

Dwa sekundy Wait to celowe: paliwo nie potrzebuje sprawdzenia każdą ramkę, zobacz jak Wait działa.

Lista kontrolna

Objaw Naprawa
Spawniętny samochód ma 0 paliwa Ustaw paliwo po spawnie, gdzie czyta je twój zasób paliwa
SetVehicleFuelLevel nic nie zmienia Zasób czyta torebkę stanu lub dekorator: zamiast tego to napisz, lub użyj jego eksportu
Samochody z garażu wychodzą puste Sprawdź kolumnę fuel lub zapisane właściwości i upewnij się, że garaż je przywraca
Paliwo skacze w górę i w dół Dwa skrypty ustawiają poziom: utrzymaj jeden
Samochód stworzony na serwerze nie ma paliwa Ustaw torebkę stanu na serwerze, lub wyślij net id do właściciela
Pusty zbiornik na niestandardowym samochodzie Sprawdź fPetrolTankVolume w jego handlingu
Samochód elektryczny traci paliwo Dodaj model do listy elektrycznej zasobu paliwa

Szybkie odpowiedzi

Dlaczego samochód, który spawniłem, nie ma paliwa?

Zasób paliwa zwykle przechowuje poziom w swoim własnym miejscu, takim jak torebka stanu, a nowy pojazd jeszcze tam nie ma wartości. Ustaw paliwo za pośrednictwem zasobu paliwa zaraz po spawnie.

Czy SetVehicleFuelLevel wystarczy, aby napełnić zbiornik?

Tylko dla własnej wartości gry. Jeśli twój zasób paliwa czyta paliwo z torebki stanu lub własnej tabeli, ignoruje native, więc ustaw wartość, gdzie zasób ją czyta.

Czy mogę sprawić, aby konsumpcja paliwa była nieograniczona?

Tak. Trzymaj poziom na maksimum na timerze, lub wyłącz konsumpcję w konfiguracji zasobu paliwa, jeśli ma taką opcję.

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 →Car BombPodkładaj, wykrywaj i rozbrajaj bomby w autach — z telefonem-detonatorem i minigrą C4.Zobacz skrypt →

Czytaj dalej