Pobierz i ustaw właściwości pojazdu w FiveM: lib, ESX i QBCore
Zapisz i przywróć mody pojazdu, kolory i dodatki w FiveM: lib.getVehicleProperties, ESX.Game.GetVehicleProperties, QBCore.Functions.GetVehicleProperties, SetVehicleModKit i baza danych.
Typowe objawy:
A car comes out of the garage as a stock car: no colour, no turbo, no wheels, plain plate.Wygląd pojazdu i tuning są nazwane jego właściwościami. Aby je zachować, czytasz je ze spawnanego pojazdu, przechowujesz jako JSON i aplikujesz do następnego, którego spawn'ujesz. Ten artykuł pokazuje funkcję, którą każdy framework zapewnia, jedną regułę o mod kit'cie i jak zapisać wynik w bazie danych.
Co zawierają właściwości
Tabela właściwości zawiera wszystko, co garaż musi przywrócić: model, tablicę, kolory, livery, mody według indeksu, typ kół, dym opon, neon, tint okien, dodatki i wartości zdrowotne. To zwykła tabela Lua, więc zamieniasz ją na tekst za pomocą json.encode do przechowywania.
ox_lib
Jeśli ox_lib jest na Twoim serwerze, to jest najkrótsza droga i jedyna, której potrzebujesz na QBox:
-- client
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
local props = lib.getVehicleProperties(vehicle)
-- later, on a spawned vehicle
lib.setVehicleProperties(vehicle, props)Oba są funkcjami klienta. Pracują z każdym framework'iem, ponieważ czytają grę bezpośrednio.
ESX
ESX ma swoją parę na kliencie:
local props = ESX.Game.GetVehicleProperties(vehicle)
ESX.Game.SetVehicleProperties(vehicle, props)Najpierw zdobądź obiekt za pomocą ESX = exports['es_extended']:getSharedObject(). Jeśli ESX jest nil, zobacz naprawianie esx:getSharedObject.
QBCore
QBCore ma te same dwie funkcje na kliencie:
local QBCore = exports['qb-core']:GetCoreObject()
local props = QBCore.Functions.GetVehicleProperties(vehicle)
QBCore.Functions.SetVehicleProperties(vehicle, props)Na QBox użyj pary ox_lib z góry.
Wskazówka: jeśli piszesz skrypt, który musi działać na wszystkich trzech framework'ach, sprawdź, który działa i zadzwoń do pasującej pary, lub po prostu używaj ox_lib wszędzie, ponieważ to już zależność większości nowoczesnych serwerów.
SetVehicleModKit najpierw
Gra ignoruje SetVehicleMod, dopóki pojazd nie ma zestawu mod kit'ów. Funkcje powyżej to obsługują, ale jeśli napiszesz swój kod aplikacji, zrób to w tej kolejności:
SetVehicleModKit(vehicle, 0)
SetVehicleMod(vehicle, 11, 3, false) -- engine, level 3
SetVehicleMod(vehicle, 12, 2, false) -- brakes
ToggleVehicleMod(vehicle, 18, true) -- turboPierwszy argument SetVehicleModKit to kit, a 0 to ten, którego wszyscy używają. Typy modów to liczby: 11 to silnik, 12 hamulce, 13 transmisja, 15 zawieszenie, 16 pancerz i 18 to turbo, które jest przełączane zamiast ustawiane. Kolory, koła, neon i tint mają swoje własne native'i, takie jak SetVehicleColours, SetVehicleWheelType i SetVehicleNeonLightEnabled.
Pisanie tego ręcznie rzadko jest tego warte. To długie i biblioteka już obejmuje każdy przypadek. Używaj do jednej poprawki, a nie do garażu.
Zapisz do bazy danych
Właściwości są przechowywane jako tekst JSON w długiej kolumnie tekstowej. Zwykły przepływ to:
- Klient czyta właściwości z pojazdu.
- Wysyła je na serwer z tablicą.
- Serwer koduje i zapisuje je.
-- client
local props = lib.getVehicleProperties(vehicle)
TriggerServerEvent('my_garage:saveProps', props.plate, props)-- server
RegisterNetEvent('my_garage:saveProps', function(plate, props)
local src = source
-- check here that this player owns that plate before saving
MySQL.update('UPDATE owned_vehicles SET vehicle = ? WHERE plate = ?', {
json.encode(props), plate
})
end)To samo wezwanie na QBCore i QBox pisze kolumnę mods z player_vehicles. Nazwy kolumn są w artykule tabel garaży.
Ostrzeżenie: nigdy nie ufaj tablicy i właściwościom z klienta bez sprawdzenia własności na serwerze. W innym razie gracz może nadpisać pojazd kogoś innego. Zobacz zabezpieczanie zdarzeń serwera.
Przywróć, gdy pojazd się pojawia
Przeczytaj JSON, zdekoduj, a następnie zastosuj po istnieniu pojazdu na tym kliencie:
local row = MySQL.single.await('SELECT vehicle FROM owned_vehicles WHERE plate = ?', { plate })
local props = json.decode(row.vehicle)
-- send props to the client that owns the car, which applies:
lib.setVehicleProperties(vehicle, props)Zasady dla aplikowania:
- Pojazd musi istnieć i być załadowany. Zastosuj zaraz po
CreateVehicle, z czekaniem naDoesEntityExistdla sieciowych. Zobacz spawn pojazdu. - Model musi być taki sam. Właściwości innego modelu aplikują złe indeksy modów.
- Uruchamiaj to na kliencie, który ma kontrolę nad pojazdem. Aplikowanie z klienta, który go nie posiadł, może się nie powieść.
Powszechne problemy
Mody zgubione po przechowywaniu. Zapis ran po usunięciu samochodu, więc zapisałeś pustą tabelę. Przeczytaj właściwości najpierw, a następnie usuń.
Tablica zmienia się po przywróceniu. Zapisana tablica jest częścią właściwości. Jeśli spawn'ujesz z jedną tablicą i aplikujesz właściwości z inną, właściwości wygrywają. Upewnij się, że oba pasują, lub klucze i baza danych przestają się zgadzać.
Kolory są złe. Kolor niestandardowy jest przechowywany z własnymi wartościami RGB, które niektóre stare skrypty nie przywracają. Użyj bieżącej funkcji Twojego framework'u.
JSON zbyt duży lub nieprawidłowy. Kolumna vehicle musi być długim typem tekstowym, a dane muszą pochodzić z json.encode. Tabela z kluczami w mieszanym formularzu liczbowym i ciągowym można kodować jako listę zamiast obiektu, więc zawsze ładuj i porównuj jeden zapisany wiersz, gdy debugujesz.
Niestandardowe lub samochody dodatkami. Niestandardowe części modów zależą od meta modelu i jego stream'u. Jeśli część brakuje z modelu, indeks nic nie robi. Zobacz dodawanie samochodów dodatkami.
Lista kontrolna
| Objaw | Rozwiązanie |
|---|---|
| Samochód spawn'uje się zwyczajnie | Zastosuj właściwości po istnieniu pojazdu, za pomocą lib.setVehicleProperties lub funkcji framework'u |
SetVehicleMod nic nie robi |
Zadzwoń najpierw SetVehicleModKit(vehicle, 0) |
| Właściwości działają tylko na kliencie | Pobieranie i ustawianie działają na kliencie, zapisz wynik na serwerze |
| Tablica zmienia się po przywróceniu | Zachowaj tablicę we właściwościach i spawn identycznych |
| Każdy może nadpisać samochód | Sprawdzaj własność tablicy na serwerze przed zapisem |
| Mody zgubione na sklepie | Przeczytaj właściwości przed usunięciem pojazdu |
| QBox serwer | Użyj pary ox_lib |
Szybkie odpowiedzi
Dlaczego moje mody pojazdu się nie stosują po spawn'ie?
Mody są stosowane tylko raz, gdy mod kit jest ustawiony z SetVehicleModKit(vehicle, 0). Funkcje właściwości robią to dla Ciebie, ale ręczna pętla SetVehicleMod wymaga tego najpierw. Pojazd musi również istnieć i być załadowany.
Czy te funkcje działają na serwerze?
Nie. Pobieranie i ustawianie właściwości używa native'ów klienta, więc uruchamiaj je na kliencie i wyślij wynik na serwer, aby go zapisać.
Którą powinienem użyć na QBox?
Wersje ox_lib, lib.getVehicleProperties i lib.setVehicleProperties. QBox jest zbudowany wokół ox_lib, a te same funkcje również działają na serwerach ESX i QBCore, które uruchamiają ox_lib.
Skrypty bez tego problemu
Chameleon Paints82 lakiery kameleon zmieniające kolor, w jednym menu — klik i gotowe.Zobacz skrypt →
Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →
Car BombPodkładaj, wykrywaj i rozbrajaj bomby w autach — z telefonem-detonatorem i minigrą C4.Zobacz skrypt →