Garaż FiveM: owned_vehicles i player_vehicles, brakujące auta naprawione

Pojazdy brakujące z garażu? Jak działają tabele ESX owned_vehicles i QBCore player_vehicles, kolumny stored i state oraz SQL do naprawy aut utknięty na zewnątrz.

Typowe objawy:

text
You bought a car, and the garage says "No vehicles". Or the car was parked at the street, the server restarted, and it is gone.

Prawie każdy skrypt garażu czyta to samo: jedną tabelę z wierszem na własniony pojazd. Gdy samochód brakuje, wiersz jest zły, a nie skrypt. Ten artykuł wyjaśnia dwie standardowe tabele, co oznaczają kolumny stored i state oraz SQL, który naprawia zwykłe przypadki.

Dwie tabele

ESX używa owned_vehicles. QBCore i QBox używają player_vehicles. Nazwy są takie same na wszystkich serwerach, dokładne kolumny zależą od twojej wersji i skryptu garażu, więc najpierw spójrz na swoją:

sql
DESCRIBE owned_vehicles;
DESCRIBE player_vehicles;

ESX: owned_vehicles

Główne kolumny w ESX Legacy:

Kolumna Zawartość
owner Identyfikator ESX gracza
plate Tablica, unikalna na samochód
vehicle Tekst JSON z właściwościami pojazdu
type car, boat, aircraft...
stored 1 w garażu, 0 na świecie
job Ustawiona dla pojazdów pracy, inaczej pusta

Skrypty garażu dodają swoje kolumny, na przykład dla nazwy garażu lub stanu zajęcia.

QBCore i QBox: player_vehicles

Kolumna Zawartość
citizenid Postać, która posiada samochód
license Identyfikator licencji gracza
vehicle Nazwa modelu
hash Skrót modelu
mods Tekst JSON z właściwościami pojazdu
plate Tablica
garage Id garażu, do którego należy samochód
state 0 na zewnątrz, 1 w garażu, 2 zajęty
fuel, engine, body Ostatnie zapisane wartości

QBox używa tej samej tabeli z tymi samymi ideami. Inne kolumny, takie jak dane finansowe, różnią się.

Właściwości jako JSON

Kolumna vehicle na ESX i kolumna mods na QBCore przechowują wygląd i tunowanie samochodu jako JSON: kolory, modyfikacje, koła, tablicę, dodatki, neon i tak dalej. Garaż czyta je, gdy wysyłasz samochód, i zapisuje go ponownie, gdy go przechowujesz.

lua
-- when storing, on the client
local props = lib.getVehicleProperties(vehicle)
TriggerServerEvent('my_garage:store', plate, json.encode(props))

JSON musi być ważny. Jeśli skrypt napisał zepsuty ciąg, samochód nie można przywrócić i spawnie stock lub w ogóle. Artykuł na temat vehicle properties pokazuje, jak je budować i stosować.

Pojazdy brakujące z garażu

Uruchom to w kolejności.

1. Wiersz istnieje, ale należy do kogoś innego

Lista garażu filtruje po właścicielu. Jeśli wartość właściciela nie jest tą, którą serwer używa dla twojej postaci, wiersz jest niewidoczny:

sql
SELECT owner, plate, stored FROM owned_vehicles WHERE plate = 'MIC 001';
sql
SELECT citizenid, license, plate, state FROM player_vehicles WHERE plate = 'MIC 001';

Porównaj właściciela z twoją rzeczywistą postacią:

  • ESX: identyfikator w users.identifier dla tej postaci. Za pomocą skryptu multicharacter może nosić prefiks, taki jak char1:, a pojazd kupiony przed zainstalowaniem multicharacter ma starą wartość bez niego.
  • QBCore i QBox: citizenid w tabeli players.

Po zmianie frameworku, imporcie z innego serwera lub ręcznym wstawieniu, to jest najbardziej częsta przyczyna. Napraw to, wskazując wiersz na prawidłową wartość:

sql
UPDATE owned_vehicles SET owner = 'char1:abcdef...' WHERE plate = 'MIC 001';
UPDATE player_vehicles SET citizenid = 'ABC12345' WHERE plate = 'MIC 001';

Zamień wartości na rzeczywiste ze swoich tabel.

2. Stan utknął « na zewnątrz »

Samochód, który wysyłeś i który nigdy się nie wrócił, na przykład po awarii lub restarcie, pozostaje oznaczony jako na zewnątrz. Garaż wyświetla tylko przechowywane samochody.

ESX, ustaw flagę przechowywania z powrotem:

sql
UPDATE owned_vehicles SET `stored` = 1 WHERE `stored` = 0;

QBCore i QBox, ustaw stan na garaged:

sql
UPDATE player_vehicles SET state = 1 WHERE state = 0;

Ostrzeżenie: na żywym serwerze to również przechowuje samochody, które gracze prowadzą w tym momencie. Uruchom to przy starcie, lub ogranicz go za WHERE na jedną tablicę lub jednego właściciela.

Wiele serwerów automatycznie uruchamia czyszczenie takie jak to, gdy zasób się uruchamia, ponieważ po restarcie żaden pojazd nie może być na zewnątrz. Jeśli twój nie, możesz to robić sam:

lua
-- server side, runs when the garage resource starts
AddEventHandler('onResourceStart', function(resource)
    if resource ~= GetCurrentResourceName() then return end
    MySQL.update('UPDATE player_vehicles SET state = 1 WHERE state = 0')
end)

Zwróć uwagę na backticki wokół stored w zapytaniu ESX: stored to zarezerwowane słowo w MySQL i zawodzi bez nich. Niektóre skrypty wysyłają te samochody do stanu zajęcia zamiast do garażu, więc sprawdzić, czego oczekuje twój garaż.

3. Id garażu nie pasuje

W QBCore kolumna garage mówi, który garaż samochód w nim mieszka. Garaż nazwany w twojej konfiguracji, który nie jest w wierszu, lub zmieniony garaż, nic nie wyświetla. Wyświetl wartości w użyciu:

sql
SELECT garage, COUNT(*) FROM player_vehicles GROUP BY garage;

Ustaw samochody do garażu, który istnieje w twojej konfiguracji.

4. Typ samochodu nie pasuje

Skrypty garażu oddzielają samochody, łodzie i samoloty wg kolumny type lub klasy pojazdu. Łódź zapisana jako car nigdy się nie pojawia w garażu łodzi.

Tablice

Tablica łączy świat, bazę danych i klucze. Trzymaj te reguły:

  • Tablica jest unikalna na wiersz. Duplikat powoduje załadowanie złego samochodu.
  • Tablica ma co najwyżej 8 znaków w grze, kolumna może być dłuższa na ESX.
  • Spacje się liczą. MIC 001 i MIC001 to dwie tablice, więc używaj jednego formatu.

Dla kluczy, patrz vehicle keys.

Dodaj samochód do gracza przez SQL

Możesz dać pojazd poprzez wstawienie wiersza. Weź listę kolumn z twojego własnego DESCRIBE, ponieważ brakująca wymagana kolumna powoduje niewprowadzenie:

sql
INSERT INTO owned_vehicles (owner, plate, vehicle, type, `stored`)
VALUES ('identifier-here', 'MIC 001', '{"model":-1130810103,"plate":"MIC 001"}', 'car', 1);

model w JSON to skrót modelu, a nie nazwa. Twój framework lub twój garaż zwykle ma polecenie lub funkcję, która robi to prawidłowo, co jest bezpieczniejszą ścieżką, gdy istnieje.

Lista kontrolna

Objaw Naprawa
Garaż mówi brak pojazdów Sprawdzić, że owner lub citizenid pasuje twojej postaci
Samochód utknął na zewnątrz po awarii lub restarcie UPDATE przechowuwanej flagi lub state wstecz do garaged, idealnie przy starcie
Kupiony samochód się nie pojawia Sprawdzić wiersz istnieje, właściciela i garaż lub typ
stored zapytanie daje błąd składni Umieść backticki wokół stored
Samochód ładuje się bez modów Sprawdzić JSON vehicle lub mods jest ważny i nie pusty
Załadowuje się zły samochód Szukaj duplikatów tablic
Łódź lub samolot brakuje Sprawdzić kolumna type pasuje garażu

Szybkie odpowiedzi

Dlaczego mój samochód nie jest w garażu?

Albo wiersz nie jest połączony z twoją postacią (zły właściciel lub citizenid), albo samochód jest oznaczony jako na zewnątrz. Sprawdzić kolumnę właściciela i przechowuwaną lub kolumnę stanu w bazie danych.

Co oznacza state w player_vehicles?

W QBCore i QBox, state to liczba: 0 oznacza, że samochód jest na świecie, 1 oznacza, że jest w garażu, 2 oznacza, że jest zajęty. Samochód utknięty na 0 nie pojawia się na liście garażu.

Jak włożyć każdy samochód z powrotem do garażu?

Uruchom jedno UPDATE, które ustawia przechowaną flagę lub stan na wartość w garażu dla wierszy, które są na zewnątrz. Najlepiej uruchomić to przy starcie serwera, ponieważ żaden samochód nie może być naprawdę na zewnątrz po restarcie.

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